2017-04-07 253 views
0

我有一个将部署在某个容器上的Maven Scala项目,因此标记了几个依赖关系,范围为provided这意味着这些依赖关系将用于编译,但由于它们是“在运行时提供的”,因此它们不会被考虑用于传输解析。但是,当我运行以下命令时,它会生成具有依赖项的目标jar,但也包括那些标记为provided的依赖项。Maven:如何让jar-with-dependencies排除“提供的”依赖关系?

mvn clean install assembly:assembly -DdescriptorId=jar-with-dependencies -DskipTests 

我试图现有回答这个问题,例如Excluding “provided” dependencies from Maven assembly但由于某种原因会产生不正确的依赖关系选项,甚至缺少主代码。在这个OP中,我希望找到一个更清洁,更新的解决方案来解决这个问题......有没有一个?

+1

你可能会更好使用不同的Maven插件。请参阅[Maven插件(装配插件,jar插件,阴影插件)之间的区别](http://stackoverflow.com/questions/38548271/difference-between-maven-plugins-assembly-plugins-jar-plugins-shaded -plugi)。 [阴影](https://maven.apache.org/plugins/maven-shade-plugin/)在这种情况下很可能适合你。 –

+0

@JonSampson谢谢!它确实有效!你能否重新格式化你的评论作为答案,我会接受 –

+0

很高兴为你效劳!我发布了一个更值得(我希望)的答案。 –

回答

2

用不同的maven插件可能会更好。见Difference between maven plugins (assembly-plugins , jar-plugins , shaded-plugins。在这种情况下,Shade很可能适合你。你正在寻找的东西是指一个超级大的-jar。

关于阴影,从Maven的网站:

此插件提供打包的神器在尤伯杯罐子的能力,包括它的依赖和遮阳 - 即重命名 - 一些依赖的包。

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还算是不错的。有很多不同的例子。