像spring这样的许多开源项目都包含多个模块,当在maven中添加这些模块作为依赖项时,我应该明确定义每个依赖项,或者只是让传递依赖项管理做它的事情。例如,以下两种情况中的哪一种是最佳做法。
案例1:包含我想要的最高级别功能
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.1.2.RELEASE</version>
</dependency>
案例2:将框架的每个部分都包含为显式依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.1.2.RELEASE</version>
</dependency>
.... other dependencies that are transitively resolved by maven
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.1.2.RELEASE</version>
</dependency>
最佳做法案例1或案例2是什么?为什么?
答案 0 :(得分:3)
这取决于您是否声明使用相同依赖项的任何其他依赖项(在本例中为Spring)。如果您需要的只是顶级依赖项,请声明。如果您正在使用依赖于传递依赖项的特定版本的其他依赖项,请将其声明为显式依赖项。
使用Spring作为示例:如果您声明spring-webmvc
然后决定需要另一个spring包,比如说spring-security
,那么明确定义它们都依赖的任何共享依赖项可能是个好主意。 on,只是让您知道项目中包含哪个版本。
基本上,声明您需要特定版本的任何内容,让maven处理其余内容,直到您需要排除版本或声明特定版本。这就是构建maven所要做的事情,所以让它管理依赖关系直到它做出错误的决定。
答案 1 :(得分:1)
我认为#1更好,因为从官方的 docs 来看,很明显spring-webmvc
取决于所有弹簧模块。
<!--
Spring MVC for Servlet Environments (depends on spring-core, spring-beans, spring-context, spring-web)
Define this if you use Spring MVC with a Servlet Container such as Apache Tomcat (org.springframework.web.servlet.*)
-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
您还可以查看 pom ,了解spring-webmvc
的所有依赖项是否依赖于相同的版本。
因此,我认为没有必要在你的pom中明确声明它们,至少对于这个用例。