如何将我的 Java 程序转换为 .exe 文件?

Posted

技术标签:

【中文标题】如何将我的 Java 程序转换为 .exe 文件?【英文标题】:How can I convert my Java program to an .exe file? 【发布时间】:2010-09-13 21:57:11 【问题描述】:

如果我有 Java 源文件 (*.java) 或类文件 (*.class),如何将其转换为 .exe 文件?

我的程序还需要安装程序。

【问题讨论】:

applet 的简单 hack:使用 main 编写 C 代码并调用函数“system”,如 system("appletviewer java_src_file"); .exe 是否可以在没有 JRE 的 Windows 系统中运行? 只是为了完整(我自己没有尝试,因为我们需要 exe 包装器,而不是安装程序):安装程序包也可以使用 javapackager 创建(参见docs.oracle.com/javase/8/docs/technotes/guides/deploy/…)。要创建 EXE 或 MSI 安装程序,还需要下载并安装 Inno Setup 或 WiX。 可能是NSIS 也有帮助; nsis.sourceforge.net/Java_Launcher 自 2021 年起,GraalVM 是一种将 Java 编译为本机代码并得到 Oracle 官方支持的有趣方式。 【参考方案1】:

从 JDK14 开始,jpackage 替换了@Jay 回答中提到的javapackager。 Windows 版本需要 Wix 3.0,使用 java 应用程序并构建提供 EXE 启动器的安装程序相当简单。

它还可以与jlink 一起使用来构建一个精简的Java 运行时映像,该映像与安装程序捆绑在一起,并且只包含支持您的应用程序所需的模块集。 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 上构建的步骤:

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

使用 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

【讨论】:

【参考方案2】:

如果您需要将整个应用程序转换为本机代码,即 EXE 加 DLL,则有 ExcelsiorJET。我发现它运行良好,并提供了捆绑 JRE 的替代方法。

编辑:这是在 2010 年发布的 - 该产品不再可用。

【讨论】:

不过真的很贵。 真的也停产了。【参考方案3】:

Java 项目导出为 Jar 可执行文件。当你想做一个java项目的.exe文件时,你可以做的是将JAR“转换”为EXE(我说我在引号之间加上了转换,因为不完全是这样)。

从 intelij 你将只能生成 jar

尝试以下示例:https://www.genuinecoder.com/convert-java-jar-to-exe/

【讨论】:

【参考方案4】:

javapackager

Java Packager 工具编译、打包和准备 Java 和 JavaFX 应用程序以供分发。 javapackager 命令是命令行版本。

– Oracle 的文档

javapackager 实用程序随 JDK 一起提供。它可以生成带有-native exe 标志的.exe 文件,等等。

WinRun4J

WinRun4j 是一个用于 Windows 的 java 启动器。它是 javaw.exe 的替代品,具有以下优点:

使用 INI 文件指定类路径、主类、虚拟机参数、程序参数。 任务管理器中显示的自定义可执行文件名称。 额外的 JVM 参数可实现更灵活的内存使用。 自定义图标的内置图标替换器。 [后面有更多要点]

– WinRun4J 的网页

WinRun4J 是一个开源实用程序。它具有许多功能。

packr

打包您的 JAR、资产和 JVM 以在 Windows、Linux 和 Mac OS X 上分发,添加本机可执行文件使其看起来像本机应用程序。 Packr 最适合 GUI 应用程序。

--packr 自述文件

packr 是另一个开源工具。

JSmooth

JSmooth 是一个 Java 可执行包装器。它为您的 Java 应用程序创建本机 Windows 启动器(标准 .exe)。它使 java 部署更加流畅和用户友好,因为它能够自行找到任何已安装的 Java VM。

– JSmooth 的网站

JSmooth 是开源的,有功能,但是很老了。最后一次发布是在 2007 年。

JexePack

JexePack 是一个命令行工具(非常适合自动编写脚本),它允许您打包 Java 应用程序(类文件),以及它的资源(如 GIF/JPG/TXT/等) , 到单个 压缩 32 位 Windows EXE,它使用 Sun 的 Java 运行时环境运行。支持控制台和窗口应用程序。

