第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

有沒有辦法為同一平臺上的多個目標(biāo)構(gòu)建 java 應(yīng)用程序的安裝程序?

有沒有辦法為同一平臺上的多個目標(biāo)構(gòu)建 java 應(yīng)用程序的安裝程序?

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

3 回答

?
陪伴而非守候

TA貢獻1757條經(jīng)驗 獲得超8個贊

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

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

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



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

TA貢獻1773條經(jīng)驗 獲得超3個贊

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


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


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


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


創(chuàng)建一個可運行的程序,就像這樣簡單

? ? package com.example;


? ? public class Greeter {

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

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

? ? ? ? }

? ? }

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

運行jilnk以構(gòu)建運行時。以下命令使用jlinkJDK11 中的內(nèi)容并將結(jié)果放入名為 的目錄中runtime。此示例包括模塊路徑上的所有模塊,但您可以使用它jdeps來僅獲取所需的模塊。如果您不想在項目發(fā)展并依賴更多 Java 運行時時重新構(gòu)建此運行時,我建議包括所有模塊。更不用說對 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以構(gòu)建適合打包在安裝程序中的應(yīng)用程序映像。jpackage它使用 JDK14 早期訪問版的 jpackage(撰寫本文時唯一的 JDK 版本)。命令行選項—win-console僅適用于 Windows,并且僅當(dāng)程序使用 stdin/stdout(控制臺)執(zhí)行某些操作時才需要。我們的示例寫入控制臺,所以我們需要這個。運行應(yīng)用程序時,此參數(shù)有時可能會打開控制臺窗口,因此如果您有純基于 Windows (gui) 的應(yīng)用程序,請將其刪除。

? ? > 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

運行應(yīng)用程序.\Greeter\Greeter.exe

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


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


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


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

TA貢獻1826條經(jīng)驗 獲得超6個贊

在 Linux 上創(chuàng)建 Windows MyApp.exe 和 MyApp-setup.exe:

jpackage我根本不需要,只需要jlinklaunch4jnsis

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

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

MyApp.app在 Linux 上創(chuàng)建 MacOS :

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

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

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

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

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

在 Linux 上創(chuàng)建 pkg:

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

在 Linux 上創(chuàng)建 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 的重點是可移植性和架構(gòu)獨立性,這種多平臺交叉編譯工具在任何地方都不存在,這有點荒謬。


查看完整回答
反對 回復(fù) 2024-01-25
  • 3 回答
  • 0 關(guān)注
  • 205 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號