将Java程序编译为可执行文件

131

11
这一定是重复的 :) - Thorbjørn Ravn Andersen
1
非常肯定: https://dev59.com/q3RB5IYBdhLWcg3wxZ_Y https://dev59.com/X3VC5IYBdhLWcg3wZwJT https://dev59.com/C3VC5IYBdhLWcg3w51vy http://stackoverflow.com/questions/743029/how-to-get-executable-file-of-java-programm - the.duckman
1
也是 https://dev59.com/hHI-5IYBdhLWcg3wMFW0 和 http://stackoverflow.com/questions/2305762/how-to-create-a-jar-exe-of-java-project 以及 https://dev59.com/fk3Sa4cB1Zd3GeqPytuA 的重复问题。 - Pops
7个回答

144
您可以通过以下方式将 .jar 文件转换为 .exe 文件:
alt text
(来源:viralpatel.net

1- JSmooth .exe 封装器:
JSmooth 是一个 Java 可执行文件封装器。它为您的 Java 应用程序创建本机 Windows 启动器(标准 .exe)。它使得 Java 部署更加流畅和用户友好,因为它能够自行找到任何已安装的 Java VM。当没有 VM 可用时,封装器可以自动下载并安装适当的 JVM,或者仅显示消息或将用户重定向到网站。

JSmooth 为您的 Java 应用程序提供各种包装器,每个包装器都具有自己的行为:选择您的口味!

下载: http://jsmooth.sourceforge.net/

2- JarToExe 1.8
Jar2Exe 是一款将 jar 文件转换为 exe 文件的工具。 以下是其网站上描述的主要功能:

  • 可以生成“控制台”、“Windows GUI”、“Windows 服务”三种类型的 exe 文件。
  • 生成的 exe 文件可以添加程序图标和版本信息。
  • 生成的 exe 文件可以加密和保护 Java 程序,在程序运行时不会生成临时文件。
  • 生成的 exe 文件提供系统托盘图标支持。
  • 生成的 exe 文件提供记录系统事件日志支持。
  • 生成的 Windows 服务 exe 文件能够自行安装/卸载,并支持服务暂停/继续。
  • x64 版本的新发布,可以创建 64 位执行文件。(2008 年 5 月 18 日)
  • 支持向导模式和命令行模式。(2008 年 5 月 18 日)

下载:http://www.brothersoft.com/jartoexe-75019.html

3- Executor
将你的Java应用程序打包成jar文件,Executor会将它转换为Windows exe文件,与本地应用程序无异。只需双击exe文件即可调用Java Runtime Environment并启动你的应用程序。

下载:http://mpowers.net/executor/

编辑:上面的链接已失效,但是这里是互联网档案馆的页面(具有可用的下载链接)。http://web.archive.org/web/20090316092154/http://mpowers.net/executor/

4- Advanced Installer
Advanced Installer让您在几分钟内创建Windows MSI安装程序。它还支持Windows Vista,并帮助您创建其他语言的MSI软件包。
下载:http://www.advancedinstaller.com/ 请告诉我你使用过哪些工具来将JAR转换为EXE。


10
  1. 最后更新时间为2007年。
  2. 无效链接。
  3. 无效链接。
- Nikolay Kuznetsov
1
JWrapper允许您将Java转换为可执行文件或转换为主流平台(Windows Linux,Mac)上的本机应用程序。它可以在任何操作系统上运行,支持内置代码签名和自动更新,并可以选择将JRE捆绑在非常小而且被大量压缩的包中。最重要的是,这个工具完全免费。 - AntonyM
1
JarToExe是一个30天的试用版... - 0x6B6F77616C74
2
让我们看看,JSmooth最后更新于2007年。这是7年前的事了。这就像人类世界里的1000年。JarToExe似乎仍在活跃。但没有试用版本,需要花费145美元。Executor链接已失效。Advanced Installer用于制作.MSI文件,在网站上没有提到Java,并且它看起来像是一个营销网站。这是一个非常有用的答案。没有任何开源软件。 - Nasser
6
还有一个Launch4J:http://launch4j.sourceforge.net/(Dmitry页面上列出的众多工具之一)。 - Dave C
显示剩余7条评论

40

在您的情况下,我建议使用GCJ(GNU Compiler for Java)。它是Java的AOT(ahead of time)编译器,类似于GCC对于C语言的作用。它不会解释代码或者生成中间Java代码并由Java虚拟机在以后运行,而是直接生成机器码。

GCJ可以通过各种Linux系统的包管理器(如果有的话)进行下载。安装之后,应该将GCJ编译器添加到路径中,以便在终端中调用。如果您使用的是Windows系统,可以通过Cygwin或MinGW下载和安装GCJ。

然而,我强烈建议您重写源代码,采用其他旨在进行编译的语言,如C ++。Java旨在成为一种便携式、解释性语言。将其编译成机器码完全违背了该语言开发的初衷。


1
+1 是唯一一个正确回答肯定的评论。我不知道GCJ是否支持传统的classfile/jvm组合所支持的所有功能,但对于“简单程序”来说,它绝对值得一试。 - Edmund
4
@Mark - 他们不需要单独的JVM,但是libgcj库实际上就是一个JVM。 - Stephen C
据我所知,GCJ 不支持 Swing。 - ceklock
1
Java旨在成为一种可移植、解释性的语言。我真的不认为Java是旨在被解释的。 - cubuspl42
1
@cubuspl42:回过头来看,经过多年的学习,我同意这个观点。语言并不是要以任何方式执行的。那更多的是实现细节。Python通常是解释性的,但将其编译为C并不违反我所知道的任何规范。然而,在某些情况下,它确实使语言的一些预期设计目标和优势变得无关紧要。如果您想以非凡和非传统的方式使用其中一个工具,那么考虑是否它是最适合该工作的最佳工具可能是值得的。 - jakogut
显示剩余4条评论

18

我使用 launch4j

ANT 命令:

<target name="jar" depends="compile, buildDLLs, copy">
    <jar basedir="${java.bin.dir}" destfile="${build.dir}/Project.jar" manifest="META-INF/MANIFEST.MF" />
</target>

<target name="exe" depends="jar">
    <exec executable="cmd" dir="${launch4j.home}">
        <arg line="/c launch4jc.exe ${basedir}/${launch4j.dir}/L4J_ProjectConfig.xml" />
    </exec>
</target>

1
我喜欢这一个,因为它也适用于其他平台。 - willcodejavaforfood
launch4j将JVM作为单独的进程运行,因此在任务管理器中显示为javaw - NateS
2
如果您包含了L4J_ProjectConfig.xml文件的内容,这个答案会好得多。 - Stijn de Witt

5
我通常使用bat脚本来完成这个任务。以下是我通常使用的内容:
@echo off
set d=%~dp0
java -Xmx400m -cp "%d%myapp.jar;%d%libs/mylib.jar" my.main.Class %*

%~dp0提取了批处理文件所在的目录。这使得批处理文件可以找到jar文件的位置,而不需要任何特殊的环境变量或设置PATH变量。

编辑:在classpath中添加引号。否则,如Joey所说,“空格可能会导致一些有趣的事情发生”。


5
你应该真正引用你的类路径,否则使用空格时会发生一些有趣的事情。 - Joey
2
那不是问题的答案。 - user6329530
1
提示:将所有的jar包放在同一个目录下,然后使用类路径通配符。 - guymac

1

我们发现在Linux下使用Ant轻松脚本化Jsmooth非常好用。您可能想先使用one-jar(也可以在Linux下轻松脚本化)将多个文件应用程序收集到一个单独的jar中。

我们主要需要EXE的便捷部署,结合“嘿,您需要Java X版本,请到这里下载”的功能。

(但最有可能您需要的是标准Java中的“可运行jar”/“可执行jar”功能)。


0
你可以做的事情是创建一个 .bat 文件,执行已创建的 .jar 文件,并检查是否存在 JRE。
来自 Mitch 有用的链接(source
java -classpath myprogram.jar de.vogella.eclipse.ide.first.MyFirstClass

这可以用于您的批处理...


使用批处理文件的问题在于会弹出一个控制台窗口。当您启动GUI程序时,这并不好看。 - Joey
5
哎呀,命名空间层次够深了吗? - Alex Budovski
从Mitch提供的链接中获取。我真的不认为这是重点。 - Vincent B.
一个exe文件可以用C ++来创建以执行这些操作,就像Eclipse一样。 - JCasso

0

有一小部分程序可以做到这一点... TowerJ 是其中一个(我会让你自己在谷歌上搜索),但它需要花费相当多的钱。

我发现这个主题最有用的参考资料是:http://mindprod.com/jgloss/nativecompiler.html

它提到了一些其他产品和实现相同目的的替代方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接