– JexePack 的网站

JexePack 是试用软件。生产使用需要付费,使用此工具创建的exe文件会显示“提醒”,无需付费。此外,最后一次发布是在 2013 年。

InstallAnywhere

InstallAnywhere 使开发人员可以轻松地为任何平台创建专业的安装软件。借助 InstallAnywhere,您将快速适应行业变化、更快进入市场并提供引人入胜的客户体验。并在发布之前了解您项目的 OSS 组件的漏洞。

– InstallAnywhere 的网站

InstallAnywhere 是一个商业/企业软件包,可为基于 Java 的程序生成安装程序。它可能能够创建 .exe 文件。

可执行的 JAR 文件

作为 .exe 文件的替代方案,您可以通过 adding an entry point to the JAR manifest 创建一个双击时自动运行的 JAR 文件。


更多信息

Excelsior 的文章“Convert Java to EXE – Why, When, When Not and How”是有关该主题的一个极好的信息来源。

另见配套文章“Best JAR to EXE Conversion Tools, Free and Commercial”。

【讨论】:

最好用eclipse和Jsmooth。按照这些步骤regilanj.wordpress.com/2017/11/19/… 这些对我的情况有用吗? ***.com/questions/56674075/… 试试这个:javaexe.free.fr/html/en/JavaExe.html【参考方案5】:

您可以使用以下代码制作一个批处理文件:

start javaw -jar JarFile.jar

并使用任何 .bat 到 .exe 转换器将 .bat 转换为 .exe。

【讨论】:

一个好的包装器要么带来 JRE,要么在需要时安装它并处理错误情况。【参考方案6】:

更新: GCJ 已死。它是 2016 年来自 GCC 项目的 officially removed。即使在此之前,它实际上已经被废弃了七年,无论如何,它 was never sufficiently complete 作为一个可行的替代 Java 实现。

去寻找另一个 Java AOT 编译器。

GCJ: The GNU Compiler for Java可以将Java源代码编译为本机机器码,包括Windows可执行文件。

