Maven:如何让jar-with-dependencies排除“提供”依赖项?

时间:2017-04-07 11:55:16

标签: java scala maven

我有一个Maven Scala项目,它将部署在某个容器上,因此用范围provided标记几个依赖项,这意味着这些依赖项将用于编译,但不会考虑传递解析,因为它们是“在运行时提供“。但是,当我运行以下命令时,它会生成带有依赖项的预期jar,但也包括那些标记为provided的依赖项。

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

我尝试了对此问题的现有答案,例如Excluding “provided” dependencies from Maven assembly但由于某种原因产生了错误的依赖选择,甚至错过了主代码。在这个OP中,我想找到一个更清晰,更新的解决方案来解决这个问题...是否有一个?

1 个答案:

答案 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实际上相当不错。有很多不同的例子。