执行 maven-assembly-plugin 后输出中缺少依赖项

Posted

技术标签:

【中文标题】执行 maven-assembly-plugin 后输出中缺少依赖项【英文标题】:Dependency is missed in output after maven-assembly-plugin executed 【发布时间】:2018-04-02 15:15:24 【问题描述】:

我在使用 maven-assembly-plugin 时遇到问题。

我想在打包阶段获得一个包含所有项目依赖项的目录。 但是我有一个编译范围的传递依赖,这是从 汇编输出目录。

漏掉的jar是batik-js-1.7.jar。这是这个jar的依赖树

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ sbercap-dependencies ---
[INFO] ru.spi2.test:sbercap-dependencies:jar:1.0-SNAPSHOT
[INFO] \- org.apache.xmlgraphics:batik-transcoder:jar:1.7:compile
...
[INFO]    +- org.apache.xmlgraphics:batik-bridge:jar:1.7:compile
[INFO]    |  +- org.apache.xmlgraphics:batik-anim:jar:1.7:compile
[INFO]    |  +- org.apache.xmlgraphics:batik-css:jar:1.7:compile
[INFO]    |  +- org.apache.xmlgraphics:batik-ext:jar:1.7:compile
[INFO]    |  +- org.apache.xmlgraphics:batik-parser:jar:1.7:compile
[INFO]    |  +- org.apache.xmlgraphics:batik-script:jar:1.7:compile
[INFO]    |  |  \- org.apache.xmlgraphics:batik-js:jar:1.7:compile
...

组装插件完成后,其他依赖项(batik-anim-1.7.jar, batik-css-1.7.jar) 成功添加到输出目录。 batik-js-1.7.jar 错过了(附截图)。

另一方面,如果我尝试使用 maven-dependency-plugin 复制所有依赖项, batik-js-1.7.jar 成功添加到文件夹中(截图 随附的)。

这是我的依赖项和来自 pom.xml 的构建块

<dependencies>
    <dependency>
        <groupId>org.apache.xmlgraphics</groupId>
        <artifactId>batik-transcoder</artifactId>
        <version>1.7</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>
                            $project.build.directory/dependency-libs
                        </outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.1.0</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <descriptors>
                    <descriptor>src/main/assembly/assembly-descriptor.xml</descriptor>
                </descriptors>
            </configuration>
        </plugin>
    </plugins>

</build>

程序集描述符是

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">

    <id>assembly</id>
    <formats>
        <format>dir</format>
    </formats>

    <dependencySets>
        <dependencySet>
        </dependencySet>
    </dependencySets>


</assembly>

你能解释一下,我做错了什么吗?为什么错过了这个图书馆 来自汇编输出?

我试图在谷歌中找到任何类似的问题,但还有另一个问题 - 来自测试范围的依赖关系或 pom.xml 中缺少的依赖关系。依赖集 useTransitiveDependencies 属性默认为true,所以我不太清楚 为什么我得到这个汇编插件的结果。

我的 Maven 版本:

Apache Maven 3.5.3 (3383c37e1f9e9b3bc3df5050c29c8aff9f295297; 2018-02-24T22:49:05+03:00)
Maven home: C:\soft\apache-maven-3.5.3\bin\..
Java version: 1.8.0_131, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.8.0_131\jre
Default locale: ru_RU, platform encoding: Cp1251
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"

maven-assembly-plugin 版本是 3.1.0

你能帮帮我吗?

谢谢。

【问题讨论】:

【参考方案1】:

如果此依赖项是在循环依赖项中声明的,则使用 maven-assembly-plugin 添加传递依赖项会出现问题。

https://issues.apache.org/jira/projects/MASSEMBLY/issues/MASSEMBLY-782

org.apache.xmlgraphics:batik-...:1.7 在 batik-bridge 和 batik-script 之间存在循环依赖关系。

您可以选择几个选项来解决这个问题。

    更新到新版本的 batik-... 库,它没有任何循环依赖。

    如果你不能使用前面的选项,你可以配置 pom.xml - 排除循环依赖并提取它们以使此依赖项具有非传递性。

    <dependencies>
    <dependency>
        <groupId>internal-module-groupId</groupId>
        <artifactId>internal-module-artifactId</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.apache.xmlgraphics</groupId>
                <artifactId>batik-bridge</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.apache.xmlgraphics</groupId>
                <artifactId>batik-script</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.apache.xmlgraphics</groupId>
        <artifactId>batik-script</artifactId>
        <version>1.7</version>
    </dependency>
    <dependency>
        <groupId>org.apache.xmlgraphics</groupId>
        <artifactId>batik-bridge</artifactId>
        <version>1.7</version>
    </dependency>
    </dependencies>
    

感谢来自 maven 用户邮件列表的 Thorsten Heit 的帮助。

【讨论】:

以上是关于执行 maven-assembly-plugin 后输出中缺少依赖项的主要内容,如果未能解决你的问题,请参考以下文章

通过 maven-assembly-plugin 打包在 jar 中包含 spring xml

maven-assembly-plugin 进行打包

maven-assembly-plugin自定义打包

maven-assembly-plugin的使用

无法使用 maven-assembly-plugin 设置最终的 jar 名称

java 使用maven-assembly-plugin创建jar存档