簡體   English   中英

使用 jar 命令更新特定目錄中 JAR 中的文件

[英]Update a file inside a JAR in a specific directory with jar command

所以我一直在尋找答案,顯然沒有找到滿意的答案。

問題是我想更新 JAR 內的 JAR(或任何與此相關的文件),但所述文件位於文件夾結構內,我想避免在 JAR 之外復制它,以便我可以更新它。

例子:

Foo.jar (root directory)
/
|->/folder1
|
|->/folder2
|
|->/foo
    |
    |-->/bar
         |
         |---->/baz
               |
               |------>file_to_update.jar

因此,如果我想使用jar命令更新它,我必須首先在 JAR 之外創建相同的文件夾結構,然后執行

jar -uf Foo.jar -C foo/bar/baz/file_to_update.jar

但是,我想避免創建此文件夾結構,因為對於某些文件,它可能非常深,而且因為我可能需要更新整個容器 JAR 中的選定文件,所以我不想創建這么多具有​​特定結構的文件夾所以jar命令可以更新它們。

換句話說,我想告訴jar命令使用特定源目錄中的特定源文件更新特定目標目錄中的特定目標文件。

即像

jar -uf Foo.jar -sourceFile /x/y/z/filetoupdate -destFile /a/b/c/filetoupdate 

(我知道這種語法不起作用,只是為了舉例說明我需要什么)。

這能做到嗎? jar命令可以找到匹配項或其他內容時,我絕對需要模仿整個文件夾結構,這讓我感到非常奇怪,因為我可能需要更新 100 個文件夾深的文件夾結構中的文件. 僅僅為了更新文件而復制會過於復雜。

另外,我知道可以使用常規的 ZIP 實用程序,但是我在 Linux 中可用的那個實用程序沒有更新文件,即使它說更新了(重新打開 jar 后,舊版本完好無損),現在我不能去尋找另一個(公司政策,沒有時間,測試問題,你說出來)。

最后,如果我可以從命令行執行此操作,則意味着我可以創建一個批處理文件來更新大量特定文件,而無需創建文件夾結構。

我忘了說,我還想避免解壓、更新、重裝整個過程,因為這個 JAR 可以上升到 2GB,所以這樣做需要一段時間,基本上只是向我的巨大的 JAR。

非常感謝您對此的任何幫助!

正如已接受的答案已經指出的那樣,您既不能使用zip也不能使用jar命令將文件系統上的特定文件插入到壓縮文件內的特定目錄中。

但是有這個解決方法,簡而言之,它首先提取壓縮文件中的特定文件,您可以更新它,然后將其放回壓縮文件中:

1. 提取單個文件:
考慮一個包含以下內容的罐子

$ jar tvf foo.jar 
 0 Thu Jan 10 00:05:06 IST 2013 META-INF/
68 Thu Jan 10 00:05:06 IST 2013 META-INF/MANIFEST.MF
 0 Thu Jan 10 00:04:30 IST 2013 x/
 0 Thu Jan 10 00:07:36 IST 2013 x/b/
 9 Thu Jan 10 00:07:36 IST 2013 x/b/hello.txt
 0 Thu Jan 10 00:04:30 IST 2013 x/a/

要僅提取 hello.txt,您必須提供要提取的文件的完全限定路徑。 Jar 也會創建適當的文件夾。

例子 :

$ jar xvf foo.jar x/b/hello.txt
inflated: x/b/hello.txt

$ tree x/
x
└── b
    └── hello.txt  
1 directory, 1 file

2. 更新單個文件

  1. 修改解壓文件
  2. 使用 'u' 標志更新 jar。 提供分解后的目錄根目錄,jar 將更新其下的所有路徑元素。

例子:

$ jar vfu foo.jar x/
adding: x/(in = 0) (out= 0)(stored 0%)
adding: x/b/(in = 0) (out= 0)(stored 0%)
adding: x/b/hello.txt(in = 23) (out= 11)(deflated 52%)

3. 我用哪個版本的 jar 試過這個?

我在 Fedora 17 上使用了與 JDK 7 捆綁在一起的jar


我已經驗證了這里提到的所有步驟。 希望這可以幫助。

4129445:用於增量更新Sun/Oracle 錯誤數據庫中的ZIP 文件的 API要求在 java api 中實現此功能。

來自評估:

“很容易同情那些想要修復這個錯誤的人。同情那些無意中覆蓋了正在運行的 JVM 已經在使用的 JAR 文件的人可能更容易同情。”

“如果 jar 和 zip API 從第一天起就允許可變 zip 文件,那就太好了。但在這一點上,從 Java 向 jar 和 zip 文件添加可變性(或者更確切地說,增加變異它們的容易程度)似乎可能會引入更難調試的問題。”

前面的討論顯示了一些用於更新 zip(或 jar)文件的 Java 源代碼。

我並不完全清楚這是否實際上比使用jar -u更快,但至少您應該能夠調整該代碼,這樣您就不必在磁盤上重新創建文件結構。

編輯: 這是關於“jar”實用程序的文檔- 您可以親眼看到您正在尋找的特定行為雖然很有用,但並不存在。

我認為原因是命令行界面基本上是 Unix/Linux 'tar' 命令的克隆。 當然,它生成 zip 格式,而不是 tar。

編輯 #2 - 我想到要將文件添加到 zip,您只需要從文件末尾剝離中央目錄,附加新條目,然后重新寫入中央目錄。 更新是同樣的事情,除了不是將條目添加到目錄中,而是更新現有目錄條目以指向新的 zip 條目。

在探索這種可能性時,我發現 Java 7 包含一個zip 文件系統提供程序,它看起來像這樣做,並且可以構成您想要做的解決方案的基礎。

我認為這是由於 java.util.zip 包中的類是如何工作的。 他們坐在溪流之上。

ZipFile類建立在 ZipFileInputStream 之上。 編寫 zipfile 是通過將 ZipEntries 一一提供給 ZipOutputStream 來完成的。

我假設 jar 可執行文件是建立在這些類之上的。

我也試圖在不復制 jar 外部的 jar 文件結構的情況下更新 jar,並且由於某種原因jar uf jarFileName -C ... 命令從不讓我將文件復制到 jar 中的子目錄。 然后我嘗試使用 ubuntu 14.04 的內置存檔管理器將文件剪切並粘貼到 jar 中(即右鍵單擊 jar 文件並選擇“使用存檔管理器打開”,然后將文件粘貼到 jar 文件結構中的任何位置),並且它起作用了. 這不是 cli 解決方案,但它有效。 希望這可以為其他人節省一些時間。

它有效,但它不是您正在查看的確切解決方案。

我不是手動創建文件夾結構,而是要求提及整個路徑,因此 mkdir 也會創建文件夾和子目錄。希望這會有所幫助....

set /p Folder=where you want to move inside jar 
set /p File=Mention path of file to be moved 
set /p Jarfile=Where is your jar file
mkdir %Folder%
copy %File% %Folder%
jar -uvf %Jarfile% %File%
rd /s /q %Folder%
rmdir %Folder%

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM