在 Windows 可执行文件中嵌入 JRE?
Posted
技术标签:
【中文标题】在 Windows 可执行文件中嵌入 JRE?【英文标题】:Embed a JRE in a Windows executable? 【发布时间】:2011-01-16 13:36:01 【问题描述】:假设我想分发一个 Java 应用程序。
假设我想将它作为单个可执行文件分发。我可以轻松地在单个文件中构建一个包含应用程序及其所有外部依赖项的 .jar(通过一些 Ant hack)。
现在假设我想在 Windows 上将它作为 .exe 文件分发。这很容易,因为那里有很好的工具(例如 Launch4j 等)。
但是现在假设我也不想依赖最终用户安装了正确的 JRE(或任何 JRE)。我想用我的应用分发一个 JRE,我的应用应该在这个 JRE 上运行。创建一个 Windows 安装程序可执行文件并在其中嵌入一个包含所有必要 JRE 文件的文件夹非常容易。但后来我分发的是 installer 而不是单文件应用程序。
有没有办法将应用程序和一个 JRE 嵌入到一个 .exe 文件中,作为应用程序启动器(而不是作为安装程序)?
【问题讨论】:
通过安装程序或独立可执行文件的常规应用程序永远不会消失。基于 Web 的部署不是一刀切的解决方案有很多原因。 @SnakeDoc 链接不再起作用。 exe4j 可能重命名为 install4j? ej-technologies.com/products/install4j/overview.html @akauppi 这是一个更新的链接:ej-technologies.com/download/exe4j/files @akauppi Install4j 使用安装向导构建安装程序,可以做很多事情。 exe4j 构建一个 .exe,您无需安装即可启动您的应用程序(想想刚刚运行的 Minecraft.exe)。 感谢您的澄清。即便如此,该链接已过时。现在:ej-technologies.com/download/exe4j/files(注意:需要商业许可证) 【参考方案1】:尝试使用Avian 和ProGuard 工具包。 Avian 允许在您的应用程序中嵌入轻量级虚拟机。支持 Linux、MacOS、Windows 和 ios。并且 ProGuard 允许您缩小大型 jar 文件以准备嵌入。
【讨论】:
【参考方案2】:有一个新工具可以做到这一点:Packrhttps://github.com/libgdx/packr
【讨论】:
Packr 可以工作,但是它会创建一个文件夹结构,其中包含一个 jre/ 文件夹、一个 app.exe 和您的原始 app.jar。您仍然需要创建一个安装程序来将此文件夹结构复制到您的 C:\Programs\ 文件夹中。此外,您的 .jar 仍然存在,它没有嵌入到 .exe 中。除此之外,它还是一个不错的工具。 你有没有找到更好的工具来拥有一个可执行文件? 在下面查看我的答案,它会创建一个可执行文件【参考方案3】:周围有很多选择,在商业上这非常好:
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
【讨论】:
Excelsior JET 看起来很有趣。会仔细看看。恐怕我对 GCJ 不够信任,但我可以试一试。回复:VMKit,CLI 的 JRE 实现不需要 .NET 吗? VMKit 在编译方面既是 .net 又是 JVM 解决方案,对于 JVM 方面,我认为它合并到 GNU Classpath 中;但它目前处于测试阶段,所以我认为它有点偏离商业用途。 (我发现 Excelsior JET 的唯一限制是不支持 MacOSX。) 我们有免费的 Excelsior JET 许可证可用于非商业用途,以防万一:excelsior-usa.com/jetfree.html VMKit 项目已退役【参考方案4】:在自己遇到问题后 -
1)创建一个包含您的应用程序 jar 文件的文件夹
2)创建一个包含 jre 的子文件夹
3) 创建一个 bat 文件,在应用程序使用期间覆盖环境变量 并将启动您的应用程序:
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文件
【讨论】:
【参考方案5】:有没有办法将应用程序和 JRE 嵌入到充当应用程序启动器(而不是安装程序)的 .exe 文件中?
如果您可以使用商业工具,install4j 可以非常顺利地解决此问题(参见其"Features" page)。它可以生成 应用程序启动器和安装程序。
我不想重复自己太多,所以请检查例如this earlier answer 我插入它的地方(作为安装程序构建器,但在这里没有太大区别)。
总结/底线:install4j 可以创建绝对不依赖预安装 JRE(或任何其他特定库)的本机 .exe 启动器,并且它提供了灵活的捆绑选项(和检测)JRE。
【讨论】:
我已经下载了试用版,但我真的不知道如何让它做我想做的事。我能做的就是创建一个安装程序? @perp 也许您可以通过查看参考手册中的“第 3 步:配置启动器”开始:resources.ej-technologies.com/install4j/help/doc/…。除此之外,我不确定,因为我个人刚刚创建了安装程序。如果手册没有帮助,您可以寻求他们的支持(我知道这非常好):ej-technologies.com/support/supportRequest 我刚刚意识到 install4j 背后的公司也有一个名为 exe4j 的产品,专门用于创建启动器:ej-technologies.com/products/exe4j/overview.html。如果 exe4j 可以做 install4j 不能做的事情,我现在不是 100% - AFAIK 都可以创建带有捆绑 JRE 的 exe 启动器。 @Jonik install4j 用于创建带有嵌入式 jre(或使用系统 jre)的捆绑 exe 来安装 java 应用程序。 exe4j 使用捆绑的 jre 构建一个独立的 exe,或者使用不需要安装的系统 jre...很像著名的 minecraft.exe 启动器,不需要安装...只需双击它即可。【参考方案6】:Netbeans 允许将 Java SE 项目打包到本机应用程序安装程序中,嵌入 JRE。 在这里:https://netbeans.org/kb/docs/java/native_pkg.html :)
【讨论】:
Netbeans 使用必需的 Innosetup 和 Wix 自动创建安装程序,这些安装程序必须单独安装。安装程序在启动时会创建一个文件夹结构,其中包含一个 runtime/ 文件夹、一个 app.exe 和一个 app/ 文件夹,其中原始 app.jar 位于 C:\User\AppData\Local 文件夹中,然后创建相应的开始菜单。注意你的 .jar 仍然存在,它没有嵌入到 .exe 中【参考方案7】:另一个例子...Bundle Java (the JRE) and Launch a Java App with 7zip SFX! ... (Convert Java Apps to an Executable, sort of)
【讨论】:
【参考方案8】:我知道我参加这个聚会有点晚了,但是看起来 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.
【讨论】:
【参考方案9】:我写了一个解决方案,它具有以下内容:
它只编译成一个只调用 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
【讨论】:
【参考方案10】:JSmooth 可以根据文档执行此操作。我只在没有嵌入式 JRE 的情况下尝试过,但非常满意。它可以用 ant 编写脚本,我们在 Linux 上构建。
http://jsmooth.sourceforge.net/features.php
【讨论】:
它在哪里说的?我浏览了它,我所看到的只是它支持“捆绑的”JRE,这不是一回事。关于这个问题,我所能看到的只是手册第 3.4.2 节中提到的内容...... "有时将 JRE 与您的应用程序捆绑起来更方便。JSmooth 也可以处理这个问题,您只需要定义 JRE 应该在哪个文件夹中。它很好地回退到标准 JVM 搜索如果 JRE 不在应有的位置。”我认为这是一个未打包的 JRE,而不是安装程序。 是的,确切地说,.exe 可以在指定的文件夹中查找 JRE,但我已经知道使用几种不同的工具可以做到这一点。我想知道是否有一个解决方案可以将 JRE 嵌入应用程序二进制文件本身,这是不同的。所以不是“捆绑”而是“嵌入”。 :-) 请检查此问题并在 JSMOOTH ***.com/questions/5407178/…987654322@ 的情况下给我一个解决方案 @venka,我自己没有尝试过嵌入式用例,我发现 tje 服务启动器不能正常工作。如果你不能让它轻松工作并且作者没有响应,我建议使用另一个启动器。【参考方案11】:你可以看看: http://ulibgcj.sourceforge.net/uswt.html 它有 micro-swt 库,可以使用SWT 轻松构建 GUI 看看Eclipse GCJ Builder
【讨论】:
【参考方案12】:Install4j 是一个很好的工具,可以解决这个问题。你也可以查看 JSmooth 或 launch4j-all,尽管我尝试将 jres 与 JSmooth 捆绑在一起但无法......
【讨论】:
【参考方案13】:我发现 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 目录,只有 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
【讨论】:
以上是关于在 Windows 可执行文件中嵌入 JRE?的主要内容,如果未能解决你的问题,请参考以下文章
开发环境JRE 裁剪 ① ( 裁剪 bin 目录下的 dll 动态库文件 )