Java转EXE是好主意还是坏主意?

6

我一直在思考如何将Java项目转换为EXE

优点在于更快地在Windows上部署,用户只需双击EXE,应用程序就会启动,而使用Java时,他必须运行某些命令。

但是EXE并不是Java的初衷,即可移植性。

那么,你认为Java转EXE是好还是坏的想法?

我在这里找到了一些有趣的文章here

更新

哇,到目前为止有很多相互矛盾的观点。我希望你们能添加JAVA转EXE的优缺点。


不好!如果你真的喜欢 .exe,将其转换为C#代码,并使用Visual Studio进行编译。如果你将其放入JAR文件中并正确编辑清单文件,用户可以双击JAR文件来运行应用程序(前提是他们安装了JRE)。 - Ken Cheung
2
@Ken 这是非常无助的建议。你能提供一些有建设性的意见吗? - David Heffernan
您可以使用.bat/.cmd文件或jnlp。或者只需可执行的jar文件。JNLP确实存在一些错误,但总体上是安装的相当不错的解决方案。所有这些选项都可以通过“双击”来使用。 - bestsss
重新考虑一下:你需要32位和64位的exe(+java)才能使它看起来本地化,当然你可以只运行32位,但这有点不太好。 - bestsss
@bestsss,我也想看到你的回答 :) - Adel Boutros
显示剩余2条评论
9个回答

4

由于我的专业是Java Web Start,它用于启动带有GUI的桌面应用程序,请将我的建议视为主要针对这些类型的应用程序。


