java 程序如何打包成为一个可执行文件? Launch4j
拓展阅读
Maven Launch4j 插件
描述
Launch4j 由 Grzegorz Kowal 开发,旨在将 JAR 文件封装成 Windows 可执行文件,简化 Java 桌面应用程序的部署。您可以选择将 JRE 打包在内,或者让 Launch4j 在硬盘上查找现有的 JRE。如果未找到 JRE,Launch4j 会显示下载页面。Launch4j 提供了许多功能,包括创建图形界面应用程序或控制台应用程序。您可以在 JRE 加载时显示启动画面,给您的应用程序设置自定义图标,修改 Windows 任务栏中的进程名称(默认是“java”),并设置其他多种进程属性。
Launch4j 可以在 Windows、Linux、Solaris 或 OS X 上运行。您可以通过 XML 文件来指定配置。有关此配置文件的更多信息,请访问 Launch4j 网站。您还可以通过 Launch4j GUI 来设置配置。
Maven 插件允许您在 Maven 构建过程中生成 Launch4j 可执行文件。它支持 Maven 2.0.4 和 Launch4j 3.x。根据操作系统,插件将下载一个包含平台特定二进制文件的额外工件,这些文件由 Launch4j 用于创建可执行文件。这个工件就像任何其他 Maven 依赖项一样,仅在第一次需要时下载。
将插件添加到 pom.xml
使用 Maven 插件,您可以在 POM 中指定 Launch4j 配置。我计划在未来支持外部配置文件,但目前必须使用 POM。此配置的格式与标准的 Launch4j XML 格式非常相似。主要有两个区别。首先,任何具有相同名称的元素列表必须包含在一个包装元素中。例如,您不能写:
[source,xml]
logo.bin
this=that
foo=bar
blep=blurp
您必须写成:
[source,xml]
logo.bin
this=that
foo=bar
blep=blurp
同样,和
元素也需要遵循此规则。
第二, 元素的子元素有些不同。这是为了便于根据您的依赖项设置类路径。
仍然包含 元素,但不再包含
元素。相反,它支持以下子元素:
`` - 如果设置为 "true",插件将基于运行时和编译时作用域中的所有依赖项构建类路径。默认情况下开启。
`` - 如果启用了
addDependencies
特性,您可以使用此选项为每个 JAR 文件名添加前缀。如果您将应用程序与可执行文件一起打包,并且有一个 lib 目录包含所有 JAR 文件,则可以设置lib/
。- 在自动生成的类路径之前添加类路径条目。无论您是否启用了
,此元素都能正常工作。条目之间应该用分号分隔,就像 Windows 样式的CLASSPATH
变量一样。- 在自动生成的类路径之后添加类路径条目。无论您是否启用了
,此元素都能正常工作。条目之间应该用分号分隔,就像 Windows 样式的CLASSPATH
变量一样。
除此之外,XML 格式与 Launch4j 的标准格式相同。
== 示例
单模块项目
默认情况下,Launch4j 插件绑定到 package
阶段。假设您有一个名为 encc
的单模块项目,它是一个控制台应用程序,而不是图形界面应用程序,并且它以 JAR 文件形式打包,因此在 package
阶段会自动运行打包任务。在此过程中,您想使用 Launch4j 创建一个可执行文件,然后使用 assembly 插件将所有内容打包在一起。您可以将 Launch4j 和 assembly 插件都绑定到 package
阶段,POM 配置如下:
. . .
com.akathist.encc
encc
jar
. . .
com.akathist.maven.plugins.launch4j
launch4j-maven-plugin
l4j-clui
package
launch4j
console
target/encc.exe
target/encc-1.0.jar
encc
com.akathist.encc.Clui
false
anything
1.5.0
-Djava.endorsed.dirs=./endorsed
1.2.3.4
txt file version?
a description
my copyright
4.3.2.1
txt product version
E-N-C-C
ccne
original.exe
maven-assembly-plugin
assembly
package
single
assembly.xml
. . .
注意:当您将 assembly 插件绑定到某个阶段时,必须使用 assembly:single
,而不是 assembly:assembly
,以避免其启动一个并行生命周期并重复执行。
GUI 和控制台模式
假设您的应用程序可以在 GUI 模式或控制台模式下运行,并且您希望为每种模式创建一个单独的可执行文件。那么您的 POM 配置如下:
. . .
com.akathist.encc
encc
jar
. . .
com.akathist.maven.plugins.launch4j
launch4j-maven-plugin
l4j-clui
package
launch4j
console
target/encc.exe
target/encc-1.0.jar
encc
com.akathist.encc.Clui
false
anything
1.5.0
-Djava.endorsed.dirs=./endorsed
1.2.3.4
txt file version?
a description
my copyright
4.3.2.1
txt product version
E-N-C-C
ccne
original.exe
maven-assembly-plugin
assembly
package
single
assembly.xml
. . .
注意,当你将 assembly 插件绑定到某个阶段时,必须使用 assembly:single
,而不是 assembly:assembly
,以防止它启动一个并行生命周期并使得所有内容运行两次。
GUI 和控制台模式
或者假设你的应用程序可以在 GUI 或控制台模式下运行,并且你想为每种模式创建不同的可执行文件。那么你的 POM 配置文件应如下所示:
. . .
com.akathist.encc
encc
jar
. . .
com.akathist.maven.plugins.launch4j
launch4j-maven-plugin
l4j-clui
package
launch4j
console
target/encc.exe
target/encc-1.0.jar
encc
com.akathist.encc.Clui
false
anything
1.5.0
1.2.3.4
txt file version?
a description
my copyright
4.3.2.1
txt product version
E-N-C-C
ccne
original.exe
l4j-gui
package
launch4j
gui
target/enccg.exe
target/encc-1.0.jar
enccg
com.akathist.encc.Gui
1.5.0
1.2.3.4
txt file version?
a description
my copyright
4.3.2.1
txt product version
E-N-C-C
ccne
original.exe
maven-assembly-plugin
assembly
package
single
assembly.xml
. . .
参考资料
https://github.com/orphan-oss/launch4j-maven-plugin/blob/master/src/main/resources/README.adoc