【发布时间】:2015-09-08 15:03:26
【问题描述】:
TL;DR
当某些(特定)传递依赖项在 POM 文件中排除但程序集描述符设置为获取所有依赖项,排除的依赖项将被包括在内 在汇编中。 如何防止这种情况发生?
一点背景
有些依赖项可能难以处理,因为它们的 groupIds 和 artifactIds 几乎在每个版本中都会发生变化(在我的例子中是 bouncycastle)。
我正在检索 bouncycastle 的多个版本(138、1.38、1.45 和 1.50)。我的目的是消除1.50以外的所有版本。准确地说,我有一个依赖项(我们称之为some.perfectly.done:job),它导入1.50,另一个(how.many.castles:do-you-need)导入所有其他的。它们是企业依赖项,因此给您真正的 groupId:artifactId 不会帮助您进行测试。
pom.xml
我的依赖声明如下:
<dependency>
<groupId>some.perfectly.done</groupId>
<artifactId>job</artifactId>
</dependency>
<dependency>
<groupId>how.many.castles</groupId>
<artifactId>do-you-need</artifactId>
<exclusions>
<exclusion>
<groupId>org.bouncycastle</groupId>
<artifactId>*</artifactId>
</exclusion>
<exclusion>
<groupId>bouncycastle</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
程序集.xml
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
<id>bin</id>
<formats>
<format>zip</format>
</formats>
<!-- Adds dependencies to zip package under lib directory -->
<dependencySets>
<dependencySet>
<useProjectArtifact>false</useProjectArtifact>
<useTransitiveFiltering>true</useTransitiveFiltering>
<outputDirectory>lib</outputDirectory>
<outputFileNameMapping>${artifact.groupId}.${artifact.artifactId}-${artifact.version}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
<unpack>false</unpack>
</dependencySet>
</dependencySets>
<!-- ... -->
</assembly>
我得到了什么
$ ls *bouncycastle*
bouncycastle.bcmail-jdk14-138.jar org.bouncycastle.bcmail-jdk15on-1.50.jar org.bouncycastle.bcprov-jdk15-1.45.jar
bouncycastle.bcprov-jdk14-138.jar org.bouncycastle.bcpkix-jdk15on-1.50.jar org.bouncycastle.bcprov-jdk15on-1.50.jar
org.bouncycastle.bcmail-jdk14-1.38.jar org.bouncycastle.bcprov-jdk14-1.38.jar org.bouncycastle.bctsp-jdk14-1.38.jar
我的期望(和需要)
$ ls *bouncycastle*
org.bouncycastle.bcmail-jdk15on-1.50.jar org.bouncycastle.bcpkix-jdk15on-1.50.jar org.bouncycastle.bcprov-jdk15on-1.50.jar
一些可能的线索
这里答案的真正价值是找到一个真正的、通用的解决方案。我不是要解决我的案例,我想为所有有类似案例的人找到解决方案。
因此,我想避免一些可行但确实与特定情况相关的解决方案,并且通常需要将 POM 的逻辑复制到程序集描述符中。
但是,如果找不到更好的方法,这些线索可能会有所帮助。
在程序集描述符中重现排除模式
显然。但在我自己的情况下,这是非常不切实际的,除非巧妙地使用includes/excludes。这不是一个实用的解决方案。
制作几个依赖集
请注意,我知道this question has already been asked,但唯一的答案尝试对我的情况并不满意:
如果你有这样的事情,你需要定义两个dependencySet条目,其中一个包括logback [with
useTransitiveDependencies=false] 和其他。
使用maven-dependency-plugin
在the same question as above 上,有人提出了一种我可能会在没有问题的情况下使用的方法:首先使用dependency:copy-dependencies 将我的正确依赖项复制到一个临时目录,然后从该目录组装我的 zip。
作为一种变通方法,这可能是最有效的解决方案,因为它是通用的并且不会从程序集描述符中的 POM 中复制逻辑,尽管这会使构建时间更长。
附带问题:为什么?
为什么maven-assembly-plugin 会这样?我在文档中没有找到任何对此的参考。这是期望的行为,还是(已知/未知)错误?
【问题讨论】:
-
我刚刚看到你的帖子,我也遇到了同样的问题:stackoverflow.com/questions/41272126/…
标签: maven maven-3 maven-assembly-plugin