有没有办法创建一个包含当前项目中的类的 jar 和一个仅包含外部库的阴影 jar?
我正在通过网络移动最终工件,如果没有外部依赖项更改,如果我只需要复制"苗条"jar,那就太好了。
Maven 已经通过 Maven Jar 插件生成您提到的细 jar(即提供项目中的类和资源的 jar(,默认情况下在打包阶段(即调用mvn clean package
,例如,或 mvn clean install
,在级联中也将调用package
阶段(。
如果你想生成一个额外的jar,只提供外部库,无论出于何种原因,你都可以使用Maven Shade插件。但是,默认情况下,它还将添加项目类和资源。
应用下面的配置,您将指示插件仅打包外部库并跳过项目类和资源:
<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
元素以避免插件的默认机制,该机制将用fat/uber jar(jar +依赖项(替换原始的默认jar(如上所述(。
根据官方文件:
着色项目 ID 的名称。如果要更改本机工件的名称,可以使用该设置。如果将其设置为 不同于 ,则不会执行任何文件替换
运行mvn clean package
,您将拥有默认的 jar 文件和一个仅包含外部依赖项并以only-dependencies
后缀结尾的附加 jar 文件(在 jar 扩展之前(。
此外,您可以考虑将上述整个配置包装在配置文件中,以避免将此行为作为默认构建的一部分(推荐(。
只需在包装配置文件中移动上面的配置,如下所示:
<profiles>
<profile>
<id>assemble-external-jars</id>
<build>
....
</build>
</profile>
</profiles>
然后通过以下方式运行它(在需要时(:
mvn clean package -Passemble-external-jars