许多开源项目(如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?为什么?
发布于 2012-10-21 06:08:54
这取决于您是否声明使用相同依赖项的任何其他依赖项(在本例中是Spring)。如果您所需要的只是顶层依赖项,请声明这一点。如果使用依赖于传递依赖的特定版本的其他依赖项,则将其声明为显式依赖项。
以Spring为例:如果声明spring-webmvc,然后决定需要另一个spring包,比如spring-security,那么明确定义它们都依赖的任何共享依赖关系可能是个好主意,这样您就可以知道项目中包含了哪个版本。
基本上,声明任何您需要的特定版本的内容,并让maven负责其余的事务,直到您需要排除版本或声明特定版本为止。这就是构建maven的目的,所以让它管理依赖关系,直到它做出错误的决定。
发布于 2012-10-21 06:22:34
我认为#1更好,因为从官方的文档中可以清楚地看到,spring-webmvc依赖于所有spring模块。
<!--
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中显式地声明它们,至少对于这个用例是这样的。
https://stackoverflow.com/questions/12995163
复制相似问题