首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反编译JAR,修改它,重新编译?

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

Stack Overflow用户
提问于 2020-11-08 10:26:40
回答 3查看 1.6K关注 0票数 0

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

我如何把所有的东西放在一起?

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

Jar文件是未签名的。那么签署Jar文件的原因到底是什么呢?如果我从另一个程序开始呢?

EN

回答 3

Stack Overflow用户

发布于 2020-11-09 00:34:40

如果在反编译整个jar之后遗漏了依赖项,这可能意味着jar没有包含它们。在创建jar时,您可以选择不在其中包含依赖项,但这假设它们在运行时在类路径上可用。在运行原始jar时,检查是否与类路径上的其他jar文件有任何关系。有关如何实现这一点的详细信息,请参阅this answer。一旦确定了所有依赖项,就可以很容易地从IntelliJ/Eclipsecommand line等集成开发环境编译jar。

顺便说一句,如果您希望对jar进行的更改很小或者是孤立的,我建议您编辑字节码(对于小的编辑来说要容易得多)。我更喜欢this bytecode editor

如果在代码的某些部分上反编译失败,jar的功能将不会在重新编译时恢复。在这种情况下,我建议您确定您正在尝试编辑的类集,修改其余类,使它们编译并且不会对您感兴趣的类产生任何副作用(不要删除这些类引用的任何内容),然后编译jar (即使这不是您想要的jar ),而不是遍历所有可用的反编译器并希望能够反编译代码。然后,您可以只从jar中extract您想要修改的类文件,并在原始jar中对它们进行overwrite。只有当您的更改没有任何副作用时,这才会起作用。

票数 1
EN

Stack Overflow用户

发布于 2020-11-08 10:31:45

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

票数 0
EN

Stack Overflow用户

发布于 2020-11-08 10:43:56

如果您正在询问如何创建JAR:

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

但它不能保证你正在做的事情会真正起作用。这里有几个问题。

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

  • Decompilation通常是不准确的。不能保证它生成的Java代码是原始类的正确表示。因此,当您进行更改并重新编译时,生成的".class“文件可能与原始文件存在意外/不必要的差异。

我猜我必须添加库,但是没有额外的lib目录。

我不知道你这么说是什么意思。JAR的(新)依赖项不一定要在JAR本身中。这取决于它是什么类型的JAR;例如,它是使用java -jar my.jar ...启动的所谓的“可执行”JAR吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64734289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档