[英]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文件只是一个带有一些额外文件的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.