【问题标题】:Creating an uber jar from within Java (NOT using Maven or Gradle)从 Java 中创建一个 uber jar(不使用 Maven 或 Gradle)
【发布时间】:2022-01-26 12:18:56
【问题描述】:

我想将几个罐子合并成一个 Uberjar。

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

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

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

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

【问题讨论】:

  • “但由于它实际上是一个后端服务器,Maven 和 Gradle 不是可供使用的工具。”。实际上没有什么可以阻止您的后端服务器安装 Maven 或 Gradle。
  • 嗯,在生产服务器上安装编译工具被认为是一种安全风险,所以我理解你为什么不想这样做。
  • 是的,我也是这么想的@Kayaman。这会有点奇怪,但最终我认为这是可行的。不过最后的手段。

标签: java maven gradle dependencies uberjar


【解决方案1】:

实际上这很容易做到。

您创建一个ZipArchiveOutputStream 并遍历每个jar 文件。您可以随时将每个 jar 文件“应用”到输出流中。

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

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

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

那么你必须像这个类一样正确处理 Log4j2 插件缓存文件:

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

这对我有用。

【讨论】:

    猜你喜欢
    • 2016-12-30
    • 2015-06-19
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 2016-11-03
    • 2018-10-05
    相关资源
    最近更新 更多