当前位置: 首页 > 知识库问答 >
问题:

使用嵌入式容器部署war文件与可执行jar的建议

梁丘成和
2023-03-14

java领域目前似乎有一种趋势,即不再以war文件(或ear文件)的形式将java web应用程序部署到java servlet容器(或应用程序服务器),而是将应用程序打包为具有嵌入式servlet/HTTP服务器(如Jetty)的可执行jar。我的意思更多的是因为较新的框架正在影响新应用程序的开发和部署方式,而不是应用程序如何交付给最终用户(因为,例如,我理解了为什么Jenkins使用嵌入式容器,非常容易获取和使用)。采用可执行jar选项的框架示例:Dropwizard、Spring Boot和Play(好吧,它不在servlet容器上运行,但嵌入了HTTP服务器)。

我的问题是,在一个环境中,我们已经将我们的应用程序(到目前为止主要是Struts2)部署到单个tomcat应用程序服务器上,如果我们计划使用嵌入式容器方法,需要做哪些更改、最佳实践或注意事项?目前,我们有大约10个国产应用程序在一台html" target="_blank">tomcat服务器上运行,对于这些小型应用程序来说,共享资源和在一台服务器上进行管理的能力是不错的。我们的应用程序并不打算分发给最终用户在他们的环境中运行。但是,如果我们决定使用更新的java框架,那么这种方法是否应该改变呢?向可执行JAR的转变是否受到云部署(例如,Heroku)使用增加的推动?

如果您有过在单个应用服务器上以Play style of deployment和传统war文件部署管理多个应用程序的经验,请分享您的见解。

共有1个答案

商弘义
2023-03-14

一个有趣的问题。这只是我对题目的看法,所以对一切都半信半疑。我偶尔使用servlet容器和嵌入式服务器来部署和管理应用程序。我相信使用servlet容器仍然有很多很好的理由,但我将试着只讨论为什么它们现在不那么受欢迎。

简短的版本:Servlet容器对于管理单个主机上的多个应用程序非常有用,但对于仅管理单个应用程序似乎不太有用。对于云环境,每个虚拟机只有一个应用程序似乎更可取,也更常见。现代框架希望与云兼容,因此向嵌入式服务器的转变。

所以我认为云服务是放弃servlet容器的主要原因。就像servlet容器让您管理应用程序一样,云服务让您管理虚拟机、实例、数据存储等等。这听起来更复杂,但在云环境下,已经向单一应用程序机器转变。这意味着您通常可以像对待应用程序一样对待整个计算机。每个应用程序都运行在具有适当大小的机器上。云实例可以在任何时候弹出和消失,这对于扩展来说是很好的。如果应用程序需要更多的资源,则创建更多的实例。

此外,云是很酷的,非云的东西是无聊的(如果我们仍然相信炒作的话)。许多框架都试图在默认情况下具有可伸缩性,这样就可以轻松地将它们部署到云中。嵌入式服务器的部署和运行速度很快,因此它们似乎是一个合理的解决方案。Servlet容器通常仍然受到支持,但需要更复杂的设置。

其他一些要点:

  • 嵌入式服务器可以针对框架进行优化,或者更好地与框架工具集成(例如,播放控制台)。
  • 并非所有云环境都带有可自定义的机器映像。与编写初始化脚本来下载和设置servlet容器相比,使用专用软件部署云应用程序要简单得多。
  • 我还没有找到一个Tomcat安装程序,它不会在应用程序重新部署几次后就出现perm gen space错误。当您几乎可以立即在临时实例和生产实例之间切换而不会停机时,(重新)启动嵌入式服务器的时间稍长一点是没有问题的。
  • 正如问题中已经提到的,最终用户只需运行应用程序就非常方便。
  • 嵌入式服务器具有可移植性强、开发方便等特点。今天一切都是快速的,原型和MVP需要尽可能快地创建和交付。没有人愿意花太多的时间为每个开发人员建立一个环境。
 类似资料:
  • 如果这感觉有点“死亡”,请原谅。我看了看,发现只有一个类似的问题在这里没有答案(Spring-Boot嵌入式战争)。 更新只是为了更好地清除,我有一个已经运行的Spring应用程序独立服务器,它有自己的嵌入式Tomcat。在嵌入的Tomcat中,我插入了一些我开发的@控制器。然后,我还能够使用ServletRegistrationBean映射第三方servlet(映射到/servlet-path)

  • 我在项目的下的静态文件夹中放置了一些静态资源,例如。我们使用的库希望通过执行使用servlet上下文加载一些资源。 当我在Eclipse中运行这个项目时,的真实路径解析为。我不知道为什么它使用这个文件夹,而它不存在于项目中?如果我创建了可执行jar并运行它,那么给出。这个目录确实存在,但里面什么也没有。 很明显,如果通过HTTP请求,我可以很好地看到我的资源,但通过servlet上下文,我不能像预

  • 我在Netbeans中创建了一个java项目,现在正处于构建阶段。我的项目中的所有东西都设置好了,我在它的属性中设置了一个主类,我甚至将我的项目设置为主项目。当我进行“清理和构建”时,会用我的。jar文件创建一个dist文件夹。但是,.jar文件是不可执行的,为什么呢?我打开了。jar文件并查看了清单,指定了一个main类,那么有什么问题呢?我运行的是Netbeans 7.3.1。谢了。

  • 我提取了一个包含xml、java类等的可执行jar文件。实际上,这个可执行jar文件是一个具有依赖关系的库。我需要修改这个库中一个类文件中的一行代码。我已经成功地编辑了类文件,现在我想把它重新打包到可执行的jar中。如何做到这一点。

  • 11.5 创建可执行的jar文件 让我们通过创建一个能够运行在生产环境中、完全独立且可执行的jar文件来完成我们的示例。可执行jar(有时称为“fat jar”)是包含有被编译的类以及代码运行所依赖的所有jar的归档文件。 可执行的jar和Java Java没有提供任何标准的方法来加载嵌套的jar文件(即包含在一个jar文件中的jar文件)。如果您想发布一个独立的应用程序,这可能会导致问题。 为了

  • 我完全能够在这两种情况下配置spring boot,这里的问题是哪一种更健壮,更值得推荐,因为我在spring boot文档中没有找到在生产环境中部署它的推荐方法,我对使用嵌入式容器的关注是: 如果我想将其设置为Windows或Linux服务,那么jar文件是最佳选项吗? 如果我使用jar文件,我将无法重新启动服务器。 也许将来我需要在同一个容器中有更多的应用程序。 如果重新启动计算机,我必须再次