為應用程式及其依賴項建立 UberJAR

Java 應用程式的一個常見要求是可以通過複製單個檔案來部署。對於僅依賴於標準 Java SE 類庫的簡單應用程式,通過建立包含所有(已編譯)應用程式類的 JAR 檔案來滿足此要求。

如果應用程式依賴於第三方庫,事情就不那麼簡單了。如果只是將依賴項 JAR 檔案放在應用程式 JAR 中,標準 Java 類載入器將無法找到庫類,並且你的應用程式將無法啟動。相反,你需要建立一個包含應用程式類和相關資源以及依賴項類和資源的 JAR 檔案。這些需要組織為單個名稱空間以供類載入器搜尋。

這樣的 JAR 檔案通常被稱為 UberJAR。

使用 jar 命令建立 UberJAR

建立 UberJAR 的過程很簡單。 (為簡單起見,我將使用 Linux 命令。對於 Mac OS,命令應該是相同的,對於 Windows,命令應該是相同的。)

  1. 建立一個臨時目錄,並將目錄更改為該目錄。

    $ mkdir tempDir
    $ cd tempDir
    
  2. 對於每個從屬 JAR 檔案,按照它們需要在應用程式的類路徑中出現的相反順序,使用 jar 命令將 JAR 解壓縮到臨時目錄中。

    $ jar -xf <path/to/file.jar>
    

    對多個 JAR 檔案執行此操作將覆蓋 JAR 的內容。

  3. 將應用程式類從構建樹複製到臨時目錄中

    $ cp -r path/to/classes .
    
  4. 從臨時目錄的內容建立 UberJAR:

    $ jar -cf ../myApplication.jar
    

    如果要建立可執行 JAR 檔案,請按此處所述包含適當的 MANIFEST.MF。

使用 Maven 建立 UberJAR

如果你的專案是使用 Maven 構建的,你可以使用“maven-assembly”或“maven-shade”外掛建立 UberJAR。有關詳細資訊,請參閱 Maven Assembly 主題(在 Maven 文件中)。

UberJAR 的優點和缺點

UberJAR 的一些優點是不言而喻的:

  • UberJAR 很容易分發。
  • 你無法破壞 UberJAR 的庫依賴關係,因為這些庫是自包含的。

此外,如果使用適當的工具來建立 UberJAR,則可以選擇排除未在 JAR 檔案中使用的庫類。但是,這通常通過類的靜態分析來完成。如果你的應用程式使用反射,註釋處理和類似技術,則需要注意不要錯誤地排除類。

UberJARs 也有一些缺點:

  • 如果你有許多具有相同依賴關係的 UberJAR,那麼每個 UberJAR 都將包含依賴關係的副本。
  • 一些開源庫有這些許可證可以排除 1 個 它們在 UberJAR 使用。

1 - 某些開源庫許可證允許你僅使用庫,終端使用者可以將庫的一個版本替換為另一個版本。UberJARs 可以很難替換版本依賴項。