簡體   English   中英

如何為 Java 程序創建 MSI Windows 安裝程序?

[英]How to create a MSI Windows installer for a Java program?

我想為 Java 程序創建一個 Microsoft 安裝程序文件。 我無法使用 Netbeans 或任何 Maven 插件來執行此操作,因為我無法使用 Oracle Java 和/或 JavaFX(主要是出於法律原因)並且兩者似乎都使用 Oracle 本機部署 + JavaSE 1.8。

我當前的檔案包含:

  • Java 運行時環境 (OpenJDK 1.7 JRE)
  • 一個腳本 (.bat)
  • 一個胖罐子
  • 一個圖標文件
  • 幾個文本文件

我不想使用系統的JRE,這就是我提供另一個JRE的原因。 該腳本僅使用一些參數調用 JRE。 圖標文件為 .ico 格式。 胖 JAR 是包含所有必需的 Java 類、本機庫和資產(包括第三方庫)的 JAR。

我想允許最終用戶安裝、運行和卸載我的程序。 我想在開始菜單中提供一個快捷方式來運行它,另一個快捷方式來卸載它。 這里好像有說明。 我是否必須使用其他任何東西來創建快捷方式來卸載我的程序?

我已經研究 Wix 工具集好幾個星期了。 我知道我必須編寫一個 wxs 文件來與“candle.exe”一起使用,它會創建一個 wixobj 文件,我必須用這個文件運行“light.exe”,然后我得到一個 MSI 文件。

我知道如何添加文件, 這里有解釋但我不知道如何添加包含 JRE 的整個目錄而不一一提及每個文件。 如何在wxs文件中完成?

如何選擇一些獨特的 GUID?

是否已經有一個(更多?)簡單的工具可以用來從胖 JAR 制作 MSI 文件? 在嘗試在 GNU Linux 下使用 Apache POI 以編程方式執行相同操作之前,我更喜歡先了解如何在 Windows 下的命令行中構建這樣的文件。

編輯。:這是我的第一個 wxs 文件:

 <?xml version="1.0" encoding="utf-8"?> <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> <Product Id="*" Name="Truly Unusual Experience of Revolution" Language="1033" Version="0.0.0.0" Manufacturer="Julien Gouesse" UpgradeCode="00000000-0000-0000-0000-000000000000"> <!-- Installer's Icon in Add/Remove Programs --> <Icon Id="icon.ico" SourceFile="tuerLogo.ico"/> <Property Id="ARPPRODUCTICON" Value="icon.ico" /> <!-- Installer's version = 200 because the 64-bit support is required --> <Package InstallerVersion="200" InstallPrivileges="elevated" InstallScope="perMachine" Compressed="yes" Platform="x64" /> <Media Id="1" Cabinet="media1.cab" EmbedCab="yes" /> <MajorUpgrade AllowDowngrades="yes" IgnoreRemoveFailure="yes" Schedule="afterInstallInitialize" /> <Condition Message="This application is only supported on Windows XP, Windows Vista, Windows Server 2008, or higher."> <![CDATA[Installed OR (VersionNT >= 501)]]> </Condition> <Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="ProgramFilesFolder"> <Directory Id="APPLICATIONROOTDIRECTORY" Name="Truly Unusual Experience of Revolution"> <Component Id="tuer.bat" Guid="00000000-0000-0000-0000-000000000000"> <File Id="tuer.bat" Source="tuer.bat" KeyPath="yes"/> </Component> <Component Id="tuer.jar" Guid="00000000-0000-0000-0000-000000000000"> <File Id="tuer.jar" Source="tuer.jar" KeyPath="yes"/> </Component> <Component Id="LICENSE.txt" Guid="00000000-0000-0000-0000-000000000000"> <File Id="LICENSE.txt" Source="LICENSE.txt" KeyPath="yes"/> </Component> <Component Id="NOTICE.txt" Guid="00000000-0000-0000-0000-000000000000"> <File Id="NOTICE.txt" Source="NOTICE.txt" KeyPath="yes"/> </Component> <Component Id="README.txt" Guid="00000000-0000-0000-0000-000000000000"> <File Id="README.txt" Source="README.txt" KeyPath="yes"/> </Component> </Directory> </Directory> <Directory Id="ProgramMenuFolder"> <Directory Id="ApplicationProgramsFolder" Name="Truly Unusual Experience of Revolution"/> </Directory> </Directory> <!-- Shortcut in the Start Menu --> <DirectoryRef Id="ApplicationProgramsFolder"> <Component Id="ApplicationShortcut" Guid="00000000-0000-0000-0000-000000000000"> <Shortcut Id="ApplicationStartMenuShortcut" Name="Truly Unusual Experience of Revolution" Description="First person shooter" Target="[#tuer.bat]" WorkingDirectory="APPLICATIONROOTDIRECTORY" Icon="icon.ico" /> <RemoveFolder Id="ApplicationProgramsFolder" On="uninstall"/> <RegistryValue Root="HKCU" Key="Software\\Microsoft\\TrulyUnusualExperienceofRevolution" Name="installed" Type="integer" Value="1" KeyPath="yes"/> </Component> </DirectoryRef> <Feature Id="TrulyUnusualExperienceofRevolution" Title="Truly Unusual Experience of Revolution" Level="1"> <ComponentRef Id="tuer.bat" /> <ComponentRef Id="tuer.jar" /> <ComponentRef Id="LICENSE.txt" /> <ComponentRef Id="NOTICE.txt" /> <ComponentRef Id="README.txt" /> <ComponentRef Id="ApplicationShortcut" /> </Feature> </Product> </Wix>

Edit.2:是在JRE目錄上運行“heat”得到的文件。

