如何让maven-assembly-plugin尊重pom.xml中定义的排除项?

时间:2015-09-08 15:03:27

标签: maven maven-3 maven-assembly-plugin

TL; DR

当某些(特定)传递依赖项在POM文件中排除程序集描述符设置为获取所有依赖项时,将包含排除的依赖项在汇编中。 如何防止这种情况?

一点背景

有些依赖项可能很难处理,因为它们的groupIds和artifactId几乎在每个版本中都有变化(在我的例子中,是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>

assembly.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条目,其中包括logb​​ack [with useTransitiveDependencies=false]和其他。

khmarbaise

使用maven-dependency-plugin

the same question as above上,如果没有提出问题,我可以使用一种方法:首先使用dependency:copy-dependencies将正确的依赖项复制到临时目录,然后从此目录中汇编我的zip。

作为一种解决方法,这可能是最有效的解决方案,因为它是通用的,不会在程序集描述符中复制POM中的逻辑,但这会使构建更长。

附带问题:为什么?

maven-assembly-plugin为何如此表现?我在文档中没有找到任何对此的引用。是期望的行为,还是(已知/未知)错误?

2 个答案:

答案 0 :(得分:2)

现在就面对同样的问题,Maven程序集插件似乎不使用通配符(*)来表示排除,请参阅MASSEMBLY-762MASSEMBLY-861MASSEMBLY-675。从上一个JIRA问题开始,问题将在插件的3.1.1版本中得到解决(请参阅commit)。在撰写本文时,3.1.1版本尚未发布:3.1.0是最新版本。

希望以前的版本可以解决问题。

为此,只需声明正确的排除工件而不是*,并且它可以正常工作。列出所有被排除的依赖项可能会很痛苦,但至少我认为这是一个比接受的更好的解决方案(更少调整Maven阶段),特别是在具有交叉依赖性的多模块项目(我的情况)。此外,通过这样做,您可以更好地控制依赖关系。

希望有所帮助,等待3.1.1版! :)

答案 1 :(得分:0)

我遇到了与spring maven项目相同的问题。查看pom.xml文件,我有以下两个bouncycastle依赖项。

<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.50</version>
</dependency>
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcpkix-jdk15on</artifactId>
    <version>1.50</version>
</dependency>

我能够安全地删除bcprov-jdk15on依赖块,因为似乎没有任何依赖块,因为后续构建成功,但问题仍然存在。所以我在2.6中的pom.xml文件中将依赖插件版本更新为2.10之后运行了以下maven命令。

mvn dependency:tree -Dverbose -Dincludes=bouncycastle

这给出了输出:

[INFO] ------------------------------------------------------------------------
[INFO] Building dhtexasAdmin 1.0
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-dependency-plugin:2.10:tree (default-cli) @ dhtexasAdmin ---
[WARNING] Using Maven 2 dependency tree to get verbose output, 
[INFO] com.dhtexasadmin:dhtexasAdmin:war:1.0
[INFO] \- org.xhtmlrenderer:core-renderer:jar:R8pre2:compile
[INFO]    \- com.lowagie:itext:jar:2.1.0:compile
[INFO]       +- bouncycastle:bcmail-jdk14:jar:136:compile
[INFO]       \- bouncycastle:bcprov-jdk14:jar:136:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.324 s
[INFO] Finished at: 2017-04-21T16:58:52+01:00
[INFO] Final Memory: 16M/39M
[INFO] ------------------------------------------------------------------------

所以我必须在xhtmlrenderer部分添加bcprov-jdk14的排除,如下面的示例Maven Dependency Exclusions

<dependency>
    <groupId>org.xhtmlrenderer</groupId>
    <artifactId>core-renderer</artifactId>
    <version>R8pre2</version>
    <exclusions>
        <exclusion>
            <artifactId>bcprov-jdk14</artifactId>
            <groupId>bouncycastle</groupId>
        </exclusion>
    </exclusions>
</dependency>

之后mvn clean后跟mvn package就可以了。