如何为 Java 程序创建 MSI Windows 安装程序?

gou*_*sej 5 java windows-installer wix

我想为 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>
Run Code Online (Sandbox Code Playgroud)

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 本机部署工具包

ida*_*win 6

升级到 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 开始,它在技术上仍处于“孵化”阶段,因此某些功能可能会发生变化。


Chr*_*ter 1

我运行一个名为IsWiX 的开源项目来处理这种情况。您可以观看为 WPF .NET 桌面应用程序创建 MSI 的视频(下面链接)。

对于 Java 应用程序来说,这些概念是相同的。您只需将 JRE 的私有实例与应用程序一起部署,并创建指向 .BAT 文件的快捷方式。您唯一要做的自定义操作是创建一个指向 ICO 文件的 Icon 元素,并在 Shortcut 元素上设置一个属性以指向该图标。在编译的代码世界中,我们不必这样做,因为快捷方式将自动显示目标可执行文件中的默认图标资源。

可以在这里找到有关视频的一些文字:

使用 IsWiX 构建和部署 Windows 桌面应用程序

以及(无声)视频本身:

使用 IsWiX 构建和部署 Windows 桌面应用程序