一、背景
最近遇到一个问题,需要把现有的jar包反编译成java代码,然后运行,测试,修改后再次打jar包。并不复杂的项目,只是一个很简单的main方法,并不是spring项目。可能是之前的开发走了,然后代码丢失了,只剩下客户那边有一个用的jar包。
jar包:xxx-0.0.1-SNAPSHOT-jar-with-dependencies.jar
二、反编译
先对jar包进行反编译,拿到java代码
1. 在idea中找到decompiler插件
2. 找到这个插件的地址(在idea的安装目录中)
3. 新建一个文件夹(存放反编译后的代码)
例如:文件夹名称叫decompile_file
4. 开始反编译
在刚刚创建的文件夹中,右击,git bash,执行
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包,解压它,得到如下代码
三、运行代码
把反编译后的代码导入idea中,会发现,之前项目的jar包都会反编译成代码
我没有调试好,选择新建一个maven项目,然后把我需要的代码拷进去。
把需要的相关依赖放入pom中,此时,项目可以正常跑了。
四、重新打包
代码修改完成后,需要重新打包
1. 直接通过maven package打包
得到xxx-1.0-SNAPSHOT.jar, 放到服务器上执行
报错:xxx-1.0-SNAPSHOT.jar中没有主清单属性
搜了一下报错,是因为没有main-class。看了一眼之前反编译后的代码,里面有MANIFEST.MF文件,这个文件指定了main-class
2. 在pom中加manifest配置
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.xxx</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
此时,maven package打包生成 xxx-0.0.1-SNAPSHOT-jar-with-dependencies.jar 可以使用
3. 手动生成MANIFEST
生成 MANIFEST文件,但是此时maven package后MANIFEST文件跟生成的不一样
还可以按照以下操作生成jar包
bulid完,会生成一个jar包
文章来源:https://www.toymoban.com/news/detail-400100.html
这个jar包也可以运行,不过生成的名称是xxx.jar, 给我的jar包是xxx-0.0.1-SNAPSHOT-jar-with-dependencies.jar这种格式,所以我最后选择的是上面那种方法,在pom中加manifest配置这种方式重新打包。文章来源地址https://www.toymoban.com/news/detail-400100.html
到了这里,关于Jar包反编译,修改代码后,重新打jar包的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!