編譯識別不同版本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文件的信息。