编译识别不同版本jar包
在处理一些没有文档和源代码的class文件、jar包或war包时,反编译成为了一种必要的技术手段。这些文件存储的是字节码,通过反编译可以获取其中的参数和方法信息。
要开始反编译工作,首先需要下载TTools中的TdeCompile.jar可执行jar包。使用方法相对简单,只需在命令行输入特定命令即可:
java -jar TdeCompile.jar xxx.class
需要注意的是,如果你不在TdeCompile.jar的同目录下,需要提供其完整路径。另外,还需要指定xxx.class文件名。反编译后输出的文件名为xxx.class.txt,文本格式,位于与xxx.class相同的目录下。请确保该目录具有写入权限。
此外,我们还可以直接操作jar包或war包。命令如下:
java -jar TdeCompile.jar xxx.jar
程序会自动识别文件类型。如果是jar包或war包,它会先自动解压缩,解压缩目录为xxx.jar的原目录。随后,逐个反编译class文件,并在每个class文件旁边生成一个xxx.class.txt文件。请确保jar包所在目录具有写入权限。
TdeCompile的工作原理基于ASM库,能够读取class文件中的信息并进行反编译处理。
反编译jar包或war包的过程可以让我们更好地理解其内部结构,为后续开发和调试提供重要参考。虽然反编译可能涉及版权问题,但在合法的前提下,它是一种非常有用的工具。
在实际操作中,我们还可以利用其他反编译工具,如JD-GUI、CFR等。这些工具提供了图形界面,使得反编译过程更加直观和便捷。
总之,掌握反编译技术对于开发人员来说非常重要。它不仅能够帮助我们理解复杂的类库和框架,还能够在逆向工程、漏洞分析等方面发挥重要作用。
Ⅱ 运行环境jre版本和jar包编译版本不一致导致:Unsupported major.minor version 52.0
我在本地使用 Intellij Idea 打包了一个 spark 的程序 jar 包,放到linux集群上运行,报错信息是: Unsupported major.minor version 52.0
本机系统 -> windows10 开发工具 -> Intellij Idea 构建工具 -> maven
集群系统 -> Linux jre -> Java(TM) SE Runtime Environment (build 1.7.0_80-b15)`
根据报错 log 可以断定的是由于我本地编译打包所使用的 jdk 版本和 linux 集群的 jre 版本不一致导致的。stanford parser 和 jdk 版本对应关系为:
可以推断出是由于我打包编译时所使用的 jdk 版本是 jdk8,而集群的 jre 是7,才导致的问题。
maven 项目会用 maven-compiler-plugin 默认的 jdk 版本来进行编译,如果不指明版本就容易出现版本不匹配的问题,可能导致编译不通过的问题。解决办法:在 pom 文件中配置 maven-compiler-plugin 插件。
方式一:
方式二:
如竖首果使用 scala 编写 spark 的程序,在编译打包时候要注意 scala 的版本号和 jdk 版本的对应关系,同时也要考虑集群上 jre 的版本。比如我的集群上所使用的 jre 的版本号为 7,那么本机打包编译的 jdk 版本必须旅搜为 7 ,那么 scala 版本必须为 2.12 版本以下。
Intellij Idea 设置“开发”运拆纤历行时所用的 jdk 版本的几个地方:
如果上图中 Intellij Idea 的开发运行 jdk 版本配置错误,在开发运行编译的时候会报: Error:java: 无效的源发行版: xx
Ⅲ 如何快速反编译JAVA的jar包或war包
有些时候我们面对一个class文件jar包或者war包,很想知道里面有什么参数,有什么方法,但是又没有文档,又没有源代码,那怎么办呢。
没关系,我们可以反编译这些class文件或jar包或war包。
java的class文件存储的是字节码,这些基本知识在此就不必啰嗦了。反正就是其存储的信息足够可以反编译出来。
我们下载TTools中dist文件夹下的TdeCompile.jar可执行jar包,然后就可以开始反编译工作了。使用方法很简单,在命令行输入命令即可,如下
[plain] view plain
java -jar TdeCompile.jar xxx.class
注意如果你不在TdeCompile的同目录下,需要写上TdeCompile.jar的路径,其次跟一个参数xxx.class,xxx代表你所要反编译的文件的文件名。输出即是xxx.class.txt,它是反编译过后的文件,txt文本格式,所在目录通xxx.class。请确保你在xxx.class目录下有写权限。
我们也可以直接操作一个jar包或war包。如:
[plain] view plain
java -jar TdeCompile.jar xxx.jar
程序可以自动识别是class文件还是jar或war包,如果是jar包或war包,则首先自动解压缩,解压缩的目录为xxx.jar的同一个目录,然后逐个反编译class文件,在每个class文件的旁边输出一个xxx.class.txt文件。请确保你在jar包所在目录有写权限。
TdeCompile的原理是利用了ASM去读取每一个class文件的信息。