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

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

我还需要一个安装程序。

492395 次浏览

在我看来,JSmooth似乎做得相当不错。

更新: GCJ死了。它是2016年GCC项目中的正式取消。甚至在此之前,它实际上已经被放弃了7年,无论如何从来都不够完整都是一个可行的替代Java实现。

去找另一个Java AOT编译器。

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

虽然GCJ并不支持Java中的所有内容,特别是GUI组件(参见GCJ) 支持哪些Java API ?支持有多完整?问题来自常见问题解答)。我很少使用GCJ,但从我对控制台应用程序所做的有限测试来看,它似乎还不错

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

就开源安装程序而言,Nullsoft脚本安装系统是一个可编写脚本的安装程序。如果您感到好奇,可以参考用户提供的示例,了解如何检测JRE的存在并在未安装所需JRE时自动安装JRE。(只是想让你知道,我以前没有用过NSIS。)

有关使用NSIS安装Java应用程序的更多信息,请查看我的回答中的问题&;分发Java应用程序的最佳方式是什么?"

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 README

Packr是另一个开源工具。

JSmooth

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

- JSmooth网站

JSmooth是开源的,也有一些特性,但是它非常古老。上一次发布是在2007年。

JexePack

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

- JexePack的网站

JexePack是试用软件。生产使用需要付费,使用此工具创建的exe文件将显示“提醒”;没有付款。而且,上一次发布是在2013年。

InstallAnywhere

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

- InstallAnywhere网站

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

可执行JAR文件

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


欲了解更多信息

Excelsior的文章“将Java转换为EXE -为什么,何时,何时不和如何"”是关于这个主题的一个很好的信息来源。

参见配套文章& 最好的JAR到EXE转换工具,免费和商业"。

Launch4j

Launch4j是一种跨平台工具,用于包装以jar形式分布在轻量级Windows本机可执行文件中的Java应用程序。可执行文件可以配置为搜索特定的JRE版本或使用捆绑的JRE版本,还可以设置运行时选项,比如初始/最大堆大小。包装器还通过应用程序图标、原生预JRE启动屏幕、自定义进程名和Java下载页面(如果找不到合适的JRE)提供更好的用户体验。

- Launch4j网站

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

它很容易定制,直到您想要为标准对话框无法完成的特殊操作编写脚本。但是即使我们用它来设置windows服务,我们也只是使用标准组件。

  • 安装程序+启动程序
  • Windows或Unix
  • Java脚本
  • ant任务
  • 大量可定制的标准面板和操作
  • 可选地包括或下载JRE
  • 还能启动Windows服务吗
  • 多种语言

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

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

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

EDIT 2018: Java Web Start不再与最新的JDK绑定。甲骨文正在推动一种“使用封闭的JRE在本地部署应用程序”的模式。

如果您需要将整个应用程序转换为本机代码,即EXE加dll,有ExcelsiorJET。我发现它工作得很好,并提供了捆绑JRE的替代方案。

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

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

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

如果真的有必要将其转换为exe, Jar2Exe转换器可以默默地完成,也可以附加与主应用程序一起编译的库。

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

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

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

你可以用下面的代码创建一个批处理文件:

start javaw -jar JarFile.jar

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

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

从intelij你将只能生成罐子

尝试下面的例子:https://www.genuinecoder.com/convert-java-jar-to-exe/

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

它还可以与jlink一起使用,以构建精简的Java运行时映像,该映像与安装程序捆绑在一起,只包含支持应用程序所需的模块集。如果没有指定运行时,jlink步骤也将由jpackage隐式运行,但我更喜欢单独制作JRE映像,因为它只在更新JDK或向项目添加新的模块依赖项时才会更改。

Java类的main示例:

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 / etc)来重新生成:

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

自从第一次提出这个问题以来,封装和部署已经发生了很大的变化。给出的大多数答案甚至都不是JIGSAW (Java 9+)的最新版本。

如果目标是创建特定于操作系统的包,则在Oracle Docs Java 17 包装工具使用指南中提供了相关信息。本指南包括jpackage工具的文档,该工具允许为Linux、macOS和Windows创建特定于平台的包。我认为Windows特定的指令应该包括生成.exe文件,因为这仍然是Windows用户安装和运行应用程序最熟悉的方式。

我个人创建exe(在itch.io上出售)的经验是使用Java平台,标准版部署指南,其中包括使用工具Inno Setup 5。这个文档比较老,是针对Java 9的。直接与.exe打包相关的部分位于在这里作为第一步,我使用jlink来制作一个自包含的包。当我第一次纠结于这个问题时,我无法弄清楚如何让jpackage与我的模块化程序一起工作。但现在Jigsaw已经问世好几年了,jpackage现在可能更容易使用了,它将是我为Windows用户发布的下一款Java应用的首选。