什么时候应该明确定义maven中的转换依赖?

时间:2012-10-21 05:10:08

标签: maven maven-3

像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是什么?为什么?

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中明确声明它们,至少对于这个用例。