本文主要记录Maven依赖管理中关于依赖传递和依赖范围的知识
创建3个maven项目,分配依赖log4j 1.2.12
, 1.2.13
, 1.2.14
版本。
<!--项目1-->
<groupId>com.leo</groupId>
<artifactId>project1</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
</dependencies>
<!--项目2-->
<groupId>com.leo</groupId>
<artifactId>project2</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.13</version>
</dependency>
</dependencies>
<!--项目3-->
<groupId>com.leo</groupId>
<artifactId>project3</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
</dependencies>
此时三个项目的依赖关系如图所示,三个项目分别依赖了不同版本的log4j。
现在我们构造这样一种情况,project3依赖log4j和junit,project2依赖log4j和project3,maven配置如下:
<!--项目2-->
<groupId>com.leo</groupId>
<artifactId>project2</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.13</version>
</dependency>
<dependency>
<groupId>com.leo</groupId>
<artifactId>project3</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<!--项目3-->
<groupId>com.leo</groupId>
<artifactId>project3</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
此时project2和project3的依赖关系如图:
此时project2的依赖关系中出现了project3以及project3所依赖的包。对于project2来说,此时不光可以使用project3,也可以使用project3所以来的junit包。
同时我们注意到,project3依赖了1.2.14
版本的log4j,这与project2本身所依赖的1.2.13
版本冲突了。
此时Maven会使用如下3个规则来选择哪个包生效:
1.2.13
版本的依赖层级为1,1.2.14
的依赖层级为2,因此第一层的版本生效)如果不希望别人在依赖我的包时知道我的包依赖了哪些其他的包,那么可以在引用依赖时将其标注为<optional>true</optional>
,这样别人在使用这个包时,就不会看到这个包依赖的包。
<!--项目2-->
<groupId>com.leo</groupId>
<artifactId>project2</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.13</version>
</dependency>
<dependency>
<groupId>com.leo</groupId>
<artifactId>project3</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<!--项目3-->
<groupId>com.leo</groupId>
<artifactId>project3</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<optional>true</optional>
</dependency>
</dependencies>
这样配置后,依赖关系如下图所示
可以看到在project2中是无法看到project3所依赖的junit包的。当然也就无法通过依赖传递的方式使用到junit包。
当我们引用别人的包时,别人的包中某些依赖我们不想引入自己的项目,那我们可以使用如下方式排除间接依赖的包。
<!--项目2-->
<groupId>com.leo</groupId>
<artifactId>project2</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.13</version>
</dependency>
<dependency>
<groupId>com.leo</groupId>
<artifactId>project3</artifactId>
<version>1.0-SNAPSHOT</version>
<!--排除不想依赖的包-->
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!--项目3-->
<groupId>com.leo</groupId>
<artifactId>project3</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
如此配置后的依赖关系如图:
可以看到project2中没有引入project3所依赖的log4j。
引入依赖时,可以指定依赖包的生效范围
scope | 主代码 | 测试代码 | 打包 | 范例 |
---|---|---|---|---|
compile(默认) | Y | Y | Y | log4j |
test | Y | junit | ||
provided | Y | Y | servlet-api | |
runtime | Y | jdbc |
compile | test | provided | runtime | |
---|---|---|---|---|
compile | compile | test | provided | runtime |
test | ||||
provided | ||||
runtime | runtime | test | provided | runtime |
行表示本项目所依赖的包配置的scope,列表示依赖包的依赖包的scope。
添加Maven依赖 org.springframework.boot spring-boot-starter-data-mongodb 配置Mongodb连接