软件基础
Windows 10、JDK-14.0.2、Maven 3.6.3、NetBeans 12.0、WiX Toolset v3.11.2
基于NetBeans和Maven打包Java项目
在NetBeans中把基于Maven的Java项目(Maven项目)打包成可执行的JAR包,有两种方式,一是把项目的所有第三方依赖和主程序构建成一个JAR包,通过这种方式构建出来的JAR包,会包含自己写的代码编译后的所有class文件,第三方依赖,Maven配置文件(pom.properties+pom.xml
),和存储了jdk版本、包含有main函数的主类等基本信息的清单文件MANIFEST.MF
,这样的JAR包在配置了Java环境
的平台中可以独立运行。二是把项目的主程序构建成JAR包,并把项目的所有第三方依赖存储在lib文件夹中,JAR包除了第三方依赖外和第一种方式的差不多,通过这种方式构建出来的JAR包会包含自己写的代码编译后的所有class文件,而lib文件夹则包含所有的第三方依赖JAR包,运行的条件和第一种方式的一样,但它需要把JAR包和lib文件放在同一级的目录中。
在打包Maven项目前,需要在Maven项目的pom.xml文件中的project->build->plugins
节点下添加如下的配置内容以进行项目的打包(mainClass
标签中的内容是项目启动类,即包含了主函数main的类)。此处以打包JavaUiLib项目
为例,如下为两种方式的Maven配置内容。
第一种方式
把项目的所有第三方依赖和主程序构建成一个JAR包
<!-- 第一种方式:把所有依赖和主程序打成一个JAR包 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.3</version>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.ym.ui.MyLabel</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>assembly</goal>
</goals>
</execution>
</executions>
</plugin>
第二种方式
把项目的主程序构建成JAR包,把项目的所有第三方依赖存储在lib文件夹中
<!-- 第二种方式:生成主程序JAR包和依赖lib文件夹 -->
<!-- 设置程序主类和依赖文件夹 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.ym.ui.MyLabel</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<!-- 拷贝依赖的jar包到lib文件夹 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<id>copy</id>
<phase>install</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>
${project.build.directory}/lib
</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
根据实际情况选择一种打包方式,添加了配置内容并保存后,在NetBeans中,选中目标Maven项目,右键,点击Clean and Build(清除并构建)
,即可进行打包。打包完成后,会在项目文件夹的target文件夹中看到构建出来的JAR包。此处,选择第一种方式,如下,构建生成的JAR包是JavaUiLib-1.0-SNAPSHOT.jar
双击此JavaUiLib-1.0-SNAPSHOT.jar
包,发现,是可以正常运行的,当然,它还不能在没有配置Java环境的操作系统中运行。
下载并安装WiX
从https://wixtoolset.org/releases/
下载 WiX 3.0 或更高版本,然后类似添加jdk的bin一样,将它的bin目录添加到path。此处下载的WiX是wix311-binaries.zip
,将其解压至合适的位置,此处的是D:\Software\Java\wix311-binaries
,再把bin目录(包含了各种.exe命令
的文件夹),即把D:\Software\Java\wix311-binaries
添加到path中,如此,就完成了WiX的安装与配置。如下为WiX的安装目录。
基于jpackage命令打包可安装程序
在Windows系统中使用jpackage命令打包项目之前,需要完成上述的两步程序,一是把Java项目导出为可执行的JAR包(检测JAR包是否可执行的命令是:java -jar demo.jar
,如果是GUI程序,直接双击之即可),二是下载并安装WiX,此处安装的是WiX v3.11.2
。完成这两步后,即可在Windows中生成安装文件了(.exe
)。打开cmd命令行窗口,并定位至Java项目所在的目录,此处的是E:\Projects\NetBeansProjects
(要打包的Java项目JavaUiLib
在NetBeansProjects目录
下),然后输入如下的命令:
jpackage --input JavaUiLib\target --main-jar JavaUiLib-1.0-SNAPSHOT.jar --vendor ym
其中,--input
指定了JAR包所在的目录,JavaUiLib\target
表示JavaUiLib-1.0-SNAPSHOT.jar
包在target目录下。--main-jar
指定了JAR包的名称,此处的是JavaUiLib-1.0-SNAPSHOT.jar
,--vendor
指定了程序的发布者,此处的是ym(不一定是ym,它还可以是其它发布者名称),注意,如果命令中没有加上vendor ym
,Windows会发生311错误
。打包完成后,会在NetBeansProjects目录
中生成.exe
文件,此处的是MyLabel-1.0.exe
,名称默认是main函数所在的类名,版本是1.0
。点击之,会直接进行安装,安装的过程中不会允许自己选择安装目录,而是默认安装到C:\Program Files
目录中。如果想卸载它,可如正常程序一样到控制面板\程序\程序和功能
进行卸载。
生成在NetBeansProjects目录
中的MyLabel-1.0.exe
文件大小为45MB。
安装到C:\Program Files
的MyLabel
程序的大小是123MB。
如果想进一步完善打包的.exe
文件,如使其名称可以自定义,使其在安装时可以添加 “选择安装路路径”,使其在桌面中添加快捷键等等,可使用如下的命令:
jpackage --name demo --input JavaUiLib\target --main-jar JavaUiLib-1.0-SNAPSHOT.jar --vendor ym --win-dir-chooser --win-shortcut --win-menu-group "demo" --win-menu
其中,--name
指定了.exe
文件的名称,--win-dir-chooser
指定了安装.exe
程序时会添加 “选择安装路路径”,--win-shortcut
指定了会在桌面添加快捷键,--win-menu-group
指定了启动该应用程序所在的菜单组。--win-menu
指定了把程序的快捷方式添加到系统菜单中(更多的打包命令可参考官方文档)。
至此,基于jpackage命令打包可安装程序的各个步骤就完成了,结果证明,打包好的可安装程序也可以在没有配置Java环境的操作系统中安装和运行。
官方的打包命令:https://docs.oracle.com/en/java/javase/14/docs/specs/man/jpackage.html