好吧,这可能是一个熟悉的问题,但我仍然感到困惑,我很难找到一个真正澄清细节的答案。
方案 我有几个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中。然而,第二种方法提供了确切知道第三方库将被包括在内的确定性。
答案 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并不容易,但是当你不得不手动下载每个依赖时,它仍然比以前更容易。
答案 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继承了版本,排除和范围配置。这并没有解决我提到的所有问题,例如需要了解第三方库的依赖关系,但它确实为配置和管理这些更精细的细节提供了一个位置。