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

一、背景

最近遇到一个问题,需要把现有的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包

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

  • 9
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 将一个JavajarJava Archive)文件反编译成源代码可以通过各种反编译工具轻松实现,这些工具可以将jar包中的class文件反编译Java代码。这是一种实用的技术,因为有时我们需要查看一些已编译的代码而没有源代码,或者需要深入了解某个jar包的实现细节。 使用反编译工具反编译jar包的过程相对较简单,首先需要确定要反编译jar包,然后找到一个合适的反编译工具。常用的反编译工具包括JD-GUI和JAD,这两个工具都是免费和开源的。 然后,将jar包添加到反编译工具中,工具会将jar包的class文件加载在其界面中。接着,我们可以一一选择class文件,并通过“保存源代码”选项将每个class文件转换成Java代码。这个过程需要一些时间,具体取决于jar包的大小和其中的class文件数量。 当反编译完成后,我们就可以查看源代码并进一步了解软件的实现细节。但需要注意的是,反编译并不一定能够提供完整的源代码,因为有些源代码可能已经被混淆(即将变量名称等信息编码为无意义字符)。在这种情况下,我们需要使用其他技术来解密和还原源代码。 总之,将jar包反编译成源代码是一种常用的技术,可以用于深入了解软件实现细节和查看已编译的代码。但需要注意的是,反编译不一定能够提供完整的源代码,因为有些信息可能已经被混淆或删除。 ### 回答2: Jar包Java语言中常用的一种打包格式,可以将一些相关的类文件打包成一个整体。很多时候,我们需要查看一些jar包中的源代码,可以通过反编译的方式来实现。 反编译是将编译后的二进制代码转化为人能够理解的高级语言代码的过程。针对jar包反编译工具有很多,比较常用的有JD-GUI、JAD和Procyon等。 其中,JD-GUI是一款比较优秀的反编译工具,它不仅具备反编译的基本功能,还能够提供图形化的用户界面,便于操作。其使用步骤如下: 1.下载并安装JD-GUI工具。 2.打开JD-GUI工具,选择“File”菜单中的“Open File”选项。 3.在弹出的对话框中选择要反编译jar包文件,点击“Open”按钮。 4.等待JD-GUI工具完成反编译操作,反编译结果将以树形目录的形式展现在左侧窗口中。 5.选择需要查看的类文件,双击打开即可查看反编译后的源代码。 需要注意的是,尽管反编译能够还原代码的基本结构,但是由于Java编译器的优化操作,反编译后的源代码可能存在一些细微的变化。因此,在使用反编译工具时,应该谨慎地分析反编译后的代码,并结合实际情况做出相应的处理。 总之,反编译是一种非常有用的工具,在理解或修改他人代码时能够提供很大的帮助。但同时,我们也应该遵守相关法律法规,不得将反编译后的代码用于商业用途或其他违法活动。 ### 回答3: jar包反编译成源代码是指将Java程序打包成jar文件后,通过工具将其反编译成可读的源代码文件。在开发过程中,经常会遇到需要查看或修改一些已经编译成jar包的工具类或库文件的情况,这时候就需要将这些jar包反编译成源代码了。 反编译jar包的过程需要使用专门的反编译工具,比较常用的有JD-GUI、Jad和Procyon等。这些工具使用起来十分简单,只需要将要反编译jar包拖入工具界面中即可。反编译完成后,我们可以在工具中看到该jar包中的所有类文件以及对应的代码。 然而,需要注意的是反编译出来的源代码并不一定和原始代码完全一致。由于Java语言中存在许多高级特性和编译器优化,所以反编译后的代码可能会出现一些不同之处,如变量名改变、去除注释等。此外,反编译是一项涉及版权和知识产权的行为,在某些情况下可能会侵犯他人的权益,在使用过程中需要注意相关法律规定。 总之,jar包反编译成源代码是一个十分实用的技术,它可以让我们更方便地处理Java程序中的各种工具类和库文件。不过在操作时需要注意隐私和版权等方面的问题,遵守相关法律法规。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值