Java对EXE的好坏有什么好处?

时间:2012-01-09 09:07:46

标签: java windows deployment installer exe

我一直想知道将 Java 项目转换为EXE很长一段时间。

优势在于 Windows 上的更快部署,用户只需双击EXE并启动应用程序,其中 Java ,他有运行某些命令。

但是EXE实际上不是 Java 的目的是为了便携性。

那么您认为Java对EXE的好坏有什么想法?

我发现了一些有趣的文章here

更新

哇,所以可能与目前的观点相矛盾。我希望你们把JAVA的优点和缺点添加到EXE。

9 个答案:

答案 0 :(得分:4)

由于我的专业知识是Java Web Start,它用于启动桌面应用程序。使用GUI,请考虑我的建议主要针对这些类型的应用程序。


其他人评论了EXE的操作系统特性。我总是想知道为什么人们会选择Java来开发Windows特定的桌面应用程序。因为用于Windows的Visual Studio软件可能会同时进行GUI开发(没有x-plat Java布局可以帮助你)和部署(只是猜测它可以产生EXE)更容易。

OTOH只有你可以说这个用例的最佳开发工具/语言是什么。


关于创建EXE的潜在缺点,我在JavaFAQ on EXEs注意到。

有许多充分的理由不将您的应用程序打包到可执行文件中。 DanielSjöblom指出:

  • 可能不会更快。现代虚拟机不解释字节码,它们实际上使用JIT编译器来生成本机编译代码。有关JIT编译器的更多信息,请查看Sun的站点。
  • 静态编译会使应用程序的大小增加多倍,因为您使用的所有库都需要链接到应用程序中。
  • 您的计划失去了“免费”升级。只要您的用户下载新的更快的虚拟机,您的应用就会获得速度提升。如果您使用的是exe,则不会获得此优惠。

Jon A. Cruz详细介绍了创建exe所需的开发过程中的一些额外步骤。他指出开发人员需要本机exe:

  • 从供应商处验证最新版本的编译产品。如果发现严重错误,则在解决这些问题之前,不能将其用于构建运输产品。每次从供应商处发布修订时都需要完成的工作。
  • 通过质量保证周期提交软件。一旦工程师认为事情已经完成,就需要对其进行验证。因此,产品的每个发货版本和更新都需要经历完整的测试周期。
  • 此外,由于本机编译是针对每个目标平台的,因此需要为每个目标平台完成QA周期,这会增加所需的工作量。
  • 货架空间。现在也许不是什么大不了的事,但可能是。
  • 然后需要让所有客户升级到正确的版本。要么有免费更新(在这种情况下业务需要承担产生更新的成本),要么需要处理客户并非全部更新。

Jon进一步指出:当您发布标准Java字节码时,VM问题是平台或VM供应商的责任。但是,当您发送已编译的二进制文件时,它们将成为您的责任(即使它们实际上是供应商编译产品中的错误)。

...


当然,我是部署Java富客户端应用程序的首选。正在使用Java Web Start。以点的形式提供web-start的一些好处/功能:

JWS提供了许多吸引人的功能,包括但不限于:

  • 启动画面
  • 桌面集成
  • 文件关联
  • 自动更新(包括延迟下载和程序化控制更新)
  • 本地人的分区&按平台,体系结构或Java版本下载的其他资源,
  • 运行时环境的配置(最小J2SE版本,运行时选项,RAM等)
  • 使用扩展轻松管理公共资源 ..

我决定突出自应用程序逐渐转变后的自动更新。在磁盘上传递给应用程序。通过网络提供,自动更新变得越来越普遍。 JWS仍然提供了最好的更新体验(非常可配置,对用户来说几乎是透明的)我见过。

当然,JWS适用于可用于Java的桌面PC的操作系统。


更新

  

.. Java Web应用程序是否需要互联网连接?

(注意名称是'Java Web Start'。)

确实如此。至少对于初始安装。可以指定更新检查以继续启动以前安装的应用程序版本。如果用户当前未连接。

但是,(据我估计)有更多的机器(如上网本)没有CD / DVD驱动器,没有互联网连接。 如果您想要销售到更大的市场,请访问网络以提供该应用。

答案 1 :(得分:3)

这取决于您的需求。我们在这里为客户编写了一个小条码客户端扫描程序应用程序。他们在两台Windows PC上运行它。他们很高兴拥有他们众所周知的exe文件。我们用Java编写它并为它们创建了一个EXE文件。

双方都很满意 - 所以为什么不这样做呢?

如果有充分的理由,除了教条主义以外什么都不反对,那么我认为这是正常的。

答案 2 :(得分:3)

我是您链接的文章的作者 - 很高兴您发现它很有趣!

