Java 部署非';t.战争

Java 部署非';t.战争,java,deployment,automation,build-automation,executable-jar,Java,Deployment,Automation,Build Automation,Executable Jar,是否有任何集成良好的应用程序管理堆栈允许构建、部署和更新作为服务器运行的非.warJava应用程序?例如,作为服务器的消息使用者(但不是Web服务器,没有servlet)或嵌入Jetty的可执行.jars 构建和部署.wars非常简单:Maven有war原型,Jenkins有一堆插件,用于将.war文件部署到各种应用程序服务器,其中大多数在运行时接受新web应用程序的上传。像Elastic Beanstalk这样的工具使这一过程更加容易,并与服务器环境的管理相结合 相比之下,部署可执行文件.ja

是否有任何集成良好的应用程序管理堆栈允许构建、部署和更新作为服务器运行的非
.war
Java应用程序?例如,作为服务器的消息使用者(但不是Web服务器,没有servlet)或嵌入Jetty的可执行
.jar
s

构建和部署
.war
s非常简单:Maven有war原型,Jenkins有一堆插件,用于将
.war
文件部署到各种应用程序服务器,其中大多数在运行时接受新web应用程序的上传。像Elastic Beanstalk这样的工具使这一过程更加容易,并与服务器环境的管理相结合

相比之下,部署可执行文件
.jar
s似乎是在重新发明轮子。我们需要找出最好的方法来隐藏依赖项,并使用大量Maven插件创建一个可执行的工件,将这个工件存放在某个地方,然后找到一种方法将它安装到目标服务器上,并在必要时更换/升级它(Debian软件包将是一种方法)


在我看来,这一切都非常“手动”,以至于将应用程序作为
.war
部署到应用程序服务器似乎是有利的,即使它们不适合这种环境,这样您就可以从工具支持中获益。

看起来您正在寻找一个用于构建自包含可执行jar的依赖关系管理器,以及一个用于部署的包管理器。除了您提到的工具之外,您还可以在linux上查看build+dependency mgmt和+rpm+yum以进行包管理。

您可以通过将应用程序部署到osgi容器来实现这一点

当osgi包启动时,您可以钩住osgi生命周期来运行应用程序。然后可以远程启动和停止容器(如果容器支持)

您的应用程序可以将它们的依赖项定义为osgi清单的一部分,但是在使用maven时,使用shade插件对JAR进行着色并不困难,我认为这比处理容器中的数百个JAR更容易管理

讨论使用jenkins连续部署osgi捆绑包

另一种(更标准的)方法是编写自动化部署的脚本——可能使用专门构建的工具,如或。有一个for puppet,允许您从maven repo中提取工件,以便在您的puppet脚本中使用

从jenkins运行puppet或Chef非常简单,如果您愿意,您可以向非技术人员提供对部署构建的访问,让他们只需单击按钮即可将新构建部署到环境中


Like@bagheera建议为应用程序构建RPM并将其作为服务启动,这是一个很好的方法,可以降低部署脚本的复杂性。

谢谢您的回答-我将研究OSGi。关于编写脚本,这通常是我希望避免的方法,但这似乎是不可能的。如果将脚本编写与rpm建议结合起来,那么脚本非常简单1。)从maven repo下载rpm 2。)安装rpm。这显示了使用RPM后脚本变得多么简单-它使用webapps作为示例,但JAR同样有效。对于消息消费者来说,消息驱动EJB适合吗?这些可以发布到一个应用服务器作为一个jar。他们很可能是不幸的是,我在一个小型创业公司,他们认为任何“重量级”都是Satan的作品。