【问题标题】:What's the best way to distribute Java applications? [closed]分发 Java 应用程序的最佳方式是什么? [关闭]
【发布时间】:2010-09-09 22:55:43
【问题描述】:

Java 是我选择的编程语言之一。尽管将我的应用程序分发给最终用户,但我总是遇到问题。

向用户提供 JAR 并不总是像我希望的那样对用户友好,使用 Java WebStart 需要我维护一个 Web 服务器。

分发 Java 应用程序的最佳方式是什么?如果 Java 应用程序需要将工件安装到用户的计算机上怎么办?有没有好的 Java 安装/打包系统?

【问题讨论】:

  • Java WebStart 可用于任何 URL,例如 CD 或网络驱动器等文件系统。当然,它并没有给你那么多。注意:eclipse 不使用安装程序,您只需解压缩并运行它。也许您不需要安装程序。
  • 如今,将这样的 Java WebStart 应用程序部署到例如,非常简单。谷歌应用引擎。
  • 很遗憾这个问题被关闭了。我不同意“主要基于意见”的原因。提供的答案不是基于意见,而是基于经验。我总是欢迎基于经验的好答案。不能从历史中吸取教训的人注定要重蹈覆辙。
  • 您可以使用 jlink(JDK 9 引入)来分发 Java 应用程序。它随 JDK 一起提供。它将为您构建一个专用的 JRE。您不需要在客户端机器上安装 java。

标签: java installation jar software-distribution


【解决方案1】:

对于简单的 Java 应用程序,我喜欢使用 Jar。分发一个用户只需点击的文件(Windows)非常简单,或者

java -jar jarname.jar

恕我直言,当简单是主要要求时,jar 是要走的路。

【讨论】:

  • 在新手身上试试这个,你会发现效果不好。
  • 几年前 Minecraft 就是这样分发的。
【解决方案2】:

可执行文件是最好的,但它们受平台限制,即使用 gcj : http://gcc.gnu.org/java/ for linux 生成可执行文件并使用 launch4j : http://launch4j.sourceforge.net/ 生成 windows 可执行文件。 要在 linux 上打包,您可以使用任何 rpm 或 deb 打包程序。对于 win32 试试http://en.wikipedia.org/wiki/Nullsoft_Scriptable_Install_System