其他人已经评论了EXE的操作系统特定性质。我总是想知道为什么人们选择Java来开发Windows特定的桌面应用程序,因为Windows的Visual Studio软件可能会使GUI开发(没有跨平台的Java布局让您头痛)和部署(猜测它可以生成EXE)更容易。
另一方面,只有您能够确定最适合此用例的开发工具/语言。
关于创建EXE的潜在缺点,我在JavaFAQ on EXEs中提到。
有许多不将应用程序打包为可执行文件的好理由。Daniel Sjöblom指出:
  • 它可能不会更快。现代虚拟机不解释字节码,而是使用JIT编译器生成本地编译代码。请查看Sun网站以获取有关JIT编译器的进一步信息。
  • 静态编译会使您的应用程序大小增加多倍,因为您使用的所有库都需要链接到应用程序中。
  • 您失去了免费升级您的程序的机会。每当用户下载新的更快的虚拟机时,您的应用程序就会获得速度提升。如果您使用exe,则无法获得此优势。
  • Jon A. Cruz详细介绍了创建exe所需的开发过程中的额外步骤。他指出,制作本机exe的开发人员需要:
    • 验证供应商提供的编译产品的最新版本。如果发现关键错误,则无法用于构建出货产品,直到这些问题得到解决。每次供应商发布新版本时都需要完成的工作。
    • 将软件提交到QA周期中。一旦工程师认为事情做完了,就需要进行验证。因此,每个产品的出货版本和更新都需要通过完整的测试周期。
    • 此外,由于本地编译是针对目标平台的,因此需要为每个目标平台完全完成QA周期,这会增加所需的工作量。
    • 货架空间。现在可能不是什么大问题,但也有可能。
    • 然后需要让所有客户升级到正确的版本。要么提供免费更新(在这种情况下,企业需要吸收生产更新的成本),要么需要处理未全部更新的客户。

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

    ...


    当然,我部署Java富客户端应用的首选是使用Java Web Start。以下是Web Start的一些优点和特性:
    - 启动画面 - 桌面集成 - 文件关联 - 自动更新(包括惰性下载和对更新的程序控制) - 根据平台、架构或Java版本分区本地和其他资源下载 - 配置运行时环境(最低J2SE版本、运行时选项、RAM等) - 使用扩展轻松管理常见资源...
    我决定强调自动更新,因为随着从光盘交付的应用程序逐渐转向通过网络交付的应用程序,自动更新变得越来越普遍。JWS仍然提供了我见过的最好的更新体验(非常可配置,对用户大部分是透明的)。
    当然,JWS适用于桌面PC的操作系统,只要Java可用。

    更新

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

    请注意,名称为“Java Web Start”。

    当然需要。至少在初始安装时需要。如果用户当前未连接,则可以指定更新检查以继续启动先前安装的应用程序版本。

    但是,在我看来,没有CD / DVD驱动器的机器(例如Netbook)比没有互联网连接的机器更多。 如果想要销售更大的市场,请考虑使用网络提供应用程序。


    1
    只有一件事,我以前从未使用过Java Web,但我的问题是Java Web应用程序需要互联网连接吗? 注意:在商业用途中使用Visual Studio不是免费的。 - Adel Boutros
    1
    我总是不禁想问为什么人们选择使用Java来开发Windows特定的桌面应用程序,因为他们可能有现成的Java库,实际上他们可能希望以后在Mac上运行它(这很常见),因为他们擅长Java,上市时间可以显著缩短。还有很多其他原因。 - bestsss
    @AndrewThompson,如果您看一下Dmitry Leskov的答案,我如果使用Java Web Start怎么保护我的代码? - Adel Boutros
    Visual Studio Express是免费供商业使用的。 - Dmitry Leskov
    抱歉,我不明白“法律手段”是什么意思。假设你发现你的 StackExchange 身份被盗用,用于发布冒犯性评论和愚蠢的问题-你会起诉谁?你能否百分之百地恢复这种事件带来的影响? - Dmitry Leskov
    显示剩余7条评论

    3

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

    双方都对此感到满意 - 那么为什么不这样做呢?

    如果有充分的理由支持它,而且除了教条主义之外没有任何反对意见,那么在我看来是可以的。


    3

    我是您所链接文章的作者,很高兴您觉得它有趣!

    正如我的文章所述,并且其他人在他们的回答中已经指出的那样,有多种简化Java应用程序部署的方法 - JNLP、EXE包装器、捆绑私有JRE的安装程序等等。但是真正的本地编译是唯一提供保护Java反编译工具的选项——您根本不会发布字节码。

    当然,这并不能使您的代码逆向工程和篡改变得不可能,只是需要更多的技能和时间成本。

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


    那么你的意思是EXE是保护Java代码最安全的方式,对吗? - Adel Boutros
    不,我并不是这么说的,但在我看来,这是最平衡的方式。我已经链接到了我的另一篇文章,讨论了我知道的所有四种保护Java字节码的方法。最安全的方法有太多的权衡,无法推荐用于普遍使用。 - Dmitry Leskov
    "防止Java反编译器的保护。" 关于所有这些混淆,它只有一个好处,就是减小下载文件的大小。 - Andrew Thompson
    顺便说一句,对于发布最好的、最全面地论证替代答案的人,我会点赞。我仍然不同意你的分析,但我不会假设“我是正确的,你是错误的”。看到有好的替代观点(并且有充分的论证)是很有趣的。正如你在文章中所说:“存在两种完全不同的方法来从Java应用程序创建本机可执行文件,解决不同的问题。”说得好。 :) - Andrew Thompson
    很高兴知道我的问题引发了两个阵营之间的激烈辩论 :P - Adel Boutros

    2
    如果有充分的理由,为什么不呢?即使Eclipse在Windows上也有一个EXE文件(以及针对Linux、Mac等平台的特定二进制文件)。当然,您会失去可移植性,但如果这不重要,那就继续吧。
    更新:
    问题是:创建exe的目的是什么?
    方便性:Windows用户喜欢点击图标,非技术人员尤其如此。另一方面,非技术人员不关心链接内部执行的内容,无论它启动了一个exe还是其他东西。您也可以为非本地Java应用程序设置应用程序图标。替代方案包括:
    Web start
    创建安装程序包,例如:http://www.advancedinstaller.com/java.html。这也可以解决安装JRE的问题。
    性能:如果将Java应用程序编译为本地解决方案,则可能会在性能上获得一些优势,但这取决于您使用的技术。例如,Swing往往很慢,但将其编译为本地代码相当棘手。如果使用SWT而不是Swing,则已经使用本地组件,因此无需进一步进行本地编译。另一方面,最近的JVM表现非常出色,并且可以将Java编译为本机代码以进一步改善性能瓶颈。这在后台静默完成,您不需要担心。
    总之,在某些情况下,它可能是唯一的解决方案,但如果选择正确的技术,将有许多基于Java的替代解决方案来达到相同的目标。

    使用Eclipse,从一开始就失去了可移植性,因为SWT本地库,这是可以理解的。 - bestsss
    这里有些混淆。在你的回答中,你说“为什么不”,但在你的更新中,你说“不需要”并且有“其他替代方法”。 - Adel Boutros
    好的,这可能会让人感到困惑,但它是真实的。为什么不呢?它不会造成任何伤害,但为什么要这样做呢,因为有这么多的替代方案。在我的原始帖子和更新中,我说如果你有一个合法的理由并且找不到替代方案,那么创建一个exe文件是可以接受的。我只是不能轻易地想出一个合法的理由。但如果你有,请分享,社区(或我)将尝试找出是否有替代方案。 - Peter Szanto

    1

    这个链接背后的页面是由一家销售将Java编译成本地代码的产品的公司编写的。我不会仅凭此作出决定。

    问题还说exe具有更好的用户体验,因为用户只需双击即可启动应用程序。

    使用可执行的jar文件是可能的。实际上,在Java运行时中使用标准工具非常容易。您只需向一个jar文件添加清单,并指定含有主要内容的类。您还可以相对于主jar文件的位置指定其他jar文件的类路径。您还可以将图像指定为资源,以用作启动画面。

    例如:

    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中,基本的Ant项目将为您完成除了启动屏幕之外的所有工作。如果出于某种原因您想手动完成所有这些工作,请确保您理解清单文件的格式,它有点棘手。

    我是那个“链接后面的页面”的作者。只有在讨论所有其他选项并链接到相应工具之后,它才能进行本地编译。 - Dmitry Leskov
    这没有任何问题。就像考虑源可能存在的偏见一样,也没有任何问题。 - BillRobertson42

    0
    作为Linux、Mac和Solaris用户,我认为这是一个不好的想法。如果你想在Windows上更快地部署,只需创建安装程序即可。

    但是如果您创建一个安装程序,您只是设置文件,但是您如何模拟主要通过双击访问应用程序的exe呢? - Adel Boutros
    @abdmob 他需要提供一种在不同操作系统中启动程序的方法,但如果有必要,他可以为它们提供一个“纯”的可启动jar版本。 - Viruzzo
    有许多跨平台安装程序可用。通常它们用于桌面应用程序。您可以创建Windows快捷方式,用户只需单击或双击即可。例如,可以查找免费的IzPack安装程序。 - abdolence

    0
    Jar文件提供多种好处,包括: 紧凑:整个应用程序(即所有类文件)存储在一个档案文件中(如果需要,可以合并图像和声音文件)。 易于使用:应用程序可通过双击运行。 压缩:jar格式允许您压缩文件以实现有效的存储。 安全性:您可以对jar文件的内容进行数字签名。识别您签名的用户可以选择授予您的软件安全权限,否则无法获得。
    我不会转换为exe。
    大多数Windows应用程序都从.exe文件运行(例如Word、Internet Explorer、FireFox、NetBeans等), Java本身不支持这样做,因为可执行文件将是平台依赖性的(即它不能在Mac上运行)。 但是,有(免费)应用程序可以为您完成此操作。

    1
    您还可以提供一个JAR文件和一个可执行的启动器。这样就不会有所有这些问题了。 - Niklas B.
    JAR的缺点: 如果系统上没有(正确)安装JRE,则应用程序将无法启动。如果应用程序使用默认JRE中不存在的API,则应用程序将无法工作。需要告诉用户,.JAR文件是可点击的。 - Adel Boutros

    0
    Minecraft这么做,所以这一定是个好主意!开玩笑的,理解一下,你要找的不是“转换”,而是使用自定义启动器。你链接的文章很好地解释了不同的方法和各自的优缺点。总体来说,它需要额外的工作来创建启动器(每个不同的操作系统架构需要一个不同的版本),但它给你更多的控制权(版本检查是一个不错的功能,而且你可以像Minecraft那样轻松更新应用程序jar)。总的来说,如果你认为值得付出努力和(少量的)可移植性损失,这是个好主意。
    编辑:如果你不需要下面提供的真正巧妙的额外功能,那么“自定义Java启动器和包装器”方法就是你应该使用的方法。

    Eclipse也有这个功能,编写一个小的可执行文件来加载jvm.dll并启动进程是一项微不足道的任务,但并不是完全必要的。这样做是为了使应用程序看起来“本地化”。 - bestsss

    0

    根据用户群体而定。如果他们与技术有关,那么给他们一个可以通过双击运行的 .jar 文件是移动性的好主意。

    如果您的用户不太懂技术,但仍需要在多个平台上运行,则将其包装为 Windows 的 exe 和 Mac 的 .app

    重要提示:建议编写一个脚本将其打包成 exe,这样每次有新版本时就可以运行它。


    大多数exe文件只需加载jvm.dll并运行应用程序,因此新版本不会影响它们。 - bestsss

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