我有一個 .deb 包,其中包含一個需要 Java 才能運行的應用程式。但是,我不關心他們安裝了哪種實作(例如 OpenJDK、IcedTea、Oracle),而且我不想強迫用戶在安裝了另一種實作的情況下下載另一種實作。我還想處理用戶未安裝任何實現的情況。
有沒有辦法可以表明 .deb 套件需要任何 Java 實作?如果是這樣,我如何處理沒有安裝任何實現的情況?
答案1
.deb
指示包需要 Java 運行時環境(JVM,而不是 JDK)的標準方法是指定對default-jre
或 的依賴default-jre-headless
(前者適用於具有 GUI 的程序,後者適用於不需要 GUI 的程序),以及對適當的版本java-runtime
(java6-runtime
如果您的應用程式使用Java 6 或更高版本、java7-runtime
Java 7 或更高版本等):
Depends: default-jre | java6-runtime
或者
Depends: default-jre-headless | java6-runtime-headless
ETC。
這可以處理所有 Debian 提供的 JRE(或 Debian 衍生版本)和 Oracle JRE如果它們是使用java-package
.default-jre
取決於預設的 JRE (適用於 Debian 8 的 OpenJDK 7,適用於 Debian 9 的 OpenJDK 8,適用於 Debian 10 的 OpenJDK 11),因此如果沒有安裝其他 JRE,這將確保安裝 JRE。各種 JRE 套件java-runtime
根據其支援等級提供變體,因此這意味著將使用任何現有的、相容的 JRE(適當打包),而不是強迫使用者安裝另一個 JRE。
如果您確實想要支援任何已安裝的 JRE,包括手動安裝、未打包的 Oracle JRE,則只能在套件的「建議」節中使用上述內容,然後嘗試java
從啟動腳本執行。理想情況下,您應該在安裝時(在 中postinst
,但確保如果沒有找到 JRE,則安裝不會失敗)以及需要運行時檢查是否存在 JRE java
— 如果您的套件包含 initscript,這可能會很複雜或systemd 單元等等(複雜是因為如何通知管理員出現問題並不明顯,但您可以確定會被注意到並理解)。
答案2
如果將其插入控製文件中,則可以指定最低 java 版本,也可以指定要安裝的 java 實作(如果尚未安裝適當的 java 版本):
Depends: openjdk-21-jdk-headless | java-sdk-headless (>= 21), ...
java-sdk-headless 是一個虛擬包,由任何 java 21 相容運行時提供。