首页IT科技maven依赖管理(Maven依赖管理)

maven依赖管理(Maven依赖管理)

时间2025-09-19 09:42:14分类IT科技浏览6122
导读:本文主要记录Maven依赖管理中关于依赖传递和依赖范围的知识...

本文主要记录Maven依赖管理中关于依赖传递和依赖范围的知识

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个规则来选择哪个包生效:

依赖层级浅的包会覆盖依赖层级深的包        。(示例中project2的log4j 1.2.13版本的依赖层级为1,1.2.14的依赖层级为2                        ,因此第一层的版本生效) 同层依赖中                         ,先声明的包版本生效        。 同pom.xml文件中,后声明的版本生效                         。

依赖隐藏

如果不希望别人在依赖我的包时知道我的包依赖了哪些其他的包                ,那么可以在引用依赖时将其标注为<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 provided解释:例如                        ,我们本地开发时使用了servlet-api 3.0版本进行调测                 ,但当我们要把代码部署到服务器的tomcat中时        ,服务器的tomcat不支持3.0版本的servlet-api                        ,它自带了自己的版本                         。如果我们把3.0版本打包进去                 ,由于3.0版本会先加载,就导致在服务器的tomcat中无法运行                         。 runtime解释:jdbc平时我们在使用的时候                        ,加载driver都是通过字符串的形式                         ,在代码中并没有真正引用过driver的内容,因此开发时可以不用引入需要依赖的driver                ,只要打包时把driver打进去就行了。

依赖范围的传递性

compile test provided runtime compile compile test provided runtime test provided runtime runtime test provided runtime

行表示本项目所依赖的包配置的scope                         ,列表示依赖包的依赖包的scope                。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
autorun.exe在哪里(autorun.exe进程是什么文件产生的 autorun进程信息查询)