亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有沒有辦法為同一平臺上的多個目標構建 java 應用程序的安裝程序?

有沒有辦法為同一平臺上的多個目標構建 java 應用程序的安裝程序?

慕田峪4524236 2024-01-25 15:11:02
我想從同一源樹和同一臺機器上構建 .msi、.deb 和 .pkg。Java9+ 的可分發運行時不再可下載,因此像 launch4j+nsis 這樣完美的解決方案不再有效。javapackager 已被 Oracle 放棄。OpenJDK 的 jpackager 無法(也永遠不會)針對不同的構建項目進行交叉編譯,而且它甚至還不是真正的產品。有沒有辦法從同一臺機器構建 win/linux/macos 安裝程序?“一次編譯,到處運行”的承諾真的已經死了嗎?我有一個遺留的java應用程序,現在處于不確定狀態,因為MacOS java8不支持java.awt.desktop,它需要java9+
查看完整描述

3 回答

?
陪伴而非守候

TA貢獻1757條經驗 獲得超8個贊

我從 Java 9 開始就使用由不同的 docker 映像jlinkjpackage虛擬機組成的跨平臺設置,我可以在我的目標平臺上構建運行時和安裝程序(MSI、DEB/RPM 和 DMG/PKG)主機系統。

對于 Mac,如果您沒有 Apple 硬件,則可以使用 KVM 映像,以便通過 ssh 發出命令。

對于 Windows,使用 Linux docker 容器,其中包含 wine、Windows 的 OpenJDK、Visual Studio 構建工具、WIX 和 CMake 來執行運行時映像的構建以及自定義的 MSI 安裝程序(因為版本太javapackage簡單)



查看完整回答
反對 回復 2024-01-25
?
慕容3067478

TA貢獻1773條經驗 獲得超3個贊

你的問題的答案并不短。但我會盡量簡短并指出所有相關信息。


簡短的回答是:你可以做到這一點。


更長的答案是:您仍然需要從目標環境中為每個目標環境構建運行時,但只需執行一次。然后,您可以保存該運行時并重用它,以便在單一環境中使用最新的 Java jar/代碼自動構建安裝程序。例如,用于jlink構建運行時映像并jpackage為 Windows、Linux 和 macOS(在這些各自的系統上)構建應用程序映像,然后將這些應用程序映像復制到 macOS 并nsis為每個平臺構建安裝程序(或您選擇的安裝程序生成器)從 macOS 內部。


當您更新代碼并重新編譯時,您只需將新的 jar 復制到預構建的應用程序映像中即可。您還必須復制所有依賴項,但這對于任何安裝程序都是必要的。構建的運行時中有一個配置文件,jpackage其中包含選項、類路徑等,您可以更改這些文件而無需重建運行時。


創建一個可運行的程序,就像這樣簡單

? ? package com.example;


? ? public class Greeter {

? ? ? ? public static void main(String[] args) {

? ? ? ? ? ? System.out.println("Hi, I'm the greeter. Welcome.");

? ? ? ? }

? ? }

編譯程序并放入 jar 中(greeter.jar在本示例中調用它并放入構建目錄中,target在本示例中調用)

運行jilnk以構建運行時。以下命令使用jlinkJDK11 中的內容并將結果放入名為 的目錄中runtime。此示例包括模塊路徑上的所有模塊,但您可以使用它jdeps來僅獲取所需的模塊。如果您不想在項目發展并依賴更多 Java 運行時時重新構建此運行時,我建議包括所有模塊。更不用說對 JRE 的傳遞依賴了。

? ? > set JLINK=C:\Program Files\Java\jdk-11.0.6\bin\jlink.exe

? ? > "%JLINK%" --no-header-files --no-man-pages --compress=2 --strip-debug --add-modules ALL-MODULE-PATH --output runtime

