我有一个较旧的 Jar 文件,我必须对其进行修改才能使其正常工作。 我已经用jd-gui反编译了它,并更改了需要更改的部分。我现在想知道我必须做什么才能拿回一个罐子? 我想我必须添加库,但是没有额外的 lib 目录。
如何将所有内容放在一起?
@斯蒂芬C “因此,当您进行更改并重新编译时,生成的“.class”文件可能会出现意外的情况” 这究竟有何相关性?我只想要 Jar 文件的功能,而不想要它的 1:1 副本。
Jar 文件未签名。签署 Jar 文件的具体原因是什么?如果我从另一个程序启动它?
如果反编译整个 jar 后缺少依赖项,则可能意味着该 jar 不包含它们。创建 jar 时,您可以选择不包含依赖项,但这假设它们在运行时在类路径上可用。运行原始jar时检查是否与类路径上的其他jar文件有任何关系。有关如何实现此目标的详细信息,请参阅此答案。一旦确定了所有依赖项,您就可以从 IDE(例如 IntelliJ/Eclipse)或从 命令行轻松编译 jar。
作为旁注,如果您想对 jar 进行的更改很小或孤立,我建议编辑字节码(对于小编辑来说更容易)。我更喜欢这个字节码编辑器。
如果代码的某些部分反编译失败,则重新编译后将无法恢复 jar 的功能。在这种情况下,我建议您不要遍历所有可用的反编译器并希望您可以反编译该代码,而是确定您要编辑的类集,修改其余的类,以便它们编译并且不具有任何对您感兴趣的类产生副作用(不要删除这些类引用的任何内容)并编译 jar(即使这不是您想要的 jar)。然后,您可以仅从 jar 中“提取”您想要修改的类文件,并在原始 jar 中“覆盖”它们。仅当您的更改没有任何副作用时,这才有效。 如果您询问如何创建 JAR:
您可以使用 Java IDE 来完成
jar
如果原始 JAR 文件已签名,您将无法重新签名新 JAR ...除非您拥有签名时使用的私钥。
反编译常常不准确。无法保证它生成的 Java 代码是原始类的正确表示。因此,当您进行更改并重新编译时,生成的“.class”文件
可能
我不确定你的意思。 JAR 的(新)依赖项不一定需要位于 JAR 本身中。这取决于它是什么类型的 JAR;例如它是一个所谓的“可执行”JAR,您使用启动。
java -jar my.jar ...
由于我无法完全重新编译 .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
.
-source 8 -target 8
。-uf
表示jar工具应该只更新具有提供的类的文件