是否有任何集成良好的应用程序管理堆栈允许构建、部署和更新作为服务器运行的非.war
Java 应用程序?例如作为服务器的消息消费者(但不是网络服务器并且没有 Servlet),或者嵌入 Jetty 的可执行 .jar
?
构建和部署 .war
非常简单:Maven 有 war 原型(prototype),Jenkins 有一堆插件用于将 .war
文件部署到各种应用服务器,大多数其中接受在运行时上传新的 Web 应用程序。 Elastic Beanstalk 等工具使此过程更加轻松,并与服务器环境的管理联系在一起。
相比之下,部署可执行文件 .jar
似乎是在重新发明轮子。人们需要找出最好的方法来隐藏依赖关系并使用过多的 Maven 插件创建一个可执行的工件,将这个工件存放在某个地方,然后找到一种方法将它安装在目标服务器上,并在必要时替换/升级它(Debian 包将是这样做的一种方式)。
这对我来说似乎非常“手动”,以至于将应用程序作为 .war
部署到应用程序服务器似乎是有利的,即使它们不适合这样的环境,这样您就可以从工具支持中获益。
最佳答案
您可以通过将应用程序部署到 osgi 容器来实现这一点。
您可以挂接到 osgi 生命周期以在 osgi 包启动时运行您的应用程序。然后你可以远程启动和停止容器(如果容器支持的话)。
您的应用程序可以将它们的依赖项定义为 osgi list 的一部分 - 但是使用 shade 插件着色 jar 在使用 maven 时并不困难,而且我认为它更容易管理而不是处理容器中的数百个 jar。
This question讨论使用 jenkins 持续部署 osgi 包。
另一种(更标准的)方法是编写自动部署的脚本 - 可能使用专门构建的工具,如 puppet或 chef .有一个maven plugin对于 puppet,它允许您从 maven 存储库中提取工件以用于您的 puppet 脚本。
从 jenkins 运行 puppet 或 Chef 很简单,如果需要,您可以向非技术人员提供对部署构建的访问权限,让他们只需单击一个按钮即可将新构建部署到环境中。
就像@bagheera 建议构建您的应用程序的 rpm 并将它们作为服务启动是一个很好的方法,可以降低部署脚本的复杂性。
关于java - 部署非 .wars 的 Java 服务器应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11430142/