标签:maven maven排除依赖 maven归类依赖 maven优化依赖 maven坐标依赖总结
传递性依赖会给项目隐式地引入很多依赖,这极大地简化了项目依赖的管理。但是有些时候这种特性也会带来问题。例如,当前项目有一个第三方依赖,而这个第三方依赖由于某些原因依赖了另外一个类库的SNAPSHOT版本,那么这个SNAPSHOT就会成为当前项目的传递性依赖,而SNAPSHOT的不稳定性会直接影响到当前的项目。这时候需要排除掉该SNAPSHOT,并且在当前项目中声明该类库的某个正式发布版本。还有一些情况,你可能也想要替换某个传递性依赖,比如:sunJTA api,hibernate依赖于这个JAR,但是由于版权的因素。该类库不在中央仓库中,而apacheGeronimo项目有一个对应的实现。这时你就可以排除SunJTA API,再声明Geronimo和JTA API实现。
<project> <modelVersion>4.0.0</modelVersion> <groupId>com.juvenxu.mvnbook</groupId> <artifactId>project-a</artifactId> <version>1.0.0</version> <dependencies> <dependency> <groupId>com.juvenxu.mvnbook</groupId> <artifactId>project-b</artifactId> <version>1.0.0</version> <exclusions> <exclusion> <groupId>com.juvenxu.mvnbook</groupId> <artifactId>project-c</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.juvenxu.mvnbook</groupId> <artifactId>project-c</artifactId> <version>2.2.0</version> </dependency> </dependencies> </project>
上述代码中,项目A依赖于项目B,但是由于一些原因,不想引入传递性依赖C,而是自己显式地声明对于项目C1.1.0版本的依赖。代码中使用exclusions元素声明排除依赖,exclusions可以包含一个或多个exclusion子元素,因此可以排除一个或者多个传递性依赖。需要注意的是,声明exclusion的时候只需要groupId和artifactId,而不需要version元素,这是因为只需要groupId和artifactId就能唯一定位依赖图中的某个依赖。换句话说,maven解析后的依赖中,不可能出现groupId和artifactId相同,但是version不同的两个依赖。</p><p></p><h4>
1.2、 归类依赖</h4><div></div><p> 假如有个项目有很多关于SpringFramework的依赖,它们分别是org.springframework:spring-core:2.5.6、org.springframework:spring-bean:2.5.6、org.springframework:spring-context:2.5.6,它们是来自同一项目的不同模块。因此,所有这些依赖的版本会一起升级。因为它们版本是相同的,所以应该在一个唯一的地方定义版本,并且在dependency声明中引用这一版本。这样,在升级时只需要修改一处即可,例:
<project> <modelVersion>4.0.0</modelVersion> <groupId>com.juven.mvnbook.account</groupId> <artifactId>accout-email</artifactId> <version>1.0.0-SNAPSHOT</version> <properties> <springframework.version>1.5.6</springframework.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${springframework.version}</version> </dependency> </dependencies> </project>
这里简单用到了maven属性,首先使用properties元素定义maven属性,该例中定义了一个springframework.version子元素,其值为:2.5.6。有了这个属性定义之后,maven运行的时候会将POM中的所有的${springframework.version}替换成实际值:2.5.6。也就是说,可以使用美元符号和大括弧环绕的方式引用Maven属性。然后,将所有springframework依赖的版本值用这样一属性引用表示。
在软件开发过程中,程序员会通过重构等方式不断地优化自己的代码,使其变得更简洁、更灵活。同理,程序员也应该能够对maven项目的依赖了然于胸,并对其进行优化,如去除多余的依赖,显式地声明某些必要的依赖。
maven会自动解析所有项目的直接依赖和传递性依赖,并且根据规则判断每个依赖的范围,对于一些依赖冲突,也能进行调节,以确保任何一个构件只有唯一的版本在依赖中存在。在这些工作之后,最后得到的那些依赖被称为已解析依赖。可以运行如下命令查看当前项目的已解析依赖:
mvn dependency:list
在此基础上,还能进一步了解已解析依赖的信息。将直接在当前项目POM声明的依赖定义为顶层依赖,而这些顶层依赖的依赖定义为第二层依赖,以此类推,有第三,第四层依赖。当这些依赖经maven解析后,就会构成一个依赖树,通过这棵依赖树就能很清楚地看到某个依赖是通过哪条传递路径引入的。可以运行如下命令查看当前项目的依赖树:
mvn dependency:tree
使用dependency:list和dependency:tree可以帮助我们详细了解项目中所有依赖的具体信息,在此基础上,还有dependency:analyze工具可以帮助分析当前项目的依赖。我们运行如下命令:
mvn dependency:analyze
执行后的结果中重要的是两个部分。首先是Usedundeclared dependencies,意指项目中使用到的,但是没有显式声明的依赖。结果中还有一个重要的部分是:Unused declareddependencies,意指项目中未使用的,但是显式声明的依赖。
掌握坐标和依赖的概念、掌握坐标中各个元素的作用和定义的方式、掌握Maven依赖的范围、传递性、可选性。
标签:maven maven排除依赖 maven归类依赖 maven优化依赖 maven坐标依赖总结
原文地址:http://blog.csdn.net/crave_shy/article/details/40898299