【问题标题】:Maven: How to have jar-with-dependencies exclude "provided" dependencies?Maven:如何让 jar-with-dependencies 排除“提供的”依赖项?
【发布时间】:2017-09-02 19:14:18
【问题描述】:

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

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

我尝试了这个问题的现有答案,例如Excluding “provided” dependencies from Maven assembly 但由于某种原因会产生不正确的依赖项选择,甚至丢失了主要代码。在这个 OP 中,我想找到一个更清洁、更新的解决方案来解决这个问题……有吗?

【问题讨论】:

标签: java scala maven


【解决方案1】:

使用不同的 maven 插件可能会更好。见Difference between maven plugins ( assembly-plugins , jar-plugins , shaded-pluginsShade 在这种情况下可能最适合您。您要创建的内容称为 uber-jar。

关于 Shade,来自 Maven 网站:

这个插件提供了将工件打包到 uber-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

一次合并多个 jars 不一定非常简单,因此 Shade 具有Resource Transformers 的概念(链接也有更多示例)。

只要没有重叠,将来自多个工件的类/资源聚合到一个 uber JAR 中是直接的。否则,需要某种逻辑来合并来自多个 JAR 的资源。这就是资源转换器发挥作用的地方。

project site 实际上相当不错。有很多不同的例子。

【讨论】:

    猜你喜欢
    • 2011-09-06
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多