如何分发Java应用程序

时间:2011-02-22 16:39:18

标签: java jar cross-platform jvm distribution

我想了解分发Java应用程序的各种选项。

我知道你可以

  • 分发源代码,让用户自己编译,或提供make文件等。
  • 将其打包到JAR中,并拥有自解压档案
  • 和(我确定,无数其他方式)

我希望对最常见的选项(以及我没有想到的选项)进行一些解释,特别是,他们是否需要用户拥有JVM,或者可以将其捆绑在一起 - 我个人而已我不太喜欢因缺少JVM而停止的安装程序。谁说应用需要安装人员,独立解决方案也很好。

另外,值得一提的是如何处理跨平台分发,exe与vs dmg等...

我对这个问题的主要动机(我很欣赏与其他人类似)是找到不需要用户安装JVM的解决方案 - 但为了完整性,我一般都会问。

非常感谢

5 个答案:

答案 0 :(得分:5)

  

分发源代码并让   用户自己编译,或   提供make文件等。

对于开源项目来说这可能是好的,但对于任何商业项目来说都是非常不寻常的。我建议将它作为技术人员的选项,但也分发JAR

  

将其打包成JAR

我称之为最佳做法

  

并拥有自解压档案

making the jar executable呢?

  

我希望能有一些解释   最常见的选择(一个是我   没有想到),特别是,   他们需要用户拥有JVM,   或者可以捆绑一个 -   我个人并不太喜欢   由于缺乏而停止的安装程序   JVM。

我认为捆绑JRE并不合法。也就是说,没有Java,基于java的解决方案是行不通的。没有安装JRE,OpenOffice和许多其他人无法安装。我说那是可以理解的,也可以。

IzPack似乎是创建基于Java的安装程序的好方法。

  

我的主要动机   问题(我欣赏的是   与其他人相似)就是找   不需要用户的解决方案   已经安装了JVM

正如我所写,我认为捆绑JRE [更新:它是合法的,read this document以供参考]是不合法的(也不是很好的选择,因为您必须捆绑许多不同的OS /架构组合)。所以唯一的另一种方式是本机编译(不能帮助你,对不起)。

答案 1 :(得分:3)

InstallBuilder允许您轻松分发Java应用程序并捆绑JVM(虽然它本身不需要Java,因此您提到您永远不会得到错误,因为最终用户在计算机中没有JVM)。它是商业产品(diclaimer,我是原始开发人员),但我们有小型独立软件开发商和开源项目免费许可证的折扣。 MySQL / Oracle,Jaspersoft,Alfresco,Pentaho以及其他一些基于Java工具的ISV正在使用它,这些应用程序已被下载数百万次,没有任何重大问题。试一试:)

答案 2 :(得分:1)

一般来说,您有几个选择:

1) Java Web Start
2) Run it as an applet
3) download and install.

您主要对选项3感兴趣。您可以为各种安装程序创建安装包(InstallJammer是一个,但您有其他安装程序)。既然您正在寻找分发JVM(您可以这样做),那么您正在查看针对您所定位的每个平台的不同安装程序。

答案 3 :(得分:0)

对于简单的产品,我喜欢获得一个可执行的jar。见http://one-jar.sourceforge.net/

对于任何大型产品和安装人员都是必需的。 (InstallAnywhere,Install4J,LzPack等将帮助您创建一个)

答案 4 :(得分:0)

独立应用

在现代Java中,您可以为特定的主机OS生成带有捆绑的JVM的独立应用程序。

有关背景信息,请阅读2020-05更新的Oracle白皮书Java Client Roadmap Update

模块化

首先,将您的应用模块化以支持Java Platform Module System。您可以在书籍,演示视频和许多博客文章中了解这一点。

模块化的好处之一是捆绑的JDK可以简化为仅包含您在应用程序中实际使用的部分。这样可以减少存储空间和内存。

获取Java实现

第二,获得Java的实现,其许可条款可以满足您的需求。条款有所不同。有些是免费的,有些是商业产品。

这是我为帮助您进行选择而制作的流程图。

enter image description here

构建最终应用

第三,使用诸如jlinkjpackage之类的工具来构建独立应用。

此过程的工具正在迅速发展。因此,可能会有其他工具投放市场。

您捆绑的JDK具有针对特定主机OS的本机代码。因此,您需要为选择支持的每个部署平台分别构建应用程序。

顺便说一句,请务必检查您包含在应用程序中的每个库的许可条款。

替代: GraalVM

使用ahead-of-time compileGraalVM转换为本地代码的另一种方法。请注意,这是尖端技术,但是很有希望。