执行 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