Jar包反编译,修改代码后,重新打jar包

小鱼儿 2024-04-01 14:17 179阅读 0赞

一、背景

最近遇到一个问题,需要把现有的jar包反编译成java代码,然后运行,测试,修改后再次打jar包。并不复杂的项目,只是一个很简单的main方法,并不是spring项目。可能是之前的开发走了,然后代码丢失了,只剩下客户那边有一个用的jar包。

jar包:xxx-0.0.1-SNAPSHOT-jar-with-dependencies.jar

二、反编译

先对jar包进行反编译,拿到java代码

1. 在idea中找到decompiler插件

d6d54c2f0d6b4690b380e7479e12394e.png

2. 找到这个插件的地址(在idea的安装目录中)

f80275c3bcb141738cf1ae73fbb9812f.png

3. 新建一个文件夹(存放反编译后的代码)

例如:文件夹名称叫decompile_file

4. 开始反编译

在刚刚创建的文件夹中,右击,git bash,执行

  1. java -cp "D:\xxx\plugins\java-decompiler\lib\java-decompiler.jar" org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dgs=true Esdataproducer-0.0.1-SNAPSHOT-jar-with-dependencies.jar decompile_file

记得修改文件路径和文件名

5. 得到反编译后的代码

文件夹中会出现一个跟反编译前名称一模一样的jar包,解压它,得到如下代码

3d94b99570124646864b618af6a04ef1.png

三、运行代码

把反编译后的代码导入idea中,会发现,之前项目的jar包都会反编译成代码

b0de6f821d84421aa1b97203a89ccfa1.png

我没有调试好,选择新建一个maven项目,然后把我需要的代码拷进去。

f9e38af5ef1f4eeb8963ec2da4279ab1.png

把需要的相关依赖放入pom中,此时,项目可以正常跑了。

四、重新打包

代码修改完成后,需要重新打包

1. 直接通过maven package打包

得到xxx-1.0-SNAPSHOT.jar, 放到服务器上执行

报错:xxx-1.0-SNAPSHOT.jar中没有主清单属性

搜了一下报错,是因为没有main-class。看了一眼之前反编译后的代码,里面有MANIFEST.MF文件,这个文件指定了main-class

e7437e41f7eb4f46bd20df1e9d5c1678.png

2. 在pom中加manifest配置

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.apache.maven.plugins</groupId>
  5. <artifactId>maven-assembly-plugin</artifactId>
  6. <configuration>
  7. <descriptorRefs>
  8. <descriptorRef>jar-with-dependencies</descriptorRef>
  9. </descriptorRefs>
  10. <archive>
  11. <manifest>
  12. <mainClass>com.xxx</mainClass>
  13. </manifest>
  14. </archive>
  15. </configuration>
  16. <executions>
  17. <execution>
  18. <id>make-assembly</id>
  19. <phase>package</phase>
  20. <goals>
  21. <goal>single</goal>
  22. </goals>
  23. </execution>
  24. </executions>
  25. </plugin>
  26. </plugins>
  27. </build>

此时,maven package打包生成 xxx-0.0.1-SNAPSHOT-jar-with-dependencies.jar 可以使用

3. 手动生成MANIFEST

127597b3b1514da1a1f0bf9bcd9a8012.png

生成 MANIFEST文件,但是此时maven package后MANIFEST文件跟生成的不一样

b23ceb51b7b049449c7e24fbbb8b1cd0.png

还可以按照以下操作生成jar包

449ff7113b834382ad75aa64632cecd1.png

70c99ed6fca045419dfc2fa7aa6bebe6.png

bulid完,会生成一个jar包

574dcc1a67094cd3a97f48d7a34e15e4.png

这个jar包也可以运行,不过生成的名称是xxx.jar, 给我的jar包是xxx-0.0.1-SNAPSHOT-jar-with-dependencies.jar这种格式,所以我最后选择的是上面那种方法,在pom中加manifest配置这种方式重新打包。

发表评论

表情:
评论列表 (有 0 条评论,179人围观)

还没有评论,来说两句吧...

相关阅读

    相关 如何Jar

    先打开命令提示符(win2000或在运行框里执行cmd命令,win98为DOS提示符),输入jar Chelp,然后回车(如果你盘上已经有了jdk1.1或以上版本),看到什么:

    相关 修改JAR内容并重新打包

    最近碰到一个棘手的问题:客户要定制接口,然后他们发了一个旧版的JAR包,其中有几个接口在新的文档上面已经去掉了。但是由于他们文档定制和程序不同步,所以那边的程序员拒绝现在修改。