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

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

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

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

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

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

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

干杯。

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

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

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

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

(1)你可能希望考虑的另一种ant是maven 。

可以在这里找到maven的简介。

为了构建JAR,maven有jar插件,它可以自动完成确保jar清单中列出所有依赖jar的过程。

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

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

答案取决于你正在建造什么样的东西。

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

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

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

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

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

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

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

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

在我们切换到Web启动之前,我们已经创建了三个部署档案,一个用于Windows,一个用于mac,另一个用于其他平台。

在Windows上,我们已成功使用Nullsoft脚本安装系统 (以旧版Winamp版本的用法而闻名)及其ant任务 ,但有些缺点是:

  • 它仅适用于Windows AFAIR
  • 您必须手动完成一些工作,即自定义向导创建的脚本AFAIR

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

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

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

在任何情况下,您可能必须部署自定义策略文件以获取应用程序的访问权限。

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

2014年更新

使用maven程序集插件 ,请参阅“创建可执行jar”部分

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

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