運行jpackage以構建適合打包在安裝程序中的應用程序映像。jpackage它使用 JDK14 早期訪問版的 jpackage(撰寫本文時唯一的 JDK 版本)。命令行選項—win-console僅適用于 Windows,并且僅當程序使用 stdin/stdout(控制臺)執行某些操作時才需要。我們的示例寫入控制臺,所以我們需要這個。運行應用程序時,此參數有時可能會打開控制臺窗口,因此如果您有純基于 Windows (gui) 的應用程序,請將其刪除。

? ? > set JPKG=C:\Program Files\Java\jdk-14-ea\bin\jpackage.exe

? ? > "%JPKG%" --type app-image -i target —win-console -n Greeter --main-class com.example.Greeter --main-jar greeter.jar --runtime-image runtime

運行應用程序.\Greeter\Greeter.exe

生成的應用程序映像(在app-image目錄中)可用于使用您最喜歡的安裝構建器(我使用 NSIS)構建安裝程序。您可以在任何平臺上執行此操作。此外,當您更新程序時,您只需將新的 jar 復制到應用程序映像中。無需重建應用程序映像或運行時。該 jar 副本可以在任何平臺上進行,并且無需運行 Windows 即可為新版本的應用程序構建新的安裝程序。


如果您的應用程序具有 jar 依賴項(例如來自 Maven 中心),則需要將這些 jar 復制到該Greeter/app目錄并app.classpath在Greeter/app/Greeter.cfg文件中更新。同樣,所有這些都可以在任何平臺上完成,無需啟動目標平臺(在我的例子中是 Windows)。


此外,jpackage它是官方支持的工具,但僅在 EA JDK 14 中可用(我寫的時候是 2020 年 2 月)。JDK 14 可以下載并jpackage與其他版本的 JDK(例如 JDK 11 LTS)一起使用。


查看完整回答
反對 回復 2024-01-25
?
躍然一笑

TA貢獻1826條經驗 獲得超6個贊

在 Linux 上創建 Windows MyApp.exe 和 MyApp-setup.exe:

jpackage我根本不需要,只需要jlink、launch4jnsis

  • 在本機使用jlink一次來創建運行時并壓縮
    結果以供在其他計算機上使用。

  • launch4j可以指示使用該運行時,并且nsis可以
    指示在安裝時復制整個運行時。

MyApp.app在 Linux 上創建 MacOS :

  • 用于jlink創建可重復用于重新創建的 tarfile Contents/runtime/Contents/Home(如上面的 Windows)

  • 復制jpackage生成的
    Contents/runtime/Contents/Info.plist
    Contents/runtime/Contents/MacOS/libjli.dylib

  • 復制jpackage生成的Contents/MacOS/MyApp存根并 Contents/MacOS/libapplauncher.dyn希望它們永遠不必更改。

  • 使用生成的模板作為參考從模板創建并Contents/Info.plist歸檔Contents/app/MyApp.cfgjpackage

  • 填寫我的jar文件和其他Contents/app資源Contents/Resources

在 Linux 上創建 pkg:

https://gist.github.com/msabramo/2a8e44eb6dcc3b89437d33649b0b1841

在 Linux 上創建 dmg:

https://askubuntu.com/questions/1117461/how-do-i-create-a-dmg-file-on-linux-ubuntu-for-macos

或者,從 遷移nsisinstall4j

https://www.ej-technologies.com/products/install4j/overview.html

理論上,一旦我在 Linux 上完成所有工作,我就可以將工作移植到 Darwin 和 cygwin (WSL 對我來說不適合 atm,將在最后工作)

概念證明在這里(linux、MacOS、cygwin):

https://github.com/nyetwurk/ecuxplot

考慮到 CI/CD 的興起,而且 java 的重點是可移植性和架構獨立性,這種多平臺交叉編譯工具在任何地方都不存在,這有點荒謬。


查看完整回答
反對 回復 2024-01-25
  • 3 回答
  • 0 關注
  • 213 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號