【问题标题】:Shaded jar only with external libraries仅带有外部库的阴影 jar
【发布时间】:2016-05-14 06:42:39
【问题描述】:

我想问关于 Maven Shade 插件的问题。有没有办法创建一个包含当前项目中的类的 jar 和一个仅包含外部库的阴影 jar?

我正在通过网络移动最终的工件,如果我只需要在没有外部依赖项发生变化的情况下复制“slim”jar,那就太好了。

【问题讨论】:

    标签: maven maven-3 maven-shade-plugin


    【解决方案1】:

    默认情况下,Maven 已经通过Maven Jar Pluginpackage 阶段(即调用mvn clean package ,例如,或mvn clean install,在级联中也将调用package 阶段)。

    如果您想生成一个仅提供外部库的附加 jar,无论出于何种原因,您都可以使用 Maven Shade Plugin。但默认情况下,它还会添加您的项目类和资源。

    应用下面的配置,您将指示插件仅打包外部库并跳过您的项目类和资源:

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.4.3</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <artifactSet>
                                <excludes>
                                    <exclude>${project.groupId}:${project.artifactId}:*</exclude>
                                </excludes>
                            </artifactSet>
                            <finalName>${project.artifactId}-${project.version}-only-dependencies</finalName>
                            <shadedArtifactAttached>false</shadedArtifactAttached>
                            <createDependencyReducedPom>false</createDependencyReducedPom>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    

    注意exclude 元素,它实际上是在跳过您的项目内容。

    此外,finalName 元素需要配置,以避免插件的默认机制将原来的默认 jar(如上所述)替换为 fat/uber jar(jar + 依赖项)。
    根据official documentation

    阴影 artifactId 的名称。如果您想更改本机工件的名称,可以使用该设置。如果设置为不同于 的值,则不会执行文件替换

    运行mvn clean package,然后您将拥有默认的 jar 文件和一个仅包含外部依赖项并以 only-dependencies 后缀(在 jar 扩展名之前)结尾的附加 jar 文件。


    此外,您可以考虑将上面的整个配置包装在 profile 中,以避免将此行为作为默认构建的一部分(推荐)。

    只需将上面的配置移动到包装配置文件中,如下所示:

    <profiles>
        <profile>
            <id>assemble-external-jars</id>
            <build>
               ....
            </build>
        </profile>
    </profiles>
    

    然后通过以下方式运行它(如果需要):

    mvn clean package -Passemble-external-jars
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-29
      • 1970-01-01
      • 2012-08-21
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 2018-10-22
      相关资源
      最近更新 更多