2009-08-03 36 views
57

我想修改我的罐子裏面的文件。在我的應用程序中,是否可以在不提取和重新激勵的情況下執行此操作?修改罐子裏的文件

我想修改的文件是配置文件,主要是基於xml的。

我感興趣的原因不是不合理的是,應用程序包裝與launch4j如果我unjar它我不能再次創建.exe文件。

+0

你爲什麼想這麼做? – 2009-08-03 21:57:30

+0

我想在應用程序中保留補充文件,而不在文件系統上創建臨時文件。 – 2009-08-03 22:02:09

+0

試試這個解決方案http://stackoverflow.com/a/4837522/1853864 我用了,我的問題解決了。 – 2012-11-28 12:22:09

回答

0

只要此文件不是.class,即資源文件或清單文件 - 您可以。

+0

和如何,沒有提取和重新震動? – 2011-08-25 11:42:27

9

Java jar文件與zip文件的格式相同 - 所以如果你有一個zip文件實用程序可以讓你修改一個存檔文件,那麼你的腳就在門外。第二個問題是,如果你想重新編譯一個類或其他東西,你可能只需要重新構建jar;但是一個文本文件或者其他東西(例如xml)應該很容易修改。

1

爲了擴展dfa的說法,原因是因爲jar文件是像zip文件一樣設置的。如果要修改文件,則必須讀出所有條目,修改要更改的條目,然後將條目寫回jar文件。之前我必須這樣做,而這是我能找到的唯一方法。

編輯

注意,這是使用內部到Java jar文件的編輯,這是文件流。我確信有辦法做到這一點,你可以將整個jar讀入內存,修改所有內容,然後寫回到文件流。這就是我相信像7-Zip和其他公用事業公司這樣的公用事業公司,因爲我相信在寫入時必須定義zip頭的ToC。但是,我可能是錯的。

2

這可能比你想要在短期內處理更多的工作,但我認爲從長遠來看,使用Ant(或Maven,或甚至Bazel)將對你有幫助建立罐子的手動。這樣你只需點擊ant文件(如果你使用Eclipse)並重建jar。

或者,您可能實際上並不需要在jar中包含這些配置文件 - 如果您期望需要定期替換這些文件,或者它應該分發給多方,配置文件應該根本不是罐子的一部分。

+2

同意。但是,您可能希望在JAR中放置一個「默認」配置文件,因此如果外部設備發生某些事情(損壞,刪除等),您可以回退到默認配置。 – 2009-08-03 22:16:22

+0

真的 - 雖然我不知道有多少應用程序將繼續運作,沒有他們的配置文件... – dimo414 2009-08-03 23:30:25

7

正如許多人所說的那樣,如果不重新編寫JAR文件,就不能更改JAR中的文件。 Launch4J更糟糕,您必須在更改JAR後重新編譯EXE。所以不要走這條路。

將配置文件放入JAR通常是個壞主意。這是我的建議。在某些預定位置(如主目錄,\ Program Files \ etc)中搜索您的配置文件。如果您找到配置文件,請使用它。否則,使用JAR中的那個作爲後備。如果你這樣做,你只需要在預定位置寫入配置文件,程序就會把它提取出來。

此方法的另一個好處是,如果升級軟件,修改的配置文件不會被覆蓋。

1

是的,你可以使用SQLite您可以閱讀或jar文件內寫入到數據庫中,這樣你就不必提取,然後重新罐子,請按照我的帖子http://shoaibinamdar.in/blog/?p=313

使用語法「jdbc:sqlite :: resource:」您可以從jar文件中讀取和寫入數據庫

1

檢出TrueZip

它通過虛擬文件系統API完全符合你的要求(在jar文件內部編輯文件)。它也支持嵌套存檔(罐子裏面的jar)。 「在具有相同的路徑名添加將被覆蓋文件存檔的任何文件了。」

jar uf jar-file input-file(s) 

1

提取ex文件的jar文件。使用winrar並使用CAVAJ:

Cavaj Java Decompiler是一個圖形化的免費軟件實用程序,用於重建CLASS文件中的Java源代碼。

這裏是視頻教程,如果您需要: https://www.youtube.com/watch?v=ByLUeem7680

7

您可以用Vim:

vim my.jar

的Vim能編輯壓縮的文本文件,給您的環境中有unzip

0

我發現這樣做在Windows的最簡單方法是使用WinRAR

  1. 在文件上單擊鼠標右鍵,然後從上下文菜單中選擇「打開用WinRAR」。
  2. 導航到要編輯的文件並雙擊它以在默認編輯器中打開它。
  3. 進行更改後,保存並退出編輯器。
  4. 然後會出現一個對話框,詢問您是否希望更新存檔中的文件 - 選擇「是」,JAR將被更新。