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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何为Java程序创建MSI Windows安装程序?相关的知识,希望对你有一定的参考价值。

我想为Java程序创建一个Microsoft Installer文件。我无法使用Netbeans或任何Maven插件来执行此操作,因为我无法使用Oracle Java和/或JavaFX(主要是出于法律原因),并且两者似乎都使用Oracle本机部署+ JavaSE 1.8。

My current archive包含:

  • Java运行时环境(OpenJDK 1.7 JRE)
  • 一个脚本(.bat)
  • 一个肥胖的JAR
  • 一个图标文件
  • 一些文本文件

我不想使用系统的JRE,这就是我提供另一个JRE的原因。该脚本只使用一些参数调用JRE。图标文件采用.ico格式。胖JAR是包含所有必需的Java类,本机库和资产(包括第三方库)的JAR。

我想允许最终用户安装,运行和卸载我的程序。我想在开始菜单中提供一个快捷方式来运行它,另一个快捷方式来卸载它。似乎是here解释。我是否必须使用其他任何东西来创建卸载程序的快捷方式?

我已经看了几周Wix Toolset。我知道我必须写一个wxs文件与“candle.exe”一起使用,它会创建一个wixobj文件,我必须用这个文件运行“light.exe”,我得到一个MSI文件。

我知道如何添加文件,它解释了here,但我不知道如何添加包含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="SoftwareMicrosoftTrulyUnusualExperienceofRevolution" 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:This是通过在JRE目录上运行“heat”获得的文件。

注意:我没有回答我自己的问题,但是当我发现使用NSIS(Nullsoft Scriptable Install System)构建安装程序会更容易,因为已经有an Ant task和几个GNU Linux发行版的一些软件包(包括Mageia,Fedora) ,...)使它工作。您可以找到一个名为Java Launcher的脚本来在您的软件和操作系统中查找JRE(尽管我建议您在您的软件中捆绑OpenJDK JRE,以确保尽管更新或没有更新,它仍会继续工作JRE在操作系统中),another script with automatic JRE installationa rudimentary example of nsi script for a Java based software

PS:顺便说一下,我现在使用我自己的工具(在引擎盖下使用Redline RPM),它是完全记录的,开源的(在GPL下),也适用于RPM,DEB,APP和EXE(通过NSIS),它是叫Java Native Deployment Toolkit

答案

来自OpenJDK项目Java 8/9的javapackager包括能够打包MSI安装程序(使用WIX),其中包括已安装应用程序的自定义JRE安装。如果您不希望使用随Oracle Java提供的打包程序或从OpenJDK源编译的打包程序,那么查看javapackager source code可能会帮助您创建自己的打包实用程序。

许可似乎是您的一个问题 - 因此,如果您采用此路径,您可以检查OpenJDK legal documents是否适合您的情况。请注意,如果您使用OpenJDK,则Oracle BCL不适用。

我没有详细检查javapackager源代码,但它可能依赖于Java 8功能。由于您的目标是创建基于JRE 7的程序包,因此您可以使用Java 8运行时来执行打包程序,但将Java 7 JRE打包为目标。如果必须使用Java 7运行时运行打包工具并且打包器代码使用Java 8功能 - 您可以将其分叉并将其反向移植到Java 7(您需要一些非常严格的要求才能要求这样做 - 大多数人都没有这样的要求)。

我不建议将上述内容作为完成任务的最理想方式 - 我只是抛出一些可能对您有用或可能没有用的想法。

另一答案

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

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

在这里可以找到一些关于视频的文章:

Building and Deploying a Windows Desktop Application using IsWiX

而(沉默)视频本身:

Building and Deploying a Windows Desktop Application using IsWiX

另一答案

只是偶然发现了这个问题。也许我的两分钱可以提供帮助。我一起使用两个maven插件:

1)launch4j-maven-plugin(com.akathist.maven.plugins.launch4j)用于将jar包装在exe文件中。它还允许指定最小java版本。这样,您不必使用msi发布java版本(然后必须不时更新),而只是将用户重定向到Java下载页面(轻量级解决方案)。 Launch4J有许多其他功能,这使得你的java应用程序看起来更好f.i.一个SplashScreen或者你可以传递启动参数,这很好。这样,您只需在pom.xml中设置一些属性即可构建非常自定义的安装程序

2)wix-maven-plugin(org.bitbucket.joxley)由于我们现在有一个exe,我们可以创建一个非常好的安装程序,在安装过程结束时使用桌面快捷方式和“立即启动”复选框。

这种组合并不是最容易实现的组合,但一旦实施,您就有无数的选择来构建软件的不同版本(评估复制/专业版)并自定义您的软件(例如安装程序的不同外观,甚至可以附加不同的软件许可证)。使用launch4J插件中设置的命令行参数,您可以创建一个以特定状态或特定配置启动的应用程序。

我们现在在生产中使用该解决方案已有好几年了。

以上是关于如何为Java程序创建MSI Windows安装程序?的主要内容,如果未能解决你的问题,请参考以下文章

C# 如何为 Windows 服务创建安装项目以自动安装它?

如何为 pyqt 项目创建 Windows 安装程序

如何为 Mac/Windows 捆绑 Java 应用程序?

如何为 Windows 10 的 HDF5view 应用程序安装 java

如何为我的 Java 应用程序创建 Linux Ubuntu/OpenSUSE 安装程序?

windows server 2008安装msi程序是提示必须安装windows installer服务的windows service pack