微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

反编译JAR,对其进行修改,然后重新编译?

如何解决反编译JAR,对其进行修改,然后重新编译?

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

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

@Stephen C “因此,当您进行更改并重新编译时,生成的“ .class”文件可能会出现意外的情况” 这到底有多重要?我只想要Jar文件功能,而不是它的1:1副本。

Jar文件未签名。无论如何,对Jar文件签名的确切原因是什么?如果我从另一个程序启动它?

解决方法

如果在对整个jar进行反编译后缺少依赖项,则可能意味着jar不包含它们。创建jar时,可以选择不将依赖项包含在其中,但这假设它们将在运行时在类路径上可用。运行原始jar时,请检查与类路径上的其他jar文件是否存在任何关系。有关如何实现此功能的详细信息,请参见this answer。一旦确定了所有依赖项,就可以从IntelliJ / Eclipse之类的IDE或command line轻松地编译jar。

作为旁注,如果您要对jar进行的更改很小或孤立,我建议编辑字节码(进行小修改更容易)。我更喜欢this bytecode editor

如果代码的某些部分反编译失败,则重新编译时将无法恢复jar的功能。在这种情况下,建议您不要识别所有试图使用的反编译器,而是希望您可以反编译该代码,而是确定要尝试编辑的一组类,然后修改其余的类,以使它们可以编译且不包含任何其他内容。对您感兴趣的类的副作用(不要删除这些引用的任何内容)并编译jar(即使这不是您想要的jar)。然后,您可以只extract仅要从jar中修改的类文件,然后overwrite将它们放在原始jar中。只有在您的更改没有任何副作用的情况下,这才起作用。

,

例如,将jar插件用于gradle或maven,或使用intelliJ进行构建,这是另一篇文章的答案:How to build jars from IntelliJ properly?

,

如果您询问如何创建JAR:

  • 您可以使用Maven,Gradle,Ant等构建工具来做到这一点。
  • 您可以使用Java IDE来完成
  • 您可以使用命令行jar工具执行此操作;请参阅Oracle Java官方教程中的How to create a JAR file

但是,不能保证您所做的事情会真正起作用。这是几个问题。

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

  • 反编译通常不准确。不能保证它产生的Java代码是原始类的正确表示。因此,当您进行更改并重新编译时,相对于原始文件而言,生成的“ .class”文件 可能具有意外/不必要的差异。


我想我必须添加这些库,但是没有多余的lib目录。

我不确定您的意思。 JAR的(新)依赖关系不必一定在JAR本身中。这取决于它是哪种JAR。例如是您使用java -jar my.jar ...启动的所谓的“可执行” JAR。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。