【问题标题】:Whats best way to package a Java Application with lots of dependencies?打包具有大量依赖项的 Java 应用程序的最佳方法是什么?
【发布时间】:2008-11-19 14:59:42
【问题描述】:

我正在使用 eclipse 编写一个 java 应用程序,它引用了一些外部 jars,并且需要一些配置文件供用户访问。

  1. 打包部署的最佳方式是什么?

  2. 我的理解是你不能把jar放在另一个jar文件中,对吗?

  3. 我可以将我的配置文件保留在 jar 之外,并且仍然在代码中引用它们吗?或者配置文件的路径应该是命令行参数?

  4. 是否有任何第三方 Eclipse 插件可以帮助简化此操作?我目前正在使用 ant 构建文件,但我不确定自己在做什么。

  5. Visual Studio 中是否有类似的部署项目,可以找出您需要的所有内容并制作安装程序?我以前使用过 install4j,如果没有像 .Net 部署项目那样自动化的话,它非常强大。

干杯。

【问题讨论】:

    标签: java eclipse deployment


    【解决方案1】:

    没有一种“最好的方法”。这取决于您部署的是 Swing 应用程序、webstart、applet、库还是 Web 应用程序。每个都是不同的。

    关于第 2 点,您是对的。 Jar 文件不能包含其他 jar 文件。 (嗯,从技术上讲他们可以,只是内部 jar 文件不会在你的类路径上,实际上意味着 jar 文件不包含 jar 文件)。

    关于第 3 点,您当然可以在 jar 文件之外引用配置文件。您通常可以将配置文件作为文件或资源引用。如果您使用资源方法,它通常来自类路径(可以在 jar 中)。如果使用文件,则指定文件名(不在 jar 中)。

    一般来说,大部分Java开发者都会使用Apache Ant来实现部署。它有据可查,所以请看一下。

    【讨论】:

    • 在第 5 点,Maven(虽然需要一些配置,但不是很多)管理您的依赖关系。
    【解决方案2】:

    (1) 您可能希望考虑的 ant 替代品是 maven。

    可以在here找到对maven的简要介绍。

    为了构建一个 JAR,maven 有 jar 插件,它可以自动确保所有依赖的 jar 都列在你的 jar 清单中。

    如果您使用的是 eclipse,请同时下载 maven integration。

    (2) 另一种选择是使用OneJar(免责声明:我自己没有尝试过)。

    【讨论】:

    • 鉴于您正在运行一个独立的应用程序,OneJar 将是我的明确建议。优点之一是它允许您通过双击 jar 在 Windows 中运行应用程序。
    【解决方案3】:

    答案因您要构建的东西而异。

    如果您正在构建库,最好将您的工作作为 jar 文件分发。可以通过 jar 清单中的 Class-path 属性引用您的 jar 依赖项,尽管我通常认为这很不酷。该属性是为小程序设计的,并且在库中很少使用,因此当此技术将内容拉入类路径时(尤其是用户可能已经在使用的常见内容),您可能会遇到意外的版本冲突。而且很难追查为什么你会看到他们。

    使用 pom 信息将 jar 发布到 Maven 存储库以跟踪依赖关系对于库来说也是一个很好的选择。如果您这样做,请在您的文档中发布您的 Maven 坐标!

    如果您正在构建应用程序,两种流行的选择是分发 zip/tar/任何部署结构或使用安装程序。如果该程序是一种服务器式的东西,那么前者更为常见。后者对于客户来说更常见。通常,安装程序只会布置部署结构,并且可能会执行一些额外的任务,例如在特定于操作系统的位置进行安装。

    要构建您的部署结构(也称为“工具包”),您需要在您使用的任何构建系统中创建一个可重复的过程。 Ant 有很多这样的例子,而 Maven 有可以提供帮助的程序集插件。通常,您需要包含一个 jar 代码、任何依赖项、启动程序的脚本、可能是 JRE,以及您可能需要的任何其他资源。

    如果您想创建安装程序,有很多免费和商业选项。我认识的一些人最近对免费的IzPack 有很好的体验,但请查看您的选择。

    【讨论】:

      【解决方案4】:

      你应该试试FatJar。这是一个 Eclipse 插件,只需在项目上单击鼠标右键,即可构建一个 JAR 文件,其中包含运行应用程序所需的一切,包括必要的第三方 JAR。

      我们每天都使用它,与 JSmooth 结合使用来创建可执行文件,将我们的软件包部署给我们的客户,并且像魅力一样工作。

      【讨论】:

        【解决方案5】:

        好吧,如果您说的是独立桌面应用程序的部署:

        在我们切换到 web start 之前,我们一直在创建三个部署档案,一个用于 windows,一个用于 mac,一个用于其他平台。

        在 Windows 上,我们成功地使用了 Nullsoft Scriptable Install System(以被旧版本的 winamp 使用而闻名)和它的 ant task,尽管有一些缺点:

        • 它只能在 Windows AFAIR 上使用
        • 您必须手动完成一些工作,即自定义向导创建的脚本 AFAIR

        另一方面,它可以创建带有开始菜单条目的 Windows 安装。还有一个用于集成 NSIS shell 脚本编辑的 eclipse 插件。

        在 Mac OS X 上,有一个 ant task 可以从您的 java 文件创建一个 .app 文件,这样您就可以像原生 os x 应用程序一样启动它。但请注意不要将任何设置写入您的主目录并使用应用程序目录。

        对于其他人,您必须期望他们在 un*x 环境中并使用 shell 脚本部署您的应用程序以启动应用程序。

        在任何情况下,您都可能需要部署您的自定义 policy file 以获得应用程序的访问权限。

        如果您想摆脱所有包装和东西,您应该认真考虑使用web start。自从切换到它之后,我们节省了很多时间,即简化了我们的部署过程,负责更新等。

        2014 年更新

        使用maven assembly plugin,参见“创建可执行jar”部分

        【讨论】:

          【解决方案6】:

          蚂蚁。这不是世界上最好的东西,但它是标准的,它是 apache,它可以工作。 网上有一些很好的例子,如何为任何人制作一个简单的 build.xml,它有一些特性,比如“战争”任务,它知道如何将所有基本的东西(类、web.xml 等)放在 jar 文件中为你。 您还可以告诉它获取其他配置文件和 jars,它会很乐意这样做。 编译什么也很聪明。你给它一个目录,它会找到所有的 java 文件并只在它们的类文件过期时构建它们,所以你可以毫不费力地免费获得一些传统的 make 功能。

          【讨论】:

          • 如果你要投反对票,至少评论告诉我为什么这是个坏建议?
          【解决方案7】:

          您可以查看其他 Java 项目(例如 JMeter、SquirrelSQL、JEdit、Cernunnos 等)。每个人对应用程序的打包方式略有不同,因此在查看这些内容时请考虑您的目标。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-05-19
            • 2017-10-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多