WAR文件与具有嵌入式服务器的Java应用程序

大多数服务器端Java应用程序(例如,面向Web或面向服务的)都希望在容器中运行。 打包这些应用程序以进行分发的传统方法是将它们捆绑为WAR文件。 这无非是具有标准目录布局的ZIP归档文件,其中包含运行时所需的所有库和应用程序级依赖项。 这种格式几乎可以互操作,并且可以部署到您喜欢的任何服务器容器,Tomcat或Jetty,JBoss或GlassFish等。

嵌入式Java服务器300x229 但是,还有另一种流派完全颠覆了这种模式。 通过这种方法,Java应用程序像任何普通应用程序一样被打包用于命令行执行。 嵌入式容器不是部署到容器,而是部署在应用程序本身中!

这对于使用多种语言的课程来说是一样的。 适用于Python的Django框架包括用于开发和测试的捆绑服务器,而Ruby on Rails附带了一个用于生产的嵌入式服务器。 这个概念在Java中已经存在了一段时间, Jetty专攻嵌入式利基市场。 但是,这与规范相去甚远,事实上的标准仍然是可以部署到Tomcat的WAR文件。

但是,嗡嗡声越来越大。 在去年的DevNexus会议上,我参加了James Ward的会议,当时他是Heroku的“开发者”。 捆绑您自己的容器是将应用程序部署到Heroku的基于云的平台的推荐方法,而James是一个大力支持者 。

他的会议专门针对Java和Scala的Play框架,该框架以类似于Rails服务器的方式嵌入Netty 。 与Grails不同, Grails使用Django风格的服务器进行开发,然后将其作为WAR文件发布,而Play则打算在生产过程中一直使用自己的服务器。 James在所有Java应用程序中都倡导了这种方法。

一场嵌入式冒险

休眠搜索书封面242x300
我至少喝了一口Kool-Aid。 当我开始编写示例Hibernate Search by Example时 ,我想将重点放在Hibernate Search上,而不是其他任何框架或服务器问题上。 因此,我避开了Spring,并使用普通的Servlet 3.0方法编写了本书的示例应用程序。

我通常在自己的开发环境中使用Eclipse,并将其指向本地Tomcat实例以测试Web应用程序。 但是,我想为喜欢使用IntelliJ,Netbeans或根本不使用IDE的读者提供支持。 因此,我决定将构建脚本嵌入测试服务器,以便读者可以运行示例而无需安装或配置任何东西。

在Maven中使用嵌入式服务器

我的第一个目标只是从我的Maven构建脚本中启动服务器,因此读者不必安装服务器或将其集成到IDE中。 我以前看过这件事,这很简单,只需将Jetty Maven插件添加到项目的POM中即可。 读者应该能够使用以下命令构建示例应用程序并一步启动它:

mvn clean jetty:run

由Maven内置300x99 嗯,不是那么快。 您应该能够对静态内容进行更改,并看到更改在服务器运行时立即生效。 但是,我遇到了有关文件被锁定的错误。 在花了一些时间进行研究之后,我发现Jetty的默认设置在Windows文件锁定中效果不佳。 可以通过在一个配置文件中切换一个属性来解决此问题。

但是,您必须打开Jetty JAR文件才能获取此配置文件的正确副本。 首先,你要挖围绕本地Maven回购,并找出哪些 JAR文件破解打开(它原来是码头,web应用,而不是码头服务器)。 一旦获得了webdefault.xml文件的副本并切换了useFileMappedBuffer设置,就必须将副本保存在项目中的某个位置,并更新Maven POM以在此处查找而不是在Jetty JAR内部查找:

<plugin><groupId>org.mortbay.jetty</groupId><artifactId>jetty-maven-plugin</artifactId><version>8.1.7.v20120910</version><configuration><webAppConfig><defaultsDescriptor>${basedir}/src/main/webapp/WEB-INF/webdefault.xml</defaultsDescriptor></webAppConfig></configuration>
</plugin>

好吧……比我预期的麻烦得多,但是我可以解决这个问题。

将嵌入式服务器与其他构建系统一起使用

我知道许多Java开发人员都讨厌Maven。 因此,我想提供使用Ant构建的本书示例应用程序的版本,以说明如何适应默认概念。 那么,我应该在build.xml中添加哪一行以使Ant使用Jetty?

蚂蚁 嗯,不是那么快。 用于码头Ant集成 ,但它比Maven的更繁琐。 即使您使用的是Ivy之类的依赖项管理系统,您的Ant脚本也无法为您下载和管理嵌入式服务器。 相反,您必须下载完整的独立Jetty服务器,然后手动将其片段复制到您的项目中。 谁不希望将6兆的可执行二进制文件提交到源代码管理中?

