1

好的,这可能是一个熟悉的问题,但是我仍然感到困惑,我正在努力寻找一个真正阐明细节的答案。

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

我仍然不清楚这个插件如何响应范围,即哪些依赖项和传递依赖项包含在 WARs lib 文件夹中我的理解是,编译将导致包含一个 JAR 及其依赖项,这些依赖项也使用编译范围声明(以此类推递归),但是提供的责任停止了。具有提供范围的依赖项将不会被包含在内。

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

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

任何人都可以澄清,扩展,回答上述任何问题吗?任何输入将不胜感激。

更新除上述内容外,我还坚持做出决定。我是否应该允许将所需的 3rd 方 JAR 列表捆绑在 WAR 中,通过我们拥有的各种内部 Maven JAR 项目的编译范围依赖关系来解决。或者我应该声明内部 Maven JAR 项目中提供的所有 3rd 方依赖项,然后在 Maven WAR 项目上指定一个带有编译范围的明确集。

我更喜欢前一种方法,因为额外的第 3 方依赖项将通过传递依赖路径自动添加到 WAR 工件中。然而,第二种方法提供了确切知道将包含哪些 3rd 方库的确定性。

4

2 回答 2

1

在项目中排除带有标签pom.xml的依赖项:jar-amailexclusions

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

如果您的 3rd 方库依赖于不必要的库,那是您能做的最好的事情。如果它们是开源项目,您可以提交一个补丁来删除不必要的库。

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

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

我发现使用 40 多个 POM 并不太容易,但它仍然比以前必须手动下载每个依赖项更容易。

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

于 2011-10-04T13:32:28.713 回答
1

文档中讨论的主题在某种程度上是对我的问题的回答。它讨论了<dependencyManagement>标签的使用。

此标记可以在父 POM 文件中声明,并允许您指定依赖项的详细信息以及排除项。然后任何从父 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 继承了版本、排除和范围配置。这并不能解决我提到的所有问题,例如需要了解 3rd 方库的依赖项,但它确实提供了一个用于配置和管理这些更精细细节的地方。

于 2011-10-04T15:27:19.943 回答