反编译JAR,修改它,重新编译?

问题描述 投票:0回答:3

我有一个较旧的 Jar 文件,我必须对其进行修改才能使其正常工作。 我已经用jd-gui反编译了它,并更改了需要更改的部分。我现在想知道我必须做什么才能拿回一个罐子? 我想我必须添加库,但是没有额外的 lib 目录。

如何将所有内容放在一起?

@斯蒂芬C “因此,当您进行更改并重新编译时,生成的“.class”文件可能会出现意外的情况” 这究竟有何相关性?我只想要 Jar 文件的功能,而不想要它的 1:1 副本。

Jar 文件未签名。签署 Jar 文件的具体原因是什么?如果我从另一个程序启动它?

java jar decompiling recompile
3个回答
6
投票

如果反编译整个 jar 后缺少依赖项,则可能意味着该 jar 不包含它们。创建 jar 时,您可以选择不包含依赖项,但这假设它们在运行时在类路径上可用。运行原始jar时检查是否与类路径上的其他jar文件有任何关系。有关如何实现此目标的详细信息,请参阅此答案。一旦确定了所有依赖项,您就可以从 IDE(例如 IntelliJ/Eclipse)或从 命令行轻松编译 jar。

作为旁注,如果您想对 jar 进行的更改很小或孤立,我建议编辑字节码(对于小编辑来说更容易)。我更喜欢这个字节码编辑器

如果代码的某些部分反编译失败,则重新编译后将无法恢复 jar 的功能。在这种情况下,我建议您不要遍历所有可用的反编译器并希望您可以反编译该代码,而是确定您要编辑的类集,修改其余的类,以便它们编译并且不具有任何对您感兴趣的类产生副作用(不要删除这些类引用的任何内容)并编译 jar(即使这不是您想要的 jar)。然后,您可以仅从 jar 中“提取”您想要修改的类文件,并在原始 jar 中“覆盖”它们。仅当您的更改没有任何副作用时,这才有效。 如果您询问如何创建 JAR:


1
投票
您可以使用 Maven、Gradle、Ant 等构建工具来完成。

您可以使用 Java IDE 来完成

如果原始 JAR 文件已签名,您将无法重新签名新 JAR ...除非您拥有签名时使用的私钥。

  • 反编译常常不准确。无法保证它生成的 Java 代码是原始类的正确表示。因此,当您进行更改并重新编译时,生成的“.class”文件

    可能
  • 相对于原始文件存在意外/不需要的差异。
  • 我想我必须添加库,但没有额外的 lib 目录。

我不确定你的意思。 JAR 的(新)依赖项不一定需要位于 JAR 本身中。这取决于它是什么类型的 JAR;例如它是一个所谓的“可执行”JAR,您使用

java -jar my.jar ...

启动。

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


0
投票

我从

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编译器在原始.jar文件中查找丢失的类,而不是在本地反编译代码中(这将需要重新编译和更多依赖项),因此我有故意遗漏了类路径列表中的
    .
  • 路径
    强制类针对运行时机器的适当版本进行编译所需的
    -source 8 -target 8
  • -uf
    表示jar工具应该只更新具有提供的类的文件
© www.soinside.com 2019 - 2024. All rights reserved.