551

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

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

4

16 回答 16

362

打包程序

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

– Oracle 的文档

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

WinRun4J

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

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

– WinRun4J 的网页

WinRun4J 是一个开源实用程序。它有很多特点。

打包机

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

– 打包器自述文件

packr 是另一个开源工具。

JS平滑

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 文件。

可执行的 JAR 文件

作为 .exe 文件的替代方法,您可以通过向 JAR 清单添加入口点来创建双击时自动运行的 JAR 文件。


了解更多信息

Excelsior 的文章“将 Java 转换为 EXE – 为什么、何时、何时不以及如何”是有关该主题的一个极好的信息来源。

另请参阅配套文章“最佳 JAR 到 EXE 转换工具,免费和商业”。

于 2008-09-29T01:42:12.813 回答
120

启动4j

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

– Launch4j 的网站

于 2008-09-29T08:10:37.437 回答
39

更新: 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 应用程序的最佳方式是什么? ”的回答。

于 2008-09-29T01:40:25.003 回答
28

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

start javaw -jar JarFile.jar

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

于 2013-08-17T15:42:04.803 回答
20

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

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

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

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

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

于 2008-09-29T13:01:46.190 回答
18

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

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

于 2009-05-27T10:09:54.533 回答
12

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

于 2008-09-29T01:37:33.560 回答
12

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

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

于 2010-04-29T01:38:47.477 回答
9

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

于 2012-08-27T18:40:48.410 回答
8

您可以使用珍妮尔。最后一个用作应用程序启动器或服务启动器(可从 4.x 获得)。

于 2013-06-10T09:13:54.803 回答
8

从 JDK14 开始,@Jay 回答中提到的jpackage替换。javapackagerWindows 版本需要 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
于 2021-06-01T12:51:00.510 回答
7

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

于 2010-05-28T14:26:14.263 回答
6

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

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

于 2012-07-19T13:16:24.370 回答
4

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

于 2012-10-16T17:22:14.640 回答
0

注意事项:自从第一次提出这个问题以来,打包和部署已经发生了很大变化。给出的大多数答案都不是最新的 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 应用程序的首选。

于 2022-01-04T09:26:57.153 回答
-2

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

从 intelij 你将只能生成 jar

尝试遵循下一个示例:https ://www.genuinecoder.com/convert-java-jar-to-exe/

于 2020-06-20T13:44:35.890 回答