繁体   English   中英

如何重新编译 jar 文件?

[英]How do you recompile a jar file?

我拿了一个旧的 jar 文件并对其进行了编辑。 现在我有一个包含所有文件的文件夹,我想将它们重新编译回 jar 文件。 我该怎么做呢?

Jar文件不是正常意义上的“编译”。 但是你只需用jar命令创建一个:

jar cvf myfile.jar file1 file2 etc

您可以正常使用globbing:

jar cvf ../myfile.jar *

运行jar -? 或阅读文档以获取更多信息。

请注意,对于可执行jar文件,您还需要指定清单文件。

你是怎么编辑的?

无论如何, jar文件遵循与常规zip文件相同的格式。 如果你想更新jar的内容(可能有一个新文件),你可以这样做:

jar -uf yourJar.jar  path/to/updated/Class.class 

那将使用文件path/to/updated/Class.class更新你的jar path/to/updated/Class.class如果在该路径中已经有一个具有该名称的类,它将被替换。 如果不是它将被创建。

在此之后你的罐子是最新的。

Jar文件通常包含已编译的java文件(类文件)和资源。 如果允许您对此jar进行更改,则可以使用JAD反汇编类文件,并在重新编译后使用命令jar再次组装它们

你是如何编辑jar文件,hex编辑器的?

jar文件只是一个带有一些额外文件的zip文件。 您可以使用任何zip实用程序来重新加入未加工的jar文件。

由于我无法完全重新编译 .jar 文件并使用我的应用程序,因此我想在这里分享之前答案中缺少的步骤。

在我的具体情况下,为了使事情尽可能简单,我只想修改反编译结果中的一个.java文件,并直接在.jar文件中进行更新。

我从Paulo Ebermann对类似问题回答开始,最终得到:

javac -source 8 -target 8 -d classdir -cp \
"\
path/to/dep1.jar; \
path/to/dep2.jar; \
path/to/myoriginal.jar \
" path/to/my/java/class.java

cd classdir
jar -uf path/to/myoriginal.jar path/to/my/java/class.class

笔记:

  • path/to/myoriginal.jar位于依赖项的路径中,这会强制 java 编译器在 original.jar 中查找丢失的类,而不是在本地文件中重新编译和编译更多依赖项和代码因此我故意省略了. class 路径列表中的路径
  • -source 8 -target 8是强制 class 为适当版本的运行时机器编译所需的。
  • -uf表示 jar 工具应仅使用提供的 class 更新文件

暂无
暂无

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

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