繁体   English   中英

从 Java 中创建一个超级 jar(不使用 Maven 或 Gradle)

[英]Creating an uber jar from within Java (NOT using Maven or Gradle)

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

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

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

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

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

实际上,这很容易做到。

您创建一个ZipArchiveOutputStream并遍历每个 jar 文件。 您将每个 jar “应用”到 output stream 就像您 Z34D1F91FB2E5714B857BZA1A89

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

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

这可行,但会导致日志记录出现此问题: log4j2 ERROR StatusLogger Unrecognized conversion specifier

然后你必须像 class 那样正确处理 Log4j2 插件缓存文件:

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

这现在对我有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM