我有一个Maven Scala项目,它将部署在某个容器上,因此用范围provided标记几个依赖项,这意味着这些依赖项将用于编译,但不会考虑传递解析,因为它们是“在运行时提供“。但是,当我运行以下命令时,它会生成带有依赖项的预期jar,但也包括那些标记为provided
的依赖项。
mvn clean install assembly:assembly -DdescriptorId=jar-with-dependencies -DskipTests
我尝试了对此问题的现有答案,例如Excluding “provided” dependencies from Maven assembly但由于某种原因产生了错误的依赖选择,甚至错过了主代码。在这个OP中,我想找到一个更清晰,更新的解决方案来解决这个问题...是否有一个?
答案 0 :(得分:2)
使用不同的maven插件可能会更好。见Difference between maven plugins ( assembly-plugins , jar-plugins , shaded-plugins。在这种情况下,Shade可能最适合您。您要创建的内容称为 uber -jar。
关于Shade,来自Maven网站:
这个插件提供了将工件打包在超级jar中的功能,包括它的依赖关系和阴影 - 即重命名 - 一些依赖项的包。
Shade插件的目标绑定到构建生命周期中的包阶段。
配置Shade插件:
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<!-- put your configurations here -->
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
...
</project>
请注意,默认实现会使用阴影版本替换项目的工件。需要两个?看这里:Attaching the Shaded Artifact
一次合并几个罐子不一定非常简单,所以Shade有Resource Transformers的概念(链接也有更多的样本)。
只要没有重叠,就可以将多个工件中的类/资源聚合成一个超级JAR。否则,需要某种逻辑来合并来自多个JAR的资源。这就是资源变压器的用武之地。
project site实际上相当不错。有很多不同的例子。