[英]How do you recompile a jar file?
我拿了一個舊的 jar 文件並對其進行了編輯。 現在我有一個包含所有文件的文件夾,我想將它們重新編譯回 jar 文件。 我該怎么做呢?
Jar文件不是正常意義上的“編譯”。 但是你只需用jar
命令創建一個:
jar cvf myfile.jar file1 file2 etc
您可以正常使用globbing:
jar cvf ../myfile.jar *
運行jar -?
或閱讀文檔以獲取更多信息。
請注意,對於可執行jar文件,您還需要指定清單文件。
你是怎么編輯的?
無論如何, jar
文件遵循與常規zip
文件相同的格式。 如果你想更新jar的內容(可能有一個新文件),你可以這樣做:
jar -uf yourJar.jar path/to/updated/Class.class
那將使用文件path/to/updated/Class.class
更新你的jar path/to/updated/Class.class
如果在該路徑中已經有一個具有該名稱的類,它將被替換。 如果不是它將被創建。
在此之后你的罐子是最新的。
jar文件只是一個帶有一些額外文件的zip文件。 您可以使用任何zip實用程序來重新加入未加工的jar文件。
由於我無法完全重新編譯 .jar 文件並使用我的應用程序,因此我想在這里分享之前答案中缺少的步驟。
在我的具體情況下,為了使事情盡可能簡單,我只想修改反編譯結果中的一個.java文件,並直接在.jar文件中進行更新。
我從Paulo Ebermann對類似問題的回答開始,最終得到:
javac -source 8 -target 8 -d classdir -cp \
"\
path/to/dep1.jar; \
path/to/dep2.jar; \
path/to/myoriginal.jar \
" path/to/my/java/class.java
cd classdir
jar -uf path/to/myoriginal.jar path/to/my/java/class.class
筆記:
path/to/myoriginal.jar
位於依賴項的路徑中,這會強制 java 編譯器在 original.jar 中查找丟失的類,而不是在本地文件中重新編譯和編譯更多依賴項和代碼因此我故意省略了.
class 路徑列表中的路徑-source 8 -target 8
是強制 class 為適當版本的運行時機器編譯所需的。-uf
表示 jar 工具應僅使用提供的 class 更新文件
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.