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

Cho*_*hop 9 maven-3 maven 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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

我得到了什么

$ 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
Run Code Online (Sandbox Code Playgroud)

我期望(和需要)

$ ls *bouncycastle*
org.bouncycastle.bcmail-jdk15on-1.50.jar  org.bouncycastle.bcpkix-jdk15on-1.50.jar  org.bouncycastle.bcprov-jdk15on-1.50.jar
Run Code Online (Sandbox Code Playgroud)

一些可能导致建立

在这里回答的真正价值是找到一个真正的,通用的解决方案.我不打算解决我的问题,我想为所有有类似案例的人找一个解决方案.

因此,我想避免一些可行的解决方案,但这些解决方案确实与特定情况有关,并且通常需要将POM的逻辑复制到汇编描述符中.

然而,如果找不到更好的东西,这些可能会有所帮助.

在程序集描述符中重现排除模式

明显.在我自己的情况下,除了智能使用includes/ 之外,非常不切实际excludes.这不是一个实际的解决方案.

制作几个依赖集

请注意,我知道这个问题已被提出,但对于我的案例,唯一的答案是不能令人满意的:

如果你有这样的东西,你需要定义两个dependencySet条目,其中包括logb​​ack [with useTransitiveDependencies=false]和其他.

(由khmarbaise提供)

使用 maven-dependency-plugin

与上述相同的问题上,我提出了一种方法,如果没有问题,我可以使用它:首先使用dependency:copy-dependencies将我正确的依赖项复制到临时目录,然后从这个目录中汇编我的zip.

作为一种解决方法,这可能是最有效的解决方案,因为它是通用的,而不是在汇编描述符中复制POM中的逻辑,尽管这会使构建更长.

问题:为什么?

为什么maven-assembly-plugin这样做?我在文档中没有找到任何对此的引用.是期望的行为,还是(已知/未知)错误?

Cho*_*hop 6

使用 maven-dependency-plugin

虽然不是我想要的最终解决方案,但这可能会帮助那些处于紧急状态的人们.

的pom.xml

在POM中,定义以下属性(根据您的首选项调整路径):

<properties>
    <!-- ... -->
    <assembly.lib.directory>${project.build.directory}/lib</assembly.lib.directory>
    <!-- ... -->
</properties>
Run Code Online (Sandbox Code Playgroud)

在该<build/>部分:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${assembly.lib.directory}</outputDirectory>
                        <overWriteReleases>false</overWriteReleases>
                        <overWriteSnapshots>false</overWriteSnapshots>
                        <overWriteIfNewer>true</overWriteIfNewer>
                        <prependGroupId>true</prependGroupId>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <descriptors>
                    <descriptor>src/main/assembly/assembly.xml</descriptor>
                </descriptors>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
Run Code Online (Sandbox Code Playgroud)

assembly.xml

这个想法被替换dependencySetfileSet:

<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 -->
    <fileSets>
        <fileSet>
            <directory>${assembly.lib.directory}</directory>
            <outputDirectory>lib</outputDirectory>
        </fileSet>

        <!-- ... -->
    </fileSets>
</assembly>
Run Code Online (Sandbox Code Playgroud)

编辑:为强调user716401,这是更好地执行dependencies:copy-dependenciesprepare-package阶段,以确保它之前运行assembly:single.


nor*_*bjd 4

编辑

版本3.1.1已于maven-assembly-plugin 2019 年 1 月 1 日发布。它解决了我在下面的回答中提到的 JIRA 问题(保留历史记录或供无法升级插件的用户使用)。在此版本中,maven-assembly-plugin 现在支持依赖项排除中的通配符。只需升级插件即可。

maven-assembly-plugin版本 <= 3.1.0的答案

Maven 程序集插件(版本<= 3.1.0 )似乎不支持使用通配符(*)的排除,请参阅MASSEMBLY-762MASSEMBLY-861MASSEMBLY-6753.1.1从上一个 JIRA 问题开始,该问题将在插件版本中得到解决(参见commit)。在撰写本文时,该3.1.1版本尚未发布:3.1.0是最新版本

希望版本 <= 3.1.0 可以解决该问题。

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

希望对你有帮助,等待3.1.1版本!:)