虽然 GCJ 并不支持 Java 中的所有内容,尤其是 GUI 组件(请参阅 What Java API's are supported? How complete is the support? 来自FAQ 的问题)。我没怎么用过 GCJ,但从我对控制台应用程序所做的有限测试来看,它似乎还不错。

使用 GCJ 创建独立可执行文件的一个缺点是生成的 EXE 的大小可能非常大。有一次我在 GCJ 中编译了一个简单的控制台应用程序,结果是一个大约 1 MB 的可执行文件。 (可能有一些我不知道的方法。另一种选择是可执行压缩程序。)

就开源安装程序而言,Nullsoft Scriptable Install System 是一个可编写脚本的安装程序。如果您好奇,有user contributed examples 介绍如何检测 JRE 的存在并在未安装所需 JRE 时自动安装它。 (只是让你知道,我以前没有使用过 NSIS。)

有关使用 NSIS 安装 Java 应用程序的更多信息,请查看my response 的问题“What's the best way to distribute Java applications?”

【讨论】:

项目实际上已经死了,我可以看到。主页上没有新闻 GNU Java 开发已基本转移到 OpenJDK,因为非 Oracle 源无法访问 TCK 进行验证。【参考方案7】:

Launch4j

Launch4j 是一个跨平台工具,用于将作为 jar 包分发的 Java 应用程序打包到轻量级 Windows 原生可执行文件中。可执行文件可以配置为搜索某个 JRE 版本或使用捆绑的版本,并且可以设置运行时选项,例如初始/最大堆大小。包装器还通过应用程序图标、本机 pre-JRE 启动屏幕、自定义进程名称和 Java 下载页面提供更好的用户体验,以防找不到合适的 JRE。

– Launch4j 的网站

【讨论】:

【参考方案8】:

最新的Java Web Start 已得到增强,允许良好的离线操作以及允许“本地安装”。值得研究。

EDIT 2018:Java Web Start 不再与最新的 JDK 捆绑在一起。 Oracle 正在推动“使用封闭的 JRE 在本地部署您的应用”模型。

【讨论】:

显然 JWS 已经加强了安全性,以至于它需要比以前更多的努力才能运行。不过,它可能对安装人员仍然有用。【参考方案9】:

您可以使用jar2exe 将 jar 转换为 exe。但是,您需要购买该软件。如果您需要开源软件,我建议您JSmooth。

【讨论】:

【参考方案10】:

恕我直言JSmooth 似乎做得很好。

【讨论】:

【参考方案11】:

您可以使用Janel。最后一个用作应用程序启动器或服务启动器(从 4.x 开始可用)。

【讨论】:

【参考方案12】:

我想说launch4j 是将java 源代码(.java) 转换为.exe 文件的最佳工具 您甚至可以将 jre 与它捆绑在一起进行分发,甚至可以将 exe 图标化。 尽管应用程序的大小增加了,但它确保即使用户没有安装 jre,应用程序也能完美运行。它还确保您能够提供应用所需的特定 jre,而无需用户单独安装。 但不幸的是,java 失去了它的重要性。它的多平台支持完全被忽略了,最终的应用程序只支持 Windows。但这没什么大不了的,如果您只为 Windows 用户提供服务。

【讨论】:

【参考方案13】:

我反对将 java 程序转换为 .exe 应用程序是可以原谅的,我有我的理由。主要的一点是可以从很多 IDE 中将 java 程序编译为 jar 文件。当程序为 .jar 格式时,它可以在多个平台上运行,而 .exe 则只能在非常有限的环境中运行。我赞成 Java 程序不应该转换为 Exe 的想法,除非它是非常必要的。可以编写运行 Java 程序的 .bat 文件,而它是 jar 文件。

如果确实需要将其转换为 exe,Jar2Exe 转换器会默默地执行此操作,并且还可以附加与主应用程序一起编译的库。

【讨论】:

问题是,java 的强大之处在于可移植性,但很多人只需要一个基本的 windows exe。就个人而言,我喜欢 java 的概念......但我想分发一些我的用户可以运行的东西,而无需下载 JRE。 这就是 Java 的强大之处,就像现在使用新的“javapackager”工具一样,您可以将 jar 文件包装成适合所有 Linux、macOS 和 Windows 系统的格式。是的,能够直接使用 .jar 文件很好,但它对用户不太友好。相反,最好为所有系统以所有可能的格式包装它,而不是将用户限制为 .exe,并在产品的网站或任何其他分发方式上提供它们。【参考方案14】:

或者,您可以使用一些 java-to-c 转换器(例如,JCGO)并将生成的 C 文件编译为目标平台的本机二进制 (.exe) 文件。

【讨论】:

我非常怀疑这种方法的有效性。我必须看到它才能相信它(想想大多数 Java 代码是对 JRE 的 API 调用,而所有这些都不存在于 C 中,更不用说语言工作方式的差异了)。【参考方案15】:

我们正在使用Install4J 为 Windows 或 unix 环境构建安装程序。

它可以轻松定制,直到您想为标准对话无法完成的特殊操作编写脚本。但即使我们使用它设置 Windows 服务,我们也只使用标准组件。

安装程序 + 启动程序 windows 或 unix 可在 Java 中编写脚本 蚂蚁任务 大量可自定义的标准面板和操作 可选择包含或下载 JRE 也可以启动windows服务 多种语言

我认为 Launch4J 来自同一家公司(只是启动器 - 没有安装程序)。

PS:遗憾的是,我没有得到这个代言的报酬。我就是喜欢那个工具。

【讨论】:

以上是关于如何将我的 Java 程序转换为 .exe 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何将python转换为exe而不保存在exe文件中的字符串? [关闭]

如何使用 cxfreeze 将我的代码从 python3.6 转换为 exe?

我需要将我的 python 3.6.1 脚本转换为 .EXE 文件。我怎么做?

尝试运行转换为 .exe 文件的 .py 程序后出现病毒警告

如何将我的 C# Basic 控制台应用程序打包成一个 EXE 文件? [复制]

如何将我的 pyglet 应用程序和所有资源编译到一个 exe 文件中?