【问题标题】:Merging Jar-files?合并 Jar 文件?
【发布时间】:2016-10-04 21:20:23
【问题描述】:

我已经找到了合并 jar 文件的不同描述,例如 Fat-jar。

但是我寻找了一个更简单的解决方案,如下例所示。

jar -cmvf ../manifest.m f MyJar.jar lib/*.jar

也许有人知道将两个或多个 jar 合并为一个的正确语法?

已合并,但文件无法执行。


将类添加到 JAR 文件的类路径

您可能需要从一个 JAR 文件中引用其他 JAR 文件中的类。

例如,在典型情况下,一个小程序被捆绑在一个 JAR 文件中,其清单引用了一个不同的 JAR 文件(或几个不同的 JAR 文件),该文件用作该小程序的实用程序。

您指定要包含在小程序或应用程序清单文件的 Class-Path 标头字段中的类。 Class-Path 标头采用以下形式:

Class-Path: jar1-name jar2-name directory-name/jar3-name

通过在清单中使用 Class-Path 标头,您可以避免在调用 Java 来运行应用程序时必须指定 long -classpath 标志。 注意:Class-Path 标头指向本地网络上的类或 JAR 文件,而不是 JAR 文件中的 JAR 文件或可通过 Internet 协议访问的类。要将 JAR 文件中的 JAR 文件中的类加载到类路径中,您必须编写自定义代码来加载这些类。例如,如果 MyJar.jar 包含另一个名为 MyUtils.jar 的 JAR 文件,则不能使用 MyJar.jar 清单中的 Class-Path 标头将 MyUtils.jar 中的类加载到类路径中。 一个例子

我们希望将 MyUtils.jar 中的类加载到类路径中,以便在 MyJar.jar 中使用。这两个 JAR 文件在同一个目录中。

我们首先创建一个名为 Manifest.txt 的文本文件,其内容如下:

Class-Path: MyUtils.jar

警告:文本文件必须以换行符或回车符结尾。如果最后一行没有以换行符或回车符结尾,则无法正确解析。

然后我们通过输入以下命令创建一个名为 MyJar.jar 的 JAR 文件:

jar cfm MyJar.jar Manifest.txt MyPackage/*.class

这会创建一个包含以下内容的清单的 JAR 文件:

Manifest-Version: 1.0
Class-Path: MyUtils.jar
Created-By: 1.7.0_06 (Oracle Corporation)

当您运行 MyJar.jar 时,MyUtils.jar 中的类现在会加载到类路径中。


【问题讨论】:

  • 为什么还要费心尝试合并罐子?这将为您带来什么?为什么不只是确保两个单独的 jar 文件都可以使用?
  • 我尝试合并它,因为我不关心包含库的文件夹,它必须与主 jar 位于同一文件夹中。谢谢

标签: java jar merge


【解决方案1】:

我不确定您要合并什么,但假设您的一些代码带有一个主类和一些简单的库,您可以将所有其他 jar 文件解压缩到同一目录,添加您的类,添加带有Main-Class: 标头的Manifest.mf 指向您的主类,然后将所有内容重新组合在一起。这样,您将覆盖所有包含的 jar 文件的清单,并且可能会覆盖多个 jar 中具有相同名称的其他文件,但您可以尝试一下。

你得到的是一个可以运行的 jar 文件

java -jar myfile.jar

并且Main-Class头中定义的类将作为入口点,它必须实现

public static void main(String[] args)

方法。

虽然我不推荐这样的解决方案,但还有其他方法可以帮助您完成这项任务。我知道即使这个解决方案也可以自动化,但你应该看看 maven(例如spring-boot:repackage)或其他构建工具。

【讨论】:

  • 我不知道在 Manifest 文件中为“classpath”写什么以及在哪里放置图片。但不知何故,我认为有人可以知道正确的语法,如 Oracle-doc 中所述。但是,我将阅读有关 maven-plugin 或其他构建工具的信息。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-19
  • 2011-07-02
  • 1970-01-01
  • 2013-08-28
  • 2023-03-20
  • 2013-09-30
  • 2020-09-01
相关资源
最近更新 更多