2010-02-13 97 views
49

假设我想分发一个Java应用程序。在Windows可执行文件中嵌入JRE?

假设我想将它作为单个可执行文件分发。我可以轻松地在应用程序及其所有外部依赖关系中构建一个.jar文件(带有一些蚂蚁黑客攻击)。

现在假设我想将它作为Windows上的.exe文件进行分发。这很容易,因为有很好的工具(比如Launch4j和类似的)。

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

有没有将应用程序一个JRE嵌入作为应用程序启动器(而不是作为安装程序)的.exe文件中的方法?

+1

3年 - - 看着基于网络的应用程序的快速改进,我会说这种分发技术已经过时了。您现在可以像创建桌面应用一样构建Web应用,并轻松分发。用户不必担心下载/安装,并且任何新版本可以立即生效 – gerrytan 2013-03-25 04:30:06

+15

@gerrytan当您完全不知道我的要求是什么时,可以做出一个广泛的假设!如果今天完成了同样的项目,它仍将作为常规应用程序分发。 – perp 2013-03-25 08:37:53

+8

通过安装程序或独立可执行文件的常规应用程序永远不会消失。网络部署不是万能的解决方案有很多原因。 – SnakeDoc 2013-08-08 15:19:11

回答

21

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

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/

这是一个.NET JVM可静态编译到一个EXE

+0

Excelsior JET看起来很有趣。请仔细看看。恐怕我不太相信GCJ,但我可以试试看。 Re:VMKit,CLI的JRE实现不需要.NET吗? – perp 2010-02-13 21:44:22

+0

VMKit是编译条款中的.net和JVM解决方案,对于JVM端我认为它合并在GNU Classpath中;但它目前处于测试阶段,所以我认为它的商业用途有点小。 (我发现Excelsior JET的唯一限制是没有MacOSX支持。) – metismo 2010-02-14 00:31:15

+0

我们有免费的Excelsior JET许可证供非商业用途使用,以防万一:http://www.excelsior-usa.com/jetfree.html – 2012-02-21 04:09:18

4

有没有办法同时嵌入应用程序和JRE,到作为应用程序启动的.exe文件(而不是安装程序)?

如果一个商业工具是对你合适,install4j很顺利地解决了这个问题(见它的"Features" page)。它可以生成应用程序启动器和安装程序。

我不想重复自己太多,所以请检查this earlier answer我插入它(作为安装程序生成器,但它没有太大的区别)。

汇总/底线:install4j可以创建本地的.exe发射是绝对做不依赖于预先安装JRE(或任何其他特定库),它提供了灵活的选择捆绑(和检测)的JRE。

+0

我已经下载了一个试用版,但我无法真正弄清楚如何让它做我想做的事。我所能做的就是创建一个安装程序? – perp 2010-02-13 21:36:14

+0

@perp也许你可以通过查看参考手册中的“步骤3:配置启动器”来开始:http://resources.ej-technologies.com/install4j/help/doc/indexRedirect.html?http&&&resources.ej-technologies .COM/install4j /帮助/ DOC /措施/发射器/ launcher.html。除此之外,我不确定,因为我个人刚刚创建了安装程序。如果手册没有帮助,你可以问他们的支持(我知道这很好):http://www.ej-technologies.com/support/supportRequest – Jonik 2010-02-14 11:17:03

+0

我刚刚意识到,install4j背后的公司也有一个产品称为** exe4j **专门用于创建启动器:http://www.ej-technologies.com/products/exe4j/overview.html。我现在不是100%,如果exe4j可以做一些安装4j没有的东西 - AFAIK都可以创建带有捆绑JRE的exe启动器。 – Jonik 2010-05-02 12:35:47

0

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

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

+0

它在哪里说的?我浏览过它,我所能看到的只是它支持“捆绑”的JRE,这不是一回事。关于这个问题,我所能看到的是手册第3.4.2节中提到的内容...... – perp 2010-02-13 21:10:56

+0

“有时将JRE与应用程序捆绑在一起会更方便,JSmooth也可以处理这些问题,您只需要定义在哪个文件夹中JRE是预期的,如果JRE不在应该的位置,它可以很好地回退到标准的JVM搜索。“我将其解读为解压缩的JRE,而不是安装程序。 – 2010-02-13 22:01:39

+1

是的,.exe可以在指定的文件夹中查找JRE,但我已经知道使用几种不同的工具是可能的。我想知道是否有一种解决方案可以将JRE嵌入到应用程序二进制文件*中,这是不同的。所以不是“捆绑”而是“嵌入”。 :-) – perp 2010-02-13 22:50:28

0

Install4j是这种纠结目的的一个很好的工具。您也可以查看JSmooth或launch4j--尽管我试图将jres与JSmooth捆绑在一起,但无法运行。

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. 
10

有一个新的工具,做这样的:Packr
https://github.com/libgdx/packr

+0

Packr可以工作,但它会创建一个包含jre /文件夹,app.exe和原始app.jar的文件夹结构。您仍然需要创建一个安装程序以将此文件夹结构复制到C:\ Programs \文件夹中。你的.jar仍然存在,它不是嵌入到.exe中。除此之外,这是一个很好的工具。 – 2017-02-16 08:59:03

+0

你有没有找到一个更好的工具来拥有一个可执行文件? – cyberjoac 2017-09-13 11:33:53

4

Netbeans的允许封装在一个原生应用程序安装一个Java SE项目,嵌入JRE。 它在这里:https://netbeans.org/kb/docs/java/native_pkg.html :)

+0

Netbeans使用必需的Innosetup和Wix自动创建安装程序,必须单独安装它们。启动时,安装程​​序会创建一个文件夹结构,其中包含运行时/文件夹,app.exe和位于C:\ User \ AppData \ Local文件夹中的原始app.jar的应用程序/文件夹,然后创建相应的开始菜单。注意你的.jar仍然存在,它并不嵌入到.exe中 – 2017-02-16 10:15:07

0

我发现Engima投影机在x86/x64比BoxedApp帕克更好

如果通过packr比你的应用程序myapp.jar复制到启动\ JRE \ BIN拿到手软miminizejre \

和从已安装的jre文件复制例如C:\ Program Files \ Files \ Java \ 1.8.0_xxx \ bin \ javaw.exe到启动程序\ jre \ bin \

打开Engi m Protector输入 - > javaw.exe from launcher \ jre \ bin \

而且去选择,如果你想要高压缩和 查找其它 - >命令行“罐子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作为少4mb没有lib目录 - 如果你有问题与jvm。cfg错误信息这意味着你不要将嵌入式exe复制到jre或jdk的根目录中

请确保嵌入式exe在这里位于jre或jdk根目录之外。

我希望,如果你使用的x86保护者比如果您使用的x64保护者与JRE的x86/I386它不需要使用i586的,保护64的JRE 64

你有没有问题 - 这是好的没有问题。它工作正常。

问候

//编辑:

更新的新版本EXCELSIOR JET +虚框或保护者的几乎是最好的 “嵌入式应用”

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

相关问题