在Jetty服务器JAR上复制后,您需要手动添加另一个JAR文件以进行Ant集成。 令我惊讶的是,我发现最新的受支持版本是Jetty 7,实现了将近8年的Servlet 2.5规范。
我看到他们终于在上个月添加了Jetty 8,但是当我去年秋天写这本书时,这对我没有帮助。 我不得不为Servlet 2.5(而不是3.0)重写这个示例应用程序版本,并且开始怀疑这是否真的值得。

通过代码使用嵌入式服务器矩阵码150x150

本书的最后这一章讨论了在集群服务器环境中运行的Hibernate Search应用程序。 Maven插件纯粹是单实例的,因此我决定编写一个小的引导程序类,该类将在语法上在不同端口上启动两个Jetty实例。 通过将此类构造为JUnit测试,我仍然可以让Maven像这样自动启动它:

mvn clean compile war:exploded test

嗯,不是那么快。 启动时未注册我的应用程序的Servlet,侦听器和RESTful服务。 经过大量浪费的研究时间后,我发现有很多不同的Jetty “风味”可用,默认情况下启用或禁用Servlet 3.0功能(例如注释)。

老实说,我仍然不完全了解如何分辨“高潮”和“非高潮”之间的区别。 我只能告诉您的是,为了使注释能够正常工作,我必须将这段代码添加到我的bootstrap类中:

...
masterContext.setConfigurations(
new Configuration[] {
new WebInfConfiguration(),
new WebXmlConfiguration(),
new MetaInfConfiguration(),
new FragmentConfiguration(),
new EnvConfiguration(),
new PlusConfiguration(),
new AnnotationConfiguration(),
new JettyWebXmlConfiguration(),
new TagLibConfiguration()
}
);
...

比将WAR文件拖放到Tomcat的/ webapps文件夹中更简单,更直观,对吗?

从控制台和云使用嵌入式服务器

完成本书后,我希望将示例代码的演示版本推送到GitHub并部署到Heroku 。 从理论上讲,Heroku可以运行可以从命令行在本地运行的任何应用程序。 如果Heroku找到Maven POM,它将运行mvn clean程序包,然后执行您在名为Procfile的脚本中放置的所有启动命令。

终端图标150x150 我的程序化Jetty启动器在Maven运行的情况下运行良好。 但是,Maven在测试时正在管理我的类路径依赖项,现在我需要在没有该帮助的情况下可以使用Jetty。 Heroku在其演示Java应用程序中使用的推荐方法是将您的应用程序与Tomcat的一个文件版本捆绑在一起。 太棒了,无论如何,我还是更熟悉Tomcat!

嗯,不是那么快。 如果您的应用程序希望将数据库连接(或其他任何内容)注册为JNDI资源,那么您就自己决定了。 Heroku捆绑的Tomcat运行程序不支持JNDI设置。 嗯......也许这就是为什么Heroku的香草servlet的演示并没有真正做什么,以及为什么只演示应用程序, 做一些事情,而不是是基于Spring。 现在,我考虑了一下,James Ward去年离开了Heroku,为TypeSafe工作,自从他离开后,Heroku就没有对其Java网站进行任何更新。 喝了

云150x150
不用担心,因为有一个类似的单文件Jetty Runner ,它确实允许您将JNDI设置作为命令行参数传递。 此外,我们已经投入了大量时间来解决嵌入式Jetty的所有问题!

嗯,还是太快了。 如果您在JSP视图中使用JSTL taglib(即您生活在21世纪),那么Jetty Runner会让您陷入混乱 。 从命令行运行它时,您需要将参数传递给Java,以实现以下目的:

  1. Jetty Runner JAR文件
  2. Web应用程序的WAR文件(*)
  3. 在Maven构建期间生成的WAR文件的分解版本

(*)您没看错。 经过所有这些嵌入式噩梦之后,Heroku 实际上仍在使用WAR文件

我的Heroku个人资料最终看起来像这样:

web: java $JAVA_OPTS -jar target/dependency/jetty-runner-8.1.7.v20120910.jar --lib target/hibernate-search-demo-0.0.1-SNAPSHOT/WEB-INF/lib --port $PORT --jdbc org.apache.commons.dbcp.BasicDataSource "url=jdbc:h2:mem:vaporware;DB_CLOSE_DELAY=-1" "jdbc/vaporwareDB" target/*.war

这里有多个类加载器在工作,这使Jetty Runner可以从其类路径而不是Web应用程序的类路径加载JSTL / taglib东西。

结论

苹果派150x150 从一开始就将嵌入式服务器概念嵌入框架中,嵌入式服务器概念就没有本质上的错误。 编写Play应用程序是一种乐趣,将它们部署在Heroku上几乎是微不足道的。 在日常工作中,我使用一个名为hybris的基于Spring的商务软件包,该软件包的扩展构建系统将Tomcat服务器捆绑到您的应用程序中。 只要您不需要过多地定制构建脚本,就可以正常工作。

风管胶带婴儿150x150 另一方面,该概念对于广泛的通用用途而言太脆弱和脆弱。 用管道将嵌入式服务器连接到普通Java应用程序上纯属痛苦。 您也许可以坚持别人的工作示例的安全性,但是当您的应用执行任何不同的操作时,您就可以自行解决损坏问题。 将我的嵌入式冒险带入上面,并将其与使用Tomcat的“麻烦”进行对比:

  1. 下载Tomcat并将其解压缩到某个位置
  2. 将您的WAR文件拖放到Tomcat的/ webapps子目录中
  3. 启动Tomcat

我获得的唯一真正优势是能够在Heroku上运行演示的能力。 但是,来自云提供商的Java支持每天都在提高。 Jelastic允许您立即将普通的WAR文件部署到Tomcat 7或GlassFish 3。 AppFog支持部署到Tomcat 6 ,即将支持Tomcat 7 。 我怀疑在不久的将来, 修改应用程序以进行云部署的想法将被视为不合时宜。

简而言之,这取决于您使用的框架。 如果嵌入式服务器是嵌入式的,那么它们可能会很酷。 如果将它们用胶带固定,则可能会很可怕。 如果我今天写的是Hibernate Search by Example ,示例应用程序构建脚本将产生两件事:一个WAR文件和一个Tomcat下载链接。

参考:来自stefperkins.net博客的JCG合作伙伴 Steve Perkins的WAR文件与带有嵌入式服务器的Java应用程序的比较 。

翻译自: https://www.javacodegeeks.com/2014/03/war-files-vs-java-apps-with-embedded-servers.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364692.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaFX自定义控件– Nest Thermostat第3部分

嗨&#xff0c;经过与同事的讨论&#xff0c;我今天决定展示css方法不是唯一可用于创建自定义控件的方法。 当然&#xff0c;它允许提供一些外观扩展点&#xff0c;但是可以使用代码API使用相同的方法&#xff08;与向JavaFX的转换&#xff09;一起使用。 这是图形初始化方法&…

ceph rgw java_ceph rgw multisite基本用法

Realm&#xff1a; Zonegroup&#xff1a; 理解为数据中心&#xff0c;由一个或多个Zone组成&#xff0c;每个Realm有且仅有 一个Master Zonegroup&#xff0c;用于处理系统变更&#xff0c;其他的称为Slave Zonegroup&#xff0c;元数据与Master Zonegroup保持一致&#xff1b…

Python基础-Hello Word!

老师说&#xff0c;学习语言一定要有仪式感&#xff0c;So... print (“Hello Word”) 哈哈&#xff0c;好牛叉&#xff01; 一、 Python安装 Windows 1、 下载安装包 https://www.python.org/downloads/ 2、 安装 默认安装路径: C:\Users\admin\AppData\Local\Programs\Python…

微信小程序 request请求封装

request 只用 POST&#xff0c;只封装了 POST&#xff0c;等有用到 GET再重写&#xff0c;接口用的 ThinkPHP5.0主要代码 var apiurl "xxxxx"; function http_post(controller,data,cb){wx.request({url:apiurl controller,data:data,method:post,header:{Content-…

MySQL基本语句

MySQL基本语句 数据库语句介绍&#xff1a; 语言分类&#xff1a; DDL&#xff1a;数据库和表 DML&#xff1a;表中的数据 DQL&#xff1a;查询表中的数据 DCL:(授权) DDL: 1、操作数据库 创建数据库&#xff1a; create database 数据库名&#xff1b; 创建数据库&#xff0c;…

使用Java注解不正确的方法

几乎没有什么Deprecated没有适当的文档看到Deprecated方法更令人生气的了。 我感到失落。 我应该仍然使用该方法吗&#xff1f; 可能这不是开发人员的意图&#xff0c;这就是为什么他/她添加了弃用注释。 我应该使用其他东西吗&#xff1f; 所以…。 使用Deprecated的规则是什…

easypanel mysql错误_Easypanel v1.6(虚拟主机控制面板)图文使用教程

一、Easypanel软件简介&#xff1a;Easypanel是一款虚拟主机管理工具&#xff0c;它支持php(windows系统还支持asp、asp.net)、磁盘配额、在线文件管理、在线web软件安装&#xff0c;是一款集虚拟主机、ftp、mysql等功能为一体的管理系统&#xff0c;本身还集成了kangle web服务…

游戏、脑洞大开1(密码简单破译)

“二八”妙龄写密码&#xff0c;看谁聪明“爱死他”。 密文&#xff1a;766C7273626F76706A5E6F715F7271766C72706D626B71716C6C71666A62 注意&#xff1a;&#xff08;1&#xff09;此题由正心41上课的同学做 &#xff08;2&#xff09;第一个提交&#xff0c;答案&#xff1a…

html-字体属性

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>* {margin: 0;padding: 0;}/*font-family 字体类型浏览器默认的字体是微软雅黑&#xff0c;字体中有多个字体的时候&…

thinkPHP利用ajax异步上传图片并显示、删除

近来学习tp5的过程中&#xff0c;项目中有个发帖功能&#xff0c;选择主题图片。如下&#xff1a; 利用原始的文件上传处理&#xff0c;虽然通过原始js语句能实时显示上传图片&#xff0c;但是这样的话会涉及很多兼容问题。使用ajax技术&#xff0c;实现选择性删除所选图片功能…

我喜欢构建器模式的三个原因

有三种方法可以用Java编程语言创建新对象&#xff1a; 伸缩构造函数&#xff08;反&#xff09;模式 Javabeans模式 建造者模式 与其他两种方法相比&#xff0c;我更喜欢使用构建器模式。 为什么&#xff1f; Joshua Bloch描述了构建器模式以及在Effective Java中使用它的…

表单php跳转页面跳转,form表单页面跳转方式提交练习

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼//form表单提交练习/*新建一个form.html网页用来书写前端HTML表单*/表单提交练习姓名:年龄:电话:地址:QQ:自我评价://以上功能可自己添加或修改/*在form.html网页的基础上新建一个foms.php网页关联之前的form.html网页并书写php测试…

