我想将几个 jar 组合成一个 Uberjar。
在 Java 中,我知道如何使用这两个工具来遮蔽依赖关系:
但是我有一个 Web 服务,需要获取动态类路径并从中创建 uberjar。但由于它实际上是一个后端服务器,Maven 和 Gradle 不是可供使用的工具。
从这些插件的源代码中可以看出,这不仅仅是构建包含所有内容的组合 zip 文件那么简单。您必须对重复资源进行一些解决,以及一些特殊的 log4j 缓存配置。
是否有一个 Java 库能够创建与 John Rengelman 的影子工具相同的功能,但无需实际从 Maven/Gradle 运行?
实际上这很容易做到。
您创建一个
ZipArchiveOutputStream
并迭代每个 jar 文件。您可以随时将每个 jar“应用”到输出流。
但是 - 您必须确保排除这些文件:
这有效,但会导致日志记录出现此问题:log4j2 ERROR StatusLogger 无法识别的转换说明符
然后你必须像此类一样正确处理 Log4j2 插件缓存文件:
这现在对我有用。
您可以使用Nicholas提到的类,如下所示:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>${maven-shade-plugin.version}</version>
<executions>
<execution>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<!-- Maven Shade plugin to merge the log4j2 plugin cache files (Log4j2Plugins.dat) coming from different packages -->
<transformer implementation="io.github.edwgiz.log4j.maven.plugins.shade.transformer.Log4j2PluginCacheFileTransformer">
</transformer>
</transformers>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>io.github.edwgiz</groupId>
<artifactId>log4j-maven-shade-plugin-extensions</artifactId>
<version>${log4j.version}</version>
</dependency>
</dependencies>