maven-assembly-plugin打包后缺失compile范围传递依赖batik-js-1.7.jar
解决maven-assembly-plugin打包时compile范围传递依赖缺失的问题
遇到这种传递依赖没被打包进去的情况,我之前也碰过几次,咱们一步步排查解决:
第一步:确认依赖的真实状态
首先得搞清楚batik-js-1.7.jar的scope到底是不是compile,有没有被意外修改或者排除:
- 运行更详细的依赖树命令,查看完整的依赖属性:
重点看mvn dependency:tree -Dverbosebatik-js那一行的scope标注,如果显示的不是compile,可能是传递过程中scope被上游依赖调整了(比如设成了provided或者optional)。 - 也可以用
mvn dependency:list命令,直接列出所有依赖及其scope,结果更直观。
第二步:检查maven-assembly-plugin的配置
大概率是插件的依赖收集规则出了问题:
- 打开你的assembly描述文件(一般是
src/main/assembly/xxx.xml),找到<dependencySets>部分:- 如果配置里明确写了
<scope>runtime</scope>,那compile范围的依赖会被过滤掉,改成<scope>compile</scope>或者直接删掉这个标签(默认会包含compile和runtime范围的依赖)。 - 检查有没有
<exclusions>规则不小心把batik-js排除了,这类配置要及时移除:<exclusion> <groupId>org.apache.xmlgraphics</groupId> <artifactId>batik-js</artifactId> </exclusion>
- 如果配置里明确写了
- 给个标准的依赖集配置示例参考:
<dependencySets> <dependencySet> <outputDirectory>lib</outputDirectory> <useProjectArtifact>false</useProjectArtifact> <!-- 不设置scope时,默认包含compile和runtime依赖 --> </dependencySet> </dependencySets>
第三步:排查是否是可选依赖导致的
如果上面两步都没问题,那很可能batik-transcoder把batik-js标记成了可选依赖(<optional>true</optional>),这种情况下Maven默认不会传递该依赖。
解决办法是在你的pom.xml里显式添加这个依赖:
<dependency> <groupId>org.apache.xmlgraphics</groupId> <artifactId>batik-js</artifactId> <version>1.7</version> <scope>compile</scope> </dependency>
验证解决效果
修改完配置后,执行mvn clean package,然后去输出目录(比如target/xxx-assembly/lib)里检查batik-js-1.7.jar是否存在。
如果还是有问题,可以先运行mvn dependency:copy-dependencies -DoutputDirectory=temp-deps,把所有依赖复制到临时目录:如果batik-js在里面,说明是assembly插件的配置问题;如果不在,那就是依赖本身的识别问题,回到第一步重新排查。
内容的提问来源于stack exchange,提问作者wazz
相关产品推荐
相关产品推荐