.NetCore模拟Postman的BasicAuth生成Authrization

一、思路 BasicAuth 是一种简单权限&#xff0c;传输UserName<userName>,Password<password> 1.用:连接Username,Password 2.进行Base64编码 3."Basic空格"拼接 二、代码示例 string authorization $"{userName}:{password}"; var authorizat…

Vue项目页面跳转时候的,浏览器窗口上方的进度条显示

1.安装&#xff1a; cnpm install --save nprogress 2.在main.js中引入&#xff1a; 1 import NProgress from nprogress 2 import nprogress/nprogress.css 3.在main.js中进行配置&#xff1a; 1 NProgress.configure({ 2 easing: ease, // 动画方式 3 spee…

使用Spring跟踪应用程序异常

几周前&#xff0c;一位同事要求我花一个星期的时间做后援&#xff0c;因为他需要一个掩护&#xff0c;而他度过了一个赚钱的假期&#xff0c;而他找不到其他人。 当我刚完成一个特别复杂的编码项目并感到有些疲倦时&#xff0c;我说“是”。 毕竟&#xff0c;改变对我有好处。…

php redis.dll php5.6,在Windows 64位下为PHP5.6.14安装redis扩展

一.php安装redis扩展1.使用phpinfo()查看当前版本的信息2.根据PHP版本号&#xff0c;编译器版本号和CPU架构选择php_redis-2.2.5-5.6-nts-vc11-x64.zip和php_igbinary-1.2.1-5.5-nts-vc11-x64.zip下载地址&#xff1a;http://windows.php.net/downloads/pecl/snaps/redis/2.2.5…

js sort方法根据数组中对象的某一个属性值进行排序(实用方法)

js sort方法根据数组中对象的某一个属性值进行排序 sort方法接收一个函数作为参数&#xff0c;这里嵌套一层函数用来接收对象属性名&#xff0c;其他部分代码与正常使用sort方法相同. var arr [{name:zopp,age:0},{name:gpp,age:18},{name:yjj,age:8} ];function compare(pr…

洛谷 P1018乘积最大

题目描述 今年是国际数学联盟确定的“20002000――世界数学年”&#xff0c;又恰逢我国著名数学家华罗庚先生诞辰9090周年。在华罗庚先生的家乡江苏金坛&#xff0c;组织了一场别开生面的数学智力竞赛的活动&#xff0c;你的一个好朋友XZXZ也有幸得以参加。活动中&#xff0c;主…

matrix derivatives

来源&#xff1a;cs229 stanford Machine Learning Notes转载于:https://www.cnblogs.com/pertinencec/p/10082965.html

Project Student:维护Webapp(只读)

这是Project Student的一部分。 其他职位包括带有Jersey的 Web服务 客户端&#xff0c;带有Jersey的 Web服务服务器 &#xff0c; 业务层 &#xff0c; 具有Spring数据的持久性 &#xff0c;分片集成测试数据 &#xff0c; Webservice集成和JPA标准查询 。 当我开始这个项目时…