ccran 的个人博客 ccran 的个人博客

记录精彩的程序人生

目录
Maven学习(2)
/    

Maven学习(2)

Maven学习(2)

在之前的Maven学习中,留下了Maven自动解决冲突的疑问。本次学习包括以下几点:

  • 依赖传递
  • 依赖排除exclusion
  • 依赖范围scope

一、依赖传递

1.1 依赖传递

<dependency>
    <groupId>com.ccran</groupId>
    <artifactId>a</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

c在pom文件中添加a的依赖,而a依赖于util1.0

maven会将util1.0也加入到项目中

maven_0

1.2 冲突处理策略

  1. 最短路径优先

maven_1

c依赖于util2.0与a,a依赖于util1.0

根据最短路径优先策略,c会选择util2.0作为依赖

  1. 最先声明优先
<groupId>com.ccran</groupId>
<artifactId>c</artifactId>
<version>1.0-SNAPSHOT</version>

<!-- 先声明a,然后声明b -->
<dependencies>
    <dependency>
        <groupId>com.ccran</groupId>
        <artifactId>a</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>com.ccran</groupId>
        <artifactId>b</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>

maven2.png

c依赖于a与b,a依赖于util1.0,b依赖于util2.0

在pom文件中,先声明a,然后再声明b,根据最先声明优先策略,c会选择util1.0作为依赖

二、依赖排除

以最先声明优先为例,c会选择util1.0作为依赖。

若想在不改变声明顺序的前提下使用util2.0作为依赖,可以在a模块中排除util1.0。

<dependency>
    <groupId>com.ccran</groupId>
    <artifactId>a</artifactId>
    <version>1.0-SNAPSHOT</version>
    <exclusions>
        <exclusion>
            <artifactId>util</artifactId>
            <groupId>com.ccran</groupId>
        </exclusion>
    </exclusions>
</dependency>

在SpringBoot中,自动配置类可能会根据某些依赖来进行自动配置,此时可以排除某些依赖来关闭自动配置

三、依赖范围

官方:Dependency scope is used to limit the transitivity of a dependency, and also to affect the classpath used for various build tasks.

依赖范围用于限制依赖项的传递性,也用于影响用于各种构建任务的类路径。

按个人理解,就是在项目的编译、测试、运行三个阶段中,需要哪些jar包。

<!-- hutool -->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.3.2</version>
    <scope>compile</scope>
</dependency>

<!-- junit -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

<!-- lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.10</version>
    <scope>provided</scope>
</dependency>
  1. hutool工具包,编译期需要(其他代码引用了hutool中相关工具类),测试期需要(测试用例测试hutool相关工具类方法),运行期需要(执行代码时需要hutool的字节码文件,否则抛出类找不到异常),因此使用默认范围compile(可不写)。
  2. junit只在测试时用到,因此scope使用test
  3. lombok用于在编译期,测试期生成pojo的getter、setter等方法,运行期不再需要,因此scope使用provided

四、依赖打入jar包

通过mvn package命令默认打成的jar包是不会将依赖的jar包导入的。

可以通过maven-assembly-plugin插件,将依赖的包打入到jar包中。

通过java -jar xxx命令则可以成功执行生成的jar包

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.0.0</version>
            <configuration>
                <archive>
                    <manifest>
                    	<!--主类(main方法所在的类)的全路径-->
                        <mainClass>xxx</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

标题:Maven学习(2)
作者:ccran
地址:https://ccran.online/articles/2020/05/06/1588742980002.html