正如我的文章所述,正如其他人已在其答案中指出的那样,有多种方法可以简化Java应用程序的部署 - JNLP,EXE包装器,捆绑私有JRE的安装程序等等。但真正的本机编译是唯一提供protection against Java decompilers的选项 - 您只是不提供字节码。

当然,这不会使您的代码无法进行逆向工程和篡改,只需要在所需技能和时间方面成本更高。

就应用程序性能而言,如果您定位嵌入式系统,本机编译可能会产生差异。这也适用于内存和磁盘占用空间,尽管程度较小。在桌面上,您通常会获得更好的启动,但在大多数其他方案和方面,结果将取决于您的应用程序。

答案 3 :(得分:2)

如果有充分的理由,为什么不呢?甚至Eclipse在Windows上也有一个EXE(和linux,mac等平台相关的二进制文件)当然你会失去可移植性,但如果这不重要,那就继续吧。

<强>更新

问题是你想通过创建一个exe来实现什么:

  • 便利性:Windows上的用户更喜欢点击图标,对于非极客来说尤其如此。另一方面,非极客如果启动exe或其他东西,则不关心内部链接的作用。您也可以拥有非本机Java应用程序的应用程序图标。替代方案将是

  • 性能:如果将Java应用程序编译为本机解决方案,您可能会获得一些性能,但这取决于您使用的技术。例如,Swing往往很慢但是将其编译为本机则相当棘手。如果您使用SWT而不是已经使用本机组件的Swing,则无需进一步的本机编译。另一方面,最近的JVM运行良好,可以将java编译为native,以进一步改善性能瓶颈。这是在你不需要担心的背景上默默地完成的。

总结:在某些情况下,它可能是唯一的解决方案,但如果您选择合适的技术,将会有许多基于Java的替代解决方案来实现相同的目标。

答案 4 :(得分:1)

问题中链接背后的页面是由销售将java编译为本机代码的产品的公司编写的。我不会仅就此作出决定。

该问题还表明,exe的优势在于用户体验更好,因为用户只需双击即可启动应用程序。

可执行jar文件可能。实际上,使用Java运行时中的标准工具实际上非常容易。您只需要向jar文件添加清单,并指定包含main的类。您还可以在类路径中指定相对于主jar文件位置的其他jar文件。您还可以指定要用作初始屏幕的图像作为资源。

e.g。

Class-Path: lib/derby.jar lib/derbytools.jar lib/jcalendar-1.3.2.jar l
ib/joda-time-1.4.jar lib/log4j-1.2.14.jar lib/looks-2.2.1.jar lib/swi
ng-layout-1.0.jar
SplashScreen-Image: resources/splash.png
Main-Class: com.you.pkg.app.Main

Netbeans中的基本蚂蚁项目如果您使用它,将为您完成除了spash-screen之外的所有项目。如果您想要手动完成所有这些操作,请确保您了解清单文件的格式,它有点挑剔。

答案 5 :(得分:0)

作为Linux,mac。,Solaris用户我认为这是个坏主意。 如果您想在Windows上更快地部署,只需创建安装程序。

答案 6 :(得分:0)

Jar文件提供许多好处,包括: 压缩:整个应用程序(即所有类文件)存储在一个存档文件中(如果需要,可以包含图像和声音文件)。 易于使用:双击可以运行应用程序。 压缩:jar格式允许您压缩文件以实现高效存储。 安全性:您可以对jar文件的内容进行数字签名。然后,识别您的签名的用户可以选择授予您不具备的软件安全权限。

我不会转换为exe。

大多数Windows应用程序都是从.exe文件(Word,Internet Explorer,FireFox,NetBeans等)运行的 Java本身不支持这样做,因为可执行文件将依赖于平台(即它不能在Mac上运行) 但是,有(免费)应用程序可以为您执行此操作。

答案 7 :(得分:0)

Minecraft做到了,所以一定是个好主意! 除了所有的笑话,要明白这不是你想要的'转换',而是使用自定义启动器。您链接的文章很好地解释了每种方法的不同方法和优缺点。作为一般概念,它需要额外的工作来创建启动器(以及每个不同的OS体系结构的不同版本),但它提供了更多的控制(版本检查是一个很好的功能,你也可以更新应用程序jar很容易,像Minecraft一样)。总的来说,如果您认为值得付出努力,并且(轻微)可移植性损失,那么这是一个好主意。

编辑:如果您不需要下面提供的那些非常漂亮的额外功能,那么您应该使用'自定义Java启动程序和包装程序'方法。

答案 8 :(得分:0)

取决于用户群。如果它们与技术有关,那么给它们一个.jar文件(可以通过双击运行)对于移动性来说是一个好主意。

如果您的用户不那么熟练,但仍然需要它在多个平台上运行,请将其包装为Windows的exe和Mac的.app

重要:我建议制作一个脚本将其包装到exe中,这样每次有新版本时都会运行它。