68

假设我想分发一个 Java 应用程序。

假设我想将它作为单个可执行文件分发。我可以轻松地在一个文件中构建一个包含应用程序及其所有外部依赖项的 .jar(使用一些 Ant hacking)。

现在假设我想在 Windows 上将它作为 .exe 文件分发。考虑到那里的好工具(例如 Launch4j 等),这很容易。

但是现在假设我也不想依赖最终用户安装了正确的 JRE(或任何 JRE)。我想用我的应用分发一个 JRE,我的应用应该在这个 JRE 上运行。创建一个 Windows 安装程序可执行文件并在其中嵌入一个包含所有必要 JRE 文件的文件夹非常容易。但后来我分发的是安装程序,而不是单文件应用程序。

有没有办法将应用程序JRE 都嵌入到充当应用程序启动器(而不是安装程序)的 .exe 文件中?

4

13 回答 13

24

尝试使用AvianProGuard工具包。Avian 允许在您的应用程序中嵌入轻量级虚拟机。支持 Linux、MacOS、Windows 和 iOS。ProGuard 允许您缩小大的 jar 文件以准备嵌入。

于 2012-07-19T08:11:34.937 回答
16

有一个新工具可以做到这一点:Packr
https://github.com/libgdx/packr

于 2014-07-21T09:43:22.910 回答
7

周围有很多选择,在商业上这非常好:

http://www.excelsior-usa.com/jet.html

有两个关键的开源选项 GCJ 和 VMKit

http://gcc.gnu.org/java/http://vmkit.llvm.org/

其他更长的路径将包括 IKVM.NET:

http://www.ikvm.net/

这是一个可以静态编译为 EXE 的 .NET JVM

于 2010-02-13T20:31:14.540 回答
5

自己遇到问题后-

1)创建一个包含您的应用程序jar文件的文件夹

2)创建一个包含jre的子文件夹

3)创建一个 bat 文件,在应用程序使用期间覆盖 env 变量并将启动您的应用程序:

REM requiered so java wont run into issues with an installed version if one exists
SETLOCAL ENABLEEXTENSIONS
SET JAVA_HOME="./jre"
"./jre/bin/java.exe" -jar "applicationName.jar"
pause

4)使用 bat 到 exe 转换器选项包括: https ://listoffreeware.com/6-best-free-bat-exe-converter-software-windows/

第一个选项在这里可用:

https://web.archive.org/web/20190305143030/http://www.f2ko.de/downloads/Bat_To_Exe_Converter.zip

5)创建一个包含文件夹的exe并在运行时运行bat文件

于 2020-02-07T11:29:32.463 回答
4

有没有办法将应用程序和 JRE 都嵌入到充当应用程序启动器(而不是安装程序)的 .exe 文件中?

如果您可以使用商业工具,install4j可以非常顺利地解决此问题(请参阅其“功能”页面)。它可以生成应用程序启动器安装程序。

我不想重复自己太多,所以请检查我插入它的早期答案(作为安装程序构建器,但在这里没有太大区别)。

总结/底线:install4j 可以创建绝对依赖于预安装的 JRE(或任何其他特定库)的本机 .exe 启动器,并且它为捆绑(和检测)JRE 提供了灵活的选项。

于 2010-02-13T20:32:48.427 回答
3

Netbeans 允许将 Java SE 项目打包在本机应用程序安装程序中,嵌入 JRE。它在这里:https ://netbeans.org/kb/docs/java/native_pkg.html :)

于 2014-11-23T17:22:58.420 回答
1

我知道我参加这个聚会有点晚了,但是看起来 ej-technologies(喜欢他们的东西)有一个名为的新解决方案exe4j,它将完全按照 OP 的要求完成,而不需要任何有趣的业务。

http://www.ej-technologies.com/products/exe4j/overview.html

如果您在开源项目中工作,他们会提供免费许可证(您只需要联系他们)。如果它是一个商业项目,则需要许可证......但许可证价格为 69 美元,它非常便宜且值得恕我直言。

从他们的网站:

If you want your own process name instead of java.exe in the task manager
and a user friendly task-bar grouping, exe4j does the job for you.

exe4j helps you with starting your Java applications in a safe way, displaying
native splash screens, detecting or distributing suitable JREs and JDKs,
startup error handling and much more.
于 2013-08-08T15:21:39.017 回答
1

我写了一个解决方案,它具有以下内容:

  • 它只编译成一个只调用 jre 的小 exe 文件 (30 kb)
  • 您从独立的 cpp 文件编译 exe 一次(您需要修改 cpp 文件,将“com.example.MyApplication”替换为您自己的类名)
  • 选择一个图标,它将嵌入到exe文件中
  • 完成的 exe 文件现在是您的 java 启动器,它会捕获 java.exe 的任何错误,并在启动失败时显示信息对话框
  • 没有控制台窗口

由于 exe 文件很小,您可以构建一次并将其放入 repo。除非您重命名主 Java 类或想要更改图标,否则您不需要更新它。

您部署的应用程序将如下所示:

app_root/
    myapp.exe        # the launcher created by this project
    jre/             # the bundled JRE, created by jlink
    lib/
        MyApp.jar    # your Java application
        ...          # any third-party libraries, etc.

你可以在这里查看:https ://github.com/foolo/windows-jre-laucher

于 2020-08-03T18:09:14.533 回答
0

JSmooth 可以根据文档做到这一点。我只在没有嵌入式 JRE 的情况下尝试过,但非常满意。它可以用 ant 编写脚本,我们在 Linux 上构建。

http://jsmooth.sourceforge.net/features.php

于 2010-02-13T20:35:44.023 回答
0

你可以看看: http ://ulibgcj.sourceforge.net/uswt.html 它有 micro-swt 库,可以轻松使用SWT构建 GUI ,并查看Eclipse GCJ Builder

于 2011-11-24T11:50:14.717 回答
0

Install4j 是一个很好的工具,可以解决这个问题。此外,您可以查看 JSmooth 或 launch4j-all,尽管我尝试将 jres 与 JSmooth 捆绑在一起但无法...

于 2012-06-08T15:44:27.173 回答
0

我发现 Engima Projector x86 / x64 比 BoxedApp Packer 更好

如果你通过 packr 获得了 soft miminizejre 而不是将你的应用程序 myapp.jar 复制到 launcher\jre\bin\

并从已安装的 jre 示例 C:\Program Files\Files\Java\1.8.0_xxx\bin\javaw.exe 复制到 launcher\jre\bin\

从启动器\jre\bin\ 打开 Engima Protector 输入 -> javaw.exe

如果你想要高压缩和查找杂项 -> 命令行“-jar myapp.jar”,请转到选项

然后单击保护并等待整个 dll 和 jar 进入 exe

确保您的 myapp.jar 应由 Eclipse 生成,并带有“将所需的库打包到生成的 JAR 中”,因为您不必担心是否导入了许多库,例如 lwjgl 或 JavaFX,而不是必须检查嵌入式 javaw_protected.exe 是否包含重要文件示例资产.

但是 BoxedApp Packer 也一样 BoxedApp Packer 比 Engima Protector 大一点。Protector 几乎是最好的小型嵌入 javaw.exe 与资产/资源。比他们无法破解 jar 文件...我希望您对自己的 jar 到 exe 感到满意,因为没有 lib 目录的 jar 小于 4 mb - 如果您对 jvm.cfg 错误消息有问题,这意味着您没有将嵌入的 exe 复制到根目录jre或jdk的目录

请确保嵌入的 exe 位于 jre 或 jdk 根目录之外。

我希望您使用 Protector x86 比使用 i586、Protector x64 for jre x64 时没有问题

如果您将 Protector x64 与 jre x86/i386 一起使用 - 没问题。它工作正常。

最好的祝福

// 编辑:

更新的新版本 EXCELSIOR JET + VIRTUAL BOX OR PROTECTOR 几乎是最好的“嵌入式应用程序”

查看 youtube:https ://www.youtube.com/watch?v=ctbIxq-1MGE

于 2016-10-14T21:53:31.077 回答