2013-11-14 136 views
2

我有一个Java控制台应用程序,直到现在它在Netbeans IDE中开发。当Netbeans构建应用程序时,它将创建dist目录,并将该应用程序构建为一个jar归档文件,并将该应用程序拷贝到此目录中,并复制所有依赖项。这个目录可以被复制到最终目的地并运行。真实世界中如何部署Maven应用程序?

现在我试图将这个项目转移到Maven。一切顺利,我可以编译和打包我的应用程序,并将一个jar创建到target目录中。我使用maven-jar-plugin在清单中设置主类,并使用maven-shade-plugin将所有源打包到一个jar文件中。

我想问问你这个Maven项目是如何部署在现实世界中的?我应该使用所有target目录,将它复制到最终目的地并按照我以前用Netbeans的方式运行?当我不使用maven-shade-plugin时会产生什么结果 - 所有库都定义为依赖关系?我问,因为在我的测试项目中这些库不存在于target目录中。

我的问题 - 我有一个Java控制台应用程序“A”打包通过Maven(没有maven-shade-plugin)和Linux服务器“S”应该运行该应用程序。我可以将所有目标目录手动复制到服务器“S”,还是有一些更好/更自动的方式,这在现实世界中如何解决?

回答

6

只需复制目标目录并不能解决您的问题。我使用Maven打包了许多独立的应用程序,并且我使用Maven Assembly Plugin。您可以使用客户可以解压并开始运行的程序集插件来创建分发存档(zip,tar.gz)。

这取决于你,你如何希望你的目标应用程序目录结构(release)。我平时喜欢的东西

bin/ 
conf/ 
lib/ 
log/ 

bin目录包含一个shell /批处理脚本调用主类中运行你的程序结束,设置相应的类路径,提供相关的内存设置等等。我更喜欢使用classworlds(这是由Maven使用)来引导我的应用程序并简化开始脚本的编写。

conf目录包含用于您的应用程序的配置文件以及像log4j等日志记录配置文件。此目录添加到类路径上,以便在运行时访问配置资源。

lib目录包含代码的所有依赖jar和jar文件。

log是您的日志记录配置将指向输出日志文件的位置。

请注意,此结构适用于独立服务器,如应用程序。还有一个bin目录和运行脚本允许您将此目录添加到Windows/Linux上的PATH,以确保您可以从任何地方运行该应用程序。

如果您打包命令行实用程序,简单着色的jar可能适合您。我个人不是java -jar application.jar的最大粉丝

+0

谢谢!我会看看Maven Assembly Plugin,但还有一个问题,你是否将自己的目录结构(或zip,tar.gz归档文件)复制到最终位置,或者是否使用另一个插件?如果是这样,哪一个?你能为我提供一份你的配置Maven Assembly Plugin文件吗?先谢谢你。 – user2148736

+1

必须有插件才能复制文件等,您可以在Maven的后期包装阶段绑定这些文件,将您的存档复制到某个位置。您也可以使用Ant Run Maven Plugin将归档文件最终移动到某个位置。 –

2

该问题太广泛,无法全面回答,但我想提供一个真实世界的Maven部署示例。

有所有主流应用服务器的maven插件。他们已经确定了本地和远程部署的目标。一个这样的插件是jboss-as-maven plugin。您可以在您的.pom中或直接从命令行定义部署属性(IP,端口等),例如,

mvn jboss-as:deploy -Dpassword=mypassword 

还有专门从事应用程序部署的cargo plugin