Maven WAR插件以及如何管理依赖项

时间:2011-10-04 11:24:39

标签: maven-2 dependencies war packaging maven-war-plugin

好吧,这可能是一个熟悉的问题,但我仍然感到困惑,我很难找到一个真正澄清细节的答案。

方案 我有几个Maven项目,大多数创建JAR文物,一个负责创建WAR artefact。 WAR artefact依赖于具有编译范围的JAR工件,以便这些JAR包含在WEB-INF / lib文件夹中。

困惑 我还不清楚这个插件如何响应范围,以确定哪些依赖项和传递依赖项包含在WARs lib文件夹中。我的理解是,编译将导致JAR被包含在其依赖项中,这些依赖项也是使用编译范围声明的(依此类推),但是buck提供了停止。不包括与提供范围的依赖关系。

问题 举一个具体的例子,WAR项目war-a依赖于具有编译范围的内部JAR项目jar-a。由于范围,jar-a将包含在WARs lib文件夹中。现在jar-a依赖于具有编译范围的第三方库log4j。由于其范围,log4j JAR也包含在lib文件夹中。但是...... log4j的依赖关系也是如此,例如邮件等。我想要log4j,但我不想要它的依赖关系。如果我使用提供的配置log4j,它的依赖关系将不会包括在内,但它本身也不会。

我已经考虑了选项,例如使用排除项,但是当有40多个内部JAR项目时,POM文件中有很多排除项。此外,要使用排除项,我需要了解第三方依赖项的具体知识,这是不必要的。

任何人都可以澄清,扩展,回答上述任何一个问题吗?任何输入都将非常受欢迎。

更新除此之外,我仍然坚持做出决定。我是否应该允许在WAR中捆绑所需的第三方JAR列表,通过我们拥有的各种内部Maven JAR项目的编译范围依赖性来解决。或者我应该声明内部Maven JAR项目中提供的所有第三方依赖项,然后在Maven WAR项目中指定一个带有编译范围的清除集。

我更喜欢前一种方法,因为额外的第三方依赖项将通过传递依赖路径自动添加到WAR artefact中。然而,第二种方法提供了确切知道第三方库将被包括在内的确定性。

2 个答案:

答案 0 :(得分:1)

pom.xml项目的jar-a中,使用mail标记排除exclusions依赖项:

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.x</version>
    <exclusions>
        <exclusion>
            <groupId>log4j</groupId> 
            <artifactId>mail</artifactId>
        </exclusion>
    </exclusions>
</dependency>

如果您的第三方lib依赖于不必要的库,那么您可以做到最好。如果它们是开源项目,您可以提交一个补丁,删除不必要的库。

关于'面向未来':如果您想要一个可重复的构建,您应该为您的依赖项声明确切的版本号,例如[1.0],这样在新版本发布时不会让maven更新它们。通过这种方式,第三方库永远不会更改其依赖项,因为您不会更新到依赖于其他库的新版本。当然,在将第三方库更新为新版本时,您也应该检查依赖项。

另一方面,功能测试应报告新版本库何时破坏您的应用程序。

我发现使用40多个POM并不容易,但是当你不得不手动下载每个依赖时,它仍然比以前更容易。

http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Transitive_Dependencies

答案 1 :(得分:1)

documentation中讨论的主题有点回答了我的问题。它讨论了<dependencyManagement>标记的使用。

此标记可以在父POM文件中声明,并允许您指定依赖项的详细信息以及排除项。然后,从父POM继承的任何POM都可以像往常一样声明依赖项,但它将继承父项的任何配置,除非被覆盖。

例如,采用父POM依赖关系配置:

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.15</version>
        <exclusions>
          <exclusion>
            <groupId>log4j</groupId>
            <artifactId>mail</artifactId>
          </exclusion>
        </exclusions>
        <scope>compile</scope>
      </dependency>   
    </dependencies>     
  </dependencyManagement>

现在,子POM中的依赖性变得更加简单:

  <dependencies>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
    </dependency>
  </dependencies>

这里,子POM继承了版本,排除和范围配置。这并没有解决我提到的所有问题,例如需要了解第三方库的依赖关系,但它确实为配置和管理这些更精细的细节提供了一个位置。