【讨论】:

    【解决方案3】:

    最佳答案取决于平台。对于 Windows 上的部署,我使用 one-jarlaunch4j 的组合取得了不错的效果。正确设置我的构建环境确实需要一些时间(主要是 ant 脚本),但现在它相当轻松。

    【讨论】:

      【解决方案4】:

      如果它是一个真正的具有 GUI 的最终用户应用程序,您应该忽略您编写程序 (Java) 的语言,并为您选择的每个平台使用本机安装程序。 Mac 用户想要一个 .dmg,而在 Windows 上一个 .msi 或 .exe 安装程序是可行的方法。在 Windows 上,我更喜欢 NullSoft 的 NSIS,只是因为它比 InstallShield 或 InstallAnywhere 不那么令人反感。在 OSX 上,您可以指望 JVM 已经存在。在 Windows 上,如有必要,您需要为他们检查并安装它。 Linux 人员不会运行 Java GUI 应用程序,而少数会运行可执行 .jar 的人知道如何处理。

      【讨论】:

      • 真的吗? linux人不会运行gui应用程序?那么我猜他的程序对他们来说毫无用处,使整个讨论变得毫无意义。
      • @Matt 为什么假设原始应用程序是 GUI 应用程序?我在 Linux 上安装了许多命令行 java 应用程序,特别感谢那些以 .deb 或 .rpms 形式出现的应用程序。
      • 原标题说GUI。此外,如果 webstart 已经启动,那么它是一个 gui 应用程序是一个不错的选择。最后,说 linux 用户不使用 GUI 应用程序是完全不真实的。
      • 我不是说 linux 的人不运行 GUI 应用程序。我说他们不会运行“Java GUI”应用程序,并且在 NetBeans 和 Eclipse 之外(我在“很少有人会知道如何处理可执行 jar”中介绍)我想不出一个广泛使用的应用程序Linux 上的 Java 应用程序(Open Office 等是 C++ 并且仅将 Java 用于插件)。
      • 听说过 SQLDeveloper 吗?或者任何预言机管理工具?全部用 java 编码(虽然 sqldeveloper 最终被捆绑为 .exe,但它是 java)
      【解决方案5】:

      在我看来,优越的分发机制是使用类似ClickOnceWebStart 的技术。您只需将版本部署到服务器,并在版本发布时自动发送到客户端。 此外,Eclipse RCP 平台包含 UpdateManager,它可以做 WebStart 所做的事情,但还有更多。

      由于我使用 Maven2 进行构建,因此部署只是小菜一碟:将构建好的 jar 复制到服务器上的位置,如果需要更新 jnlp 文件,就完成了。

      【讨论】:

        【解决方案6】:

        advanced installer 可以轻松地将 Java 应用程序打包为 Windows 可执行文件,而且设置方式非常灵活。我发现要将 Java 应用程序分发到 Windows 客户端,这是最简单的方法。

        【讨论】:

          【解决方案7】:

          有多种解决方案,具体取决于您的分发要求。

          1. 只需使用一个罐子。这假定用户安装了正确的 java 版本,否则用户将得到“类文件格式版本”异常。这适用于公司内部的内部分发。

          2. 使用 launch4j 和 NSIS 等安装程序。这给了你更多的控制权,尽管用户仍然可以做一些愚蠢的事情,比如卸载 java 运行时。这可能是最流行的方法,也是我目前使用的方法。

          3. 使用 Webstart。这也假设用户安装了正确的 java 版本,但它更容易上手。我的经验是,这对于严格控制的 Intranet 环境来说很好,但是对于更大的部署来说会变得很痛苦,因为它有一些奇怪的故障。使用 Java 1.7 中的新插件技术可能会变得更好。

          4. 使用 Excelsior JET 等本机代码编译器并将其作为可执行文件分发,或将其打包在安装程序中。价格昂贵,而且它通常会将您与稍旧的 java 版本联系起来,并且动态类加载会有些痛苦,但它对于需要最大程度地减少支持麻烦的大规模部署非常有效。

            李>

          【讨论】:

          • 只是关于 Webstart 的说明:只要用户安装的 Java 版本不是石器时代(例如 1.2),就可以告诉 webstart 下载并安装更新的 Java 版本你需要的程序还没有。查看 .jnlp 文件语法。当然,它仍然非常突出地显示您正在使用 Java,这可能不适合您处理的客户端。在这些情况下,您确实应该采用某种“本机”安装程序/文件格式并尽可能隐藏实现细节。
          • 我不喜欢 Webstart。它有太多的 Java/Sun 品牌。很难让它正常工作。设置代码签名比它的价值更麻烦,而且用户无论如何也不了解安全优势和消息。如果你想在用户系统上做任何事情,你将不得不为你的代码签名证书付费以摆脱可怕的警告。它会进行很多复杂的缓存,这可能会导致问题。也许 OSGi 或即将推出的 Java 模块将提供类似的自动更新优势。我使用#2 的变体并从 Ant 中为 mac 创建 DMG/Packager。
          • 我按照你的建议使用了 NSIS。我还查看了launch4j。为什么建议同时使用两者?
          • @JackN NSIS 是一个安装程序生成器。 Launch4j 专门用于简化启动/启动 java 程序。它们的功能有一些重叠,但它们针对问题的不同部分。
          • +1 好答案。您有使用 Excelsior JET 的经验吗?是不是只支持x86架构,无法加载实时jar库?
          【解决方案8】:

          我开发 Eclipse RCP 应用程序。通常,要启动 Eclipse 应用程序,会包含一个可执行启动器。我将 java 虚拟机包含在 /jre 子目录的 application 文件夹中,以确保使用正确的 java 版本。

          然后我们用 Inno Setup 打包安装到用户的机器上。

          【讨论】:

            【解决方案9】:

            我会将 jar 文件与其他相关 jar、配置文件和文档以及 run.bat/run.sh 一起压缩。最终用户应该能够将其解压缩到任何位置并在需要时编辑 run.bat(在大多数情况下它应该在不编辑的情况下运行)。 如果您想在开始菜单、桌面、系统托盘等中创建条目,安装程序可能会很有用。

            作为用户,我更喜欢解压缩并运行安装(请不要输入开始菜单)。然而,IT 行业以外的人可能有不同的偏好。因此,如果应用程序主要针对开发人员 zip-run.bat 路由,而面向公众的应用程序可以使用安装程序进行安装。

            【讨论】:

            • 这对新手永远不起作用。
            【解决方案10】:

            虽然我自己没有使用过NSIS(Nullsoft Scriptable Installer System),但是有安装脚本会检查目标系统上是否安装了所需的JRE。

            Code ExamplesReal World Installers 页面提供了许多示例脚本,例如:

            (请注意,我并没有实际使用过任何脚本,所以请不要将其视为背书。)

            【讨论】:

              【解决方案11】:

              JSmooth 是一个简单的程序,它可以获取您的 jar 并将其包装在标准的 Windows 可执行文件中。它带有一个简单的 GUI,允许您配置所需的 JVM,将其与应用程序捆绑在一起,或者在尚未安装时提供下载它的选项。您可以按原样发送 exe 文件或使用可能的依赖项对其进行压缩(或让程序在启动时从网络下载额外的依赖项)。它也是免费的,就像啤酒和演讲一样,这可能(也可能不是)是件好事。

              【讨论】:

                【解决方案12】:

                installanywhere 很好但很贵——我还没有找到好的免费的

                【讨论】:

                【解决方案13】:

                我需要一种方法将我的项目及其依赖项打包到一个 jar 文件中。

                我使用 Maven2 Assembly 插件找到了我需要的东西:Maven2 Assembly plugin

                这似乎复制了one-jar 的功能,但无需额外配置即可运行。

                【讨论】:

                  【解决方案14】:

                  这取决于您的目标用户的成熟度。在大多数情况下,您希望将它们与您正在运行基于 Java 的应用程序的事实隔离开来。给他们一个本机安装程序,它可以做正确的事情(创建开始菜单条目、启动器、注册添加/删除程序等)并且已经捆绑了 Java 运行时(因此用户不需要知道或关心它)。我想推荐我们的跨平台安装工具BitRock InstallBuilder。虽然它不是基于 Java 的,但它通常用于打包 Java 应用程序。它可以很容易地与 Ant 集成,您可以从 Unix/Linux/Mac 构建 Windows 安装程序,反之亦然。因为生成的安装程序是本机的,所以它们不需要自解压步骤或 JRE 就已经存在于目标系统中,这意味着安装程序更小,并为您省去了一些麻烦。我还想提一下,我们有开源项目的免费许可证

                  【讨论】:

                    【解决方案15】:

                    分发广告的最佳方式是什么? Java 应用程序?如果 Java 应用程序需要安装工件 到用户的电脑?有没有 良好的Java安装/打包 有系统吗?

                    根据我的经验(来自evaluating a number of options),install4j 是一个很好的解决方案。它为任何平台创建本机安装程序,专门用于安装 Java 应用程序。详情见其官网“Features”。

                    不过,install4j 是一个商业工具。特别是如果您的需求相对简单(只需分发应用程序并安装一些工件),还有许多其他不错的选择,包括免费的(如izPack 或已经提到的Lauch4j)。但您要求最佳方式,据我目前所知,install4j 是一种,尤其是用于分发更大或更复杂的 Java (EE) 应用程序。

                    【讨论】:

                    • 你知道如何强制它在 Mac OS 上运行 JVM 5.0 吗?在 windows 中,您只需捆绑 JRE,但在 mac 上,它们可能配置了另一个默认 JVM。所以我不确定如何明确强制它使用你想要的特定 JVM 版本......
                    • @Stephane,我实际上并没有使用 install4j 创建 OS X 安装程序,但考虑到它具有灵活的 JRE 捆绑/检测选项,我认为这应该不是问题。有关它们的更多信息,请查看此答案中的链接:stackoverflow.com/questions/995881/…
                    • 由于 Mac 支持创建 Java 应用程序包,您可以像这样在 info.plist 中指定 JRE... JVMVersion1.5+ 您可以删除加号以要求特定版本。我就是这样做的,但我不使用 install4j。有很多页面解释了在 Web 上创建 Mac App budles。我还建议只看一下limewire 或vuze(java 应用程序)是如何做到的。您还可以查看他们用于构建应用程序包和 dmg 文件的构建脚本,因为它们是开源的!
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-05-16
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-04-19
                    相关资源
                    最近更新 更多