注意:我沒有回答我自己的問題,但是當我發現使用 NSIS( Nullsoft Scriptable Install System )構建安裝程序會容易得多時,我停止了調查,因為已經有一個 Ant 任務和幾個 GNU Linux 發行版的一些包(包括Mageia 、Fedora 等)使其工作。 您可以找到一個名為Java Launcher的腳本來查找您的軟件和操作系統中的 JRE(盡管我建議您在您的軟件中捆綁一個 OpenJDK JRE,以確保它在更新或缺少操作系統中的一個 JRE)、 另一個自動安裝 JRE 的腳本和一個基於 Java 的軟件的 nsi 腳本的基本示例

PS:順便說一下,我現在使用我自己的工具(它在引擎蓋下使用 Redline RPM),它有完整的文檔記錄,開源(在 GPL 下),並且也適用於 RPM、DEB、APP 和 EXE(通過 NSIS),它是稱為Java 本機部署工具包

來自 Java 8/9 的 OpenJDK 項目的javapackager包括打包 MSI 安裝程序(使用 WIX)的能力,其中包括已安裝應用程序的自定義 JRE 安裝。 如果您不希望使用隨 Oracle Java 提供的打包程序或從 OpenJDK 源代碼編譯的打包程序,也許查看javapackager 源代碼可能會幫助您創建自己的打包實用程序。

許可似乎是您關心的問題 - 因此,如果您采用此路徑,則可以檢查OpenJDK 法律文檔是否適合您的情況。 請注意,如果您使用 OpenJDK,則Oracle BCL不適用。

我沒有詳細檢查 javapackager 源代碼,但它可能對 Java 8 功能有一些依賴。 由於您的目標是創建基於 JRE 7 的包,因此您可以使用 Java 8 運行時來執行打包程序,但將 Java 7 JRE 打包為目標。 如果您必須使用 Java 7 運行時運行打包工具並且打包程序代碼使用 Java 8 功能 - 您可以將其分叉並將其向后移植到 Java 7(您需要一些非常嚴格的要求來要求這樣做 - 大多數人不會有這樣的要求)。

我不建議將上述方法作為完成任務的最理想方式 - 我只是拋出一些可能對您有用也可能沒有用的想法。

升級到 Java 14+ 並使用內置的jpackage工具(它是 Jave 8/9 的“jpackager”的后代)。 像大多數一樣,它為您運行它的系統生成包:

  1. Linux:deb 和 rpm
  2. macOS:pkg 和 dmg
  3. Windows:msi 和 exe

它使用 jdeps 和 jlink 構建一個最小的 JRE 以包含在安裝程序中,避免了單獨下載 Java 的需要。 此外,每次下載 JDK 時它都是免費的。 感謝 Kevin Rushforth 和 JEP343 團隊! https://bugs.openjdk.java.net/browse/JDK-8200758閱讀開發日志或執行jpackage --help 請注意,從 Java14 開始,它在技術上仍處於“孵化”階段,因此某些功能可能會發生變化。

我運行一個名為IsWiX的開源項目來處理這種情況。 您可以觀看為 WPF .NET 桌面應用程序創建 MSI 的視頻(鏈接如下)。

Java 應用程序的概念是相同的。 您只需將 JRE 的私有實例與您的應用程序一起部署,並創建一個指向 .BAT 文件的快捷方式。 您唯一要做的就是創建一個指向您的 ICO 文件的 Icon 元素,並在 Shortcut 元素上設置一個屬性以指向該圖標。 在編譯代碼世界中,我們不必這樣做,因為快捷方式將自動顯示目標可執行文件中的默認圖標資源。

可以在此處找到有關視頻的一些內容:

使用 IsWiX 構建和部署 Windows 桌面應用程序

和(無聲)視頻本身:

使用 IsWiX 構建和部署 Windows 桌面應用程序

剛剛偶然發現了這個問題。 也許我的兩分錢可以提供幫助。 我一起使用兩個 Maven 插件:

1)launch4j-maven-plugin(com.akathist.maven.plugins.launch4j)用於將jar包在一個exe文件中。 它還允許指定最低 Java 版本。 這樣,您不必隨 msi 一起提供 java 版本(然后必須不時更新),而只需將用戶重定向到 java 下載頁面(輕量級解決方案)。 Launch4J 有很多其他功能,這使您的 Java 應用程序在 SplashScreen 上看起來更好,或者您可以傳遞啟動參數,這很好。 這樣你就可以通過在 pom.xml 中設置一些屬性來構建非常自定義的安裝程序

2) wix-maven-plugin (org.bitbucket.joxley) 由於我們現在有一個 exe,我們可以創建一個非常好的安裝程序,在安裝過程結束時帶有桌面快捷方式和“立即啟動”復選框。

這種組合並不是最容易實現的,但是一旦到位,您就有無數的選擇來構建不同版本的軟件(評估副本/專業版)和自定義軟件(例如,安裝程序的不同外觀和感覺,甚至附加不同的軟件許可證是可能的)。 使用 launch4J 插件中設置的命令行參數,您可以創建一個以特定狀態或特定配置啟動的應用程序。

我們在生產中使用該解決方案已有好幾年了。

為此,正在開發一種新工具:jpackage

如果您的項目是使用Gradle構建的,那么您可以輕松使用Badass jlink插件: https : //github.com/beryx/badass-jlink-plugin使用帶有綁定的JVM的jpackage來構建安裝程序/軟件包

這是一篇文章,介紹如何使用OpenJDK 11和帶有jpackage的OpenJDK 14構建應用程序映像,僅用於構建安裝程序/軟件包: https : //walczak.it/blog/distributing-javafx-desktop-applications-without-requiring-jvm-使用jlink和jpackage

暫無
暫無

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

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