如果我有 Java 源文件 (*.java) 或类文件 (*.class),如何将其转换为 .exe 文件?
我还需要我的程序的安装程序。
Java Packager 工具编译、打包和准备 Java 和 JavaFX 应用程序以进行分发。javapackager 命令是命令行版本。
– Oracle 的文档
该javapackager
实用程序随 JDK 一起提供。它可以生成带有标志的 .exe 文件-native exe
,等等。
WinRun4j 是一个用于 Windows 的 java 启动器。它是 javaw.exe 的替代品,具有以下优点:
- 使用 INI 文件指定类路径、主类、虚拟机参数、程序参数。
- 显示在任务管理器中的自定义可执行文件名称。
- 额外的 JVM 参数,用于更灵活的内存使用。
- 自定义图标的内置图标替换器。
- [更多要点如下]
– WinRun4J 的网页
WinRun4J 是一个开源实用程序。它有很多特点。
打包您的 JAR、资产和 JVM,以便在 Windows、Linux 和 Mac OS X 上分发,添加本机可执行文件以使其看起来像本机应用程序。Packr 最适合 GUI 应用程序。
– 打包器自述文件
packr 是另一个开源工具。
JSmooth 是一个 Java 可执行包装器。它为您的 Java 应用程序创建本机 Windows 启动器(标准 .exe)。它使 Java 部署更加顺畅和用户友好,因为它能够自行找到任何已安装的 Java VM。
– JSmooth 的网站
JSmooth 是开源的,有特点,但是很老了。最后一次发布是在 2007 年。
JexePack是一个命令行工具(非常适合自动编写脚本),它允许您将 Java 应用程序(类文件)以及它的资源(如 GIF/JPG/TXT/等)打包成单个压缩的 32 位 Windows EXE ,它使用 Sun 的 Java 运行时环境运行。支持控制台和窗口应用程序。
– JexePack 的网站
JexePack 是试用软件。生产使用需要付费,使用此工具创建的exe文件会显示“提醒”,无需付费。此外,最后一次发布是在 2013 年。
InstallAnywhere 使开发人员可以轻松地为任何平台创建专业的安装软件。借助 InstallAnywhere,您将快速适应行业变化、更快进入市场并提供引人入胜的客户体验。并在发货前了解您项目的 OSS 组件的漏洞。
– InstallAnywhere 的网站
InstallAnywhere 是一个商业/企业软件包,可为基于 Java 的程序生成安装程序。它可能能够创建 .exe 文件。
作为 .exe 文件的替代方法,您可以通过向 JAR 清单添加入口点来创建双击时自动运行的 JAR 文件。
Excelsior 的文章“将 Java 转换为 EXE – 为什么、何时、何时不以及如何”是有关该主题的一个极好的信息来源。
另请参阅配套文章“最佳 JAR 到 EXE 转换工具,免费和商业”。
Launch4j 是一个跨平台工具,用于将作为 jar 包分发的 Java 应用程序打包到轻量级 Windows 本机可执行文件中。可执行文件可以配置为搜索某个 JRE 版本或使用捆绑的版本,并且可以设置运行时选项,例如初始/最大堆大小。包装器还通过应用程序图标、本地 pre-JRE 启动屏幕、自定义进程名称和 Java 下载页面提供更好的用户体验,以防找不到合适的 JRE。
– Launch4j 的网站
更新: GCJ 死了。它于 2016 年正式从 GCC 项目中删除。甚至在此之前,它实际上已经被废弃了 7 年,而且无论如何它都还不够完整,无法作为可行的替代 Java 实现。
去找另一个 Java AOT 编译器。
GCJ:GNU Compiler for Java可以将 Java 源代码编译为本机机器代码,包括 Windows 可执行文件。
尽管 GCJ 并不支持 Java 中的所有内容,尤其是 GUI 组件(请参阅 支持哪些 Java API?支持有多完整?FAQ中的问题)。我没有太多使用 GCJ,但从我对控制台应用程序所做的有限测试来看,它似乎还不错。
使用 GCJ 创建独立可执行文件的一个缺点是生成的 EXE 的大小可能非常大。有一次我在 GCJ 中编译了一个简单的控制台应用程序,结果是一个大约 1 MB 的可执行文件。(可能有一些我不知道的方法。另一种选择是可执行压缩程序。)
在开源安装程序方面,Nullsoft Scriptable Install System是一个可编写脚本的安装程序。如果您好奇,有一些用户提供的示例说明如何检测 JRE 的存在并在未安装所需 JRE 时自动安装它。(只是让你知道,我以前没有使用过 NSIS。)
有关使用 NSIS 安装 Java 应用程序的更多信息,请查看我对问题“分发 Java 应用程序的最佳方式是什么? ”的回答。
您可以使用以下代码制作批处理文件:
start javaw -jar JarFile.jar
并使用任何 .bat 到 .exe 转换器将 .bat 转换为 .exe。
我们正在使用Install4J为 windows 或 unix 环境构建安装程序。
它可以轻松定制,直到您想要为标准对话无法完成的特殊操作编写脚本。但即使我们使用它设置 Windows 服务,我们也只使用标准组件。
我认为 Launch4J 来自同一家公司(只是启动器 - 没有安装程序)。
PS:很遗憾我没有得到这个代言的报酬。我就是喜欢那个工具。
最新的Java Web Start已得到增强,允许良好的离线操作以及允许“本地安装”。值得研究。
编辑 2018:Java Web Start 不再与最新的 JDK 捆绑在一起。Oracle 正在推动“使用封闭的 JRE 在本地部署您的应用程序”模型。
恕我直言, JSmooth似乎做得很好。
如果您需要将整个应用程序转换为本机代码,即 EXE 加 DLL,则有ExcelsiorJET。我发现它运行良好,并提供了捆绑 JRE 的替代方法。
编辑:这是在 2010 年发布的 - 该产品不再可用。
我想说launch4j是将java源代码(.java)转换为.exe文件的最佳工具您甚至可以将jre与它捆绑在一起进行分发,甚至可以将exe图标化。尽管应用程序的大小增加了,但它确保即使用户没有安装 jre,应用程序也能完美运行。它还确保您能够提供应用所需的特定 jre,而无需用户单独安装。但不幸的是,java 失去了它的重要性。它的多平台支持完全被忽略了,最终的应用程序只支持 Windows。但这没什么大不了的,如果您只为 Windows 用户提供服务。
您可以使用珍妮尔。最后一个用作应用程序启动器或服务启动器(可从 4.x 获得)。
从 JDK14 开始,@Jay 回答中提到的jpackage替换。javapackager
Windows 版本需要 Wix 3.0,使用 java 应用程序并构建提供 EXE 启动器的安装程序相当简单。
它还可以与jlink一起使用来构建一个精简的 Java 运行时映像,该映像与安装程序捆绑在一起,并且只包含支持您的应用程序所需的模块集。如果未指定运行时,该jlink
步骤也将由 jpackage 隐式运行,但我更喜欢单独制作 JRE 映像,因为它只会在您更新 JDK 或向项目中添加新模块依赖项时更改。
Java 类的主要示例:
package exe;
public class Main {
public static void main(String[] args) {
for (int i = 0; i < args.length; i++) {
System.out.println("args["+i+"]="+args[i]);
}
}
}
以下是在 Windows 上构建的示例步骤 - 显然您已经设置了本地构建环境(Maven / ant / 等)来重新生成它:
mkdir jpackage.input\jars tmp
javac -d tmp src\exe\Main.java
pushd tmp && jar cvf ..\jpackage.input\jars\myapp.jar . && popd
检查它是否运行:
java -cp jpackage.input\jars\myapp.jar exe.Main X Y Z
使用 jlink 为应用程序使用的一组模块创建运行时映像:
set jlink.modules=java.base
jlink --add-modules %jlink.modules% --strip-debug --no-man-pages --no-header-files --compress=1 --output jpackage.jre
如果上面缺少模块,您应该检查 jlink JRE 运行时映像是否可以运行您的应用程序:
jpackage.jre\bin\java -cp jpackage.input\jars\myapp.jar exe.Main X Y Z
使用 jpackage 生成安装程序,应用程序版本基于日期+小时(这样可以节省每次重新安装时都需要卸载)并打印出所有系统属性 - 测试后删除参数“-XshowSettings:properties”:
set appver=%date:~6,2%.%date:~3,2%.%date:~0,2%%time:~0,2%
jpackage --win-console --input jpackage.input --runtime-image jpackage.jre --app-version %appver% --type exe --name "MyApp" --dest jpackage.dest --java-options "-XshowSettings:properties" --main-jar jars\myapp.jar --main-class exe.Main
运行安装程序:
jpackage.dest\MyApp-%appver%.exe
测试应用程序:
"C:\Program Files\MyApp\MyApp.exe" ONE 2 THREE
... Prints system properties ...
args[0]=ONE
args[1]=2
args[2]=THREE
或者,您可以使用一些 java-to-c 转换器(例如JCGO)并将生成的 C 文件编译为目标平台的本地二进制 (.exe) 文件。
我反对将 java 程序转换为 .exe 应用程序是可以原谅的,我有我的理由。主要的一点是可以从很多 IDE 中将 java 程序编译为 jar 文件。当程序为 .jar 格式时,它可以在多个平台上运行,而 .exe 则只能在非常有限的环境中运行。我赞成 Java 程序不应该转换为 Exe 的想法,除非它是非常必要的。人们总是可以编写运行 Java 程序的 .bat 文件,而它是一个 jar 文件。
如果确实需要将其转换为 exe,Jar2Exe 转换器会默默地执行此操作,并且还可以附加与主应用程序一起编译的库。
您可以使用jar2exe将 jar 转换为 exe 。但是,您需要购买该软件。如果您需要开源软件,我建议您使用JSmooth。
注意事项:自从第一次提出这个问题以来,打包和部署已经发生了很大变化。给出的大多数答案都不是最新的 JIGSAW (Java 9+)。
如果目标是创建特定于操作系统的包,Oracle Docs Java 17 Packaging Tool User Guide中提供了信息。本指南包括该jpackage
工具的文档,它允许人们为 Linux、macOS 和 Windows 创建特定于平台的包。我认为特定于 Windows 的说明应包括获取 .exe 文件,因为这仍然是 Windows 用户安装和运行应用程序最熟悉的方式。
我自己创建 exe(在 itch.io 上出售)的个人经验是使用Java 平台标准版部署指南,其中包括使用工具Inno Setup 5。该文档较旧,适用于 Java 9。与 .exe 打包直接相关的部分位于此处作为第一步,我曾经jlink
制作一个自包含的包。当我第一次为此争论不休时,我无法弄清楚如何jpackage
使用我的模块化程序。但是现在 Jigsaw 已经存在了好几年,jpackage
现在可能更容易使用,并且将是我可能为 Windows 用户发布的下一个 Java 应用程序的首选。
Java 项目导出为 Jar 可执行文件。当你想做一个java项目的.exe文件时,你可以做的是将JAR“转换”为EXE(我说我在引号之间加上了转换,因为不完全是这样)。
从 intelij 你将只能生成 jar
尝试遵循下一个示例:https ://www.genuinecoder.com/convert-java-jar-to-exe/