什么是打包具有大量依赖关系的Java应用程序的最佳方法?

时间:2008-11-19 14:59:42

标签: java eclipse deployment

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

  1. 将其打包进行部署的最佳方法是什么?

  2. 我的理解是你不能将Jars放在另一个jar文件中,这是正确的吗?

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

  4. eclipse中是否有任何第三方插件可以帮助您轻松实现这一目标?我目前正在使用ant build文件,但我不确定我知道自己在做什么。

  5. Visual Studio中是否存在相同的部署项目,这将找出您需要的所有内容并制作安装程序?我之前使用过install4j,如果没有像.Net部署项目那样自动化的话,那就很强大了。

  6. 干杯。

7 个答案:

答案 0 :(得分:6)

没有人'最好的方法'。这取决于您是要部署swing应用程序,webstart,applet,库还是Web应用程序。每个都不同。

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

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

通常,大多数Java开发人员都会使用Apache Ant来实现部署。它有详细记录,所以看看。

答案 1 :(得分:6)

(1)您可能希望考虑的另一种蚂蚁是maven

可以找到maven的简要介绍here

为了构建JAR,maven拥有jar插件,它可以自动执行确保jar清单中列出所有相关jar的过程。

如果你正在使用eclipse,那么也要下载maven integration

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

答案 2 :(得分:3)

答案取决于您正在构建的内容。

如果您正在构建库,最好将您的工作分发为jar文件。可以通过jar清单中的Class-path属性来引用jar依赖项,尽管我通常认为它是不冷却的。该属性是为applet设计的,并且在libs中很少使用它,当这种技术将内容拉入类路径时(特别是用户可能已经使用过的东西),你可能会遇到意想不到的版本冲突。而且很难找到你看到它们的原因。

将jar发布到带有pom信息的Maven仓库以跟踪依赖关系也是库的最佳选择。如果您这样做,请在您的文档中发布您的Maven坐标!

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

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

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

答案 3 :(得分:3)

您应该尝试FatJar。这是一个Eclipse插件,只需右键单击Project就可以构建一个JAR文件,其中包含运行应用程序所需的全部内容,包括必要的第三方JAR。

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

答案 4 :(得分:1)

好吧,如果您谈到部署独立桌面应用程序:

在我们切换到网络开始之前,我们一直在创建三个部署档案,一个用于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 env并使用shell脚本部署您的应用程序以启动应用程序。

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

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

更新2014

使用maven assembly plugin,请参阅“创建可执行jar”

部分

答案 5 :(得分:0)

蚂蚁。它不是世界上最好的东西,但它是标准的,它是apache,它的工作原理。 网上有一些很好的例子如何为任何一个创建一个简单的build.xml,并且它有一些功能,比如'war'任务,知道如何将所有基本内容(类,web.xml等)放在jar文件中为了你。 你也可以告诉它拿起其他配置文件和罐子,它会很乐意这样做。 关于编译什么也很聪明。你给它一个目录,它找到所有的java文件,只有当它们的类文件已经过时才构建它们,这样你就可以免费获得一些传统的make函数。

答案 6 :(得分:0)

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