如何为Java程序创建MSI Windows安装程序?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何为Java程序创建MSI Windows安装程序?相关的知识,希望对你有一定的参考价值。
我想为Java程序创建一个Microsoft Installer文件。我无法使用Netbeans或任何Maven插件来执行此操作,因为我无法使用Oracle Java和/或JavaFX(主要是出于法律原因),并且两者似乎都使用Oracle本机部署+ JavaSE 1.8。
- 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 installation和a 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 服务创建安装项目以自动安装它?
如何为 Windows 10 的 HDF5view 应用程序安装 java
如何为我的 Java 应用程序创建 Linux Ubuntu/OpenSUSE 安装程序?
windows server 2008安装msi程序是提示必须安装windows installer服务的windows service pack