从 Java 中创建 uber jar(不使用 Maven 或 Gradle)

问题描述 投票:0回答:2

我想将几个 jar 组合成一个 Uberjar。

在 Java 中,我知道如何使用这两个工具来遮蔽依赖关系:

但是我有一个 Web 服务,需要获取动态类路径并从中创建 uberjar。但由于它实际上是一个后端服务器,Maven 和 Gradle 不是可供使用的工具。

从这些插件的源代码中可以看出,这不仅仅是构建包含所有内容的组合 zip 文件那么简单。您必须对重复资源进行一些解决,以及一些特殊的 log4j 缓存配置。

是否有一个 Java 库能够创建与 John Rengelman 的影子工具相同的功能,但无需实际从 Maven/Gradle 运行?

java maven gradle dependencies uberjar
2个回答
1
投票

实际上这很容易做到。

您创建一个

ZipArchiveOutputStream
并迭代每个 jar 文件。您可以随时将每个 jar“应用”到输出流。

但是 - 您必须确保排除这些文件:

  • 'META-INF/*.RSA'
  • 'META-INF/*.SF'
  • 'META-INF/*.DSA'

这有效,但会导致日志记录出现此问题:log4j2 ERROR StatusLogger 无法识别的转换说明符

然后你必须像此类一样正确处理 Log4j2 插件缓存文件:

https://github.com/edwgiz/maven-shaded-log4j-transformer/blob/master/src/main/java/io/github/edwgiz/log4j/maven/plugins/shade/transformer/Log4j2PluginCacheFileTransformer.java

这现在对我有用。


0
投票

您可以使用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>
© www.soinside.com 2019 - 2024. All rights reserved.