当前位置: 首页 > 知识库问答 >
问题:

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

籍光熙
2023-03-14

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

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

  • https://maven.apache.org/plugins/maven-shade-plugin/
  • https://plugins.gradle.org/plugin/com.github.johnrengelman.shadow

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

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

有没有一个Java库能够创建和John Rengelman的shadow工具一样的东西,但实际上不需要从Maven/Gradle运行?

共有1个答案

司徒志强
2023-03-14

事实上,这很容易做到。

创建一个 Zip 存档输出流循环访问每个 jar 文件。您可以随时将每个罐子“应用”到输出流。

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

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

这可以工作,但会导致日志记录问题:log4j2错误状态记录器无法识别转换说明符

然后,您必须像该类一样正确处理Log4j2插件缓存文件:

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

这现在对我很有效。

 类似资料:
  • 我需要从我的应用程序中制作一个可执行的jar包。 这是我的pom.xml: 我用mvn clean package-DskipTests=true构建包,并通过java-jar运行它,我得到了以下结果: mvn--version Apache Maven 3.6.0(NON-CANONICAL_2018-11-06T03:14:22 01:00_root;2018-11-06T03:14:22 0

  • 问题内容: 使用Maven 3.1 Eclipse Helios Aspekt: 尝试使用maven-jar / dependency-plugins创建可运行的jar文件。 问题: 创建jar文件和依赖项后,当我尝试使用命令启动jar文件时出现NoCLassDefFoundErrors 但是类/文件可以在./dependency-jars文件夹中找到???我还尝试了以下命令: 这也不起作用。 题

  • 我正在尝试建立基于Maven的应用程序的jar文件。所以我不需要将外部jar库包含到我的构建中。我需要我的应用程序在运行时从本地maven存储库或从本地文件夹提供这种外部依赖,这些将包含这些外部库。我为此依赖项配置pom文件,如下所示: 并尝试使用前缀运行这个jar。我正在用这个答案。

  • 问题内容: 我有一个Maven项目,我想从中创建两个可执行的jar文件。一个将与用户交互使用,第二个将作为计划作业运行,读取前者生成的日志文件。最后,除了MANIFEST.MF文件中的Main- Class属性外,我希望两个jar文件都相同。 我正在使用maven-antrun- plugin创建一个可执行jar,在我尝试通过引入Maven配置文件尝试创建第二个jar文件之前,这似乎工作得很好。我

  • 你知道我该怎么做吗?

  • 当我尝试在windows上的命令行中运行“jar”命令时,遇到以下错误:“jar”不能识别为内部或外部命令 一般的解决方案似乎是我需要将jdk bin文件夹添加到环境变量中的路径中。我已经这样做了,我在路径变量中添加了以下内容:...;C:\Program Files\java\jdk1.8.0_40\bin\;