java应用war下载,WAR包 vs 集成服务器的Java应用,warjava

WAR包 vs 集成服务器的Java应用,warjava

大部分服务器端Java应用程序(如Web或面向服务)都是在容器内运行。传统方式是将应用打成WAR包用于分发。这和ZIP压缩包是同样的目录结构,包含了所有的库和运行时的应用间的相互依赖。因为这种格式具有共通性,你可以部署到你偏爱的容器,例如Tomcat、Jetty、JBoss、GlassFish等。

但是有一种方法彻底颠覆了这种模型。在这种方法中, Java应用就像普通程序一样可通过命令行执行,而不是被部署到容器中。它将容器和应用绑在一起。

许多语言使用这种方法。 Python的Django框架就包含了进行开发和测试的服务器,而Ruby on Rails也有可用于生产环境的嵌入式服务器。对使用Jetty 部署的Java应用来说,这个概念也存在了一段时间。然而,离规范化还比较远,结果还是将WAR包部署到Tomcat服务器。

现在也出现了类似的呼声。去年的DevNexus会议,我去了James Ward的讲座,他当时在Heroku做“开发推广”。James 推荐和支持将捆绑了服务器的应用程序部署到Heroku的云平台。

他的讲座主要是关于Java和Scala的Play框架,Play框架嵌入了Netty,类似于Rails服务器。 不同于Grails框架的是,它使用一个Django式服务器的开发方式,仍然是使用WAR包发布,Play框架从开发到生产环境一直使用其自带服务器。James提倡在所有的Java应用程序使用这种方法。

嵌入式体验

当我开始写Hibernate Serach by Example的时候,我希望着重于Hibernate Search上,而不是其他框架或服务器问题。所以我没有用Spring,而是用Servlet3.0来写这本书的示例应用程序。

我通常使用Eclipse作为自己的开发环境,并测试本地Tomcat上的web应用。不过,为了支持使用IntelliJ,Netbeans和不使用IDE的读者。我想在构建脚本嵌入一个测试服务器,以便读者无需安装或配置任何东西就可以运行示例代码。

通过Maven来使用嵌入式服务器

我的第一个目标是使用Maven脚本启动服务器,这样读者就不必手动安装服务器或将它导入到IDE里 。将Jetty Maven Plugin添加到项目的POM文件后。可以使用以下命令:

mvn clean jetty:run

为了让修改了的静态文件在服务器运行的时候可以立刻生效。因为,我碰到过文件被锁定的情况,导致修改后的问题不能保存。研究后发现Jetty的默认设置会引起Windows映射文件锁定。可以在配置文件更改useFileMappedBuffer属性。

首先,你必须打开Jetty的JAR包找到相应的配置文件.在Maven本地仓库就可以找的这个JAR包(就是jetty-webapp,而不是jetyy-server) 。复制一份webdefault.xml,将useFileMappedBuffer改为false,将其另存到在你的项目中,并更新Maven POM文件:

org.mortbay.jetty

jetty-maven-plugin

8.1.7.v20120910

${basedir}/src/main/webapp/WEB-INF/webdefault.xml

虽然有点小麻烦,但是还是搞定了。

通过其他构建工具来使用嵌入式服务器

我知道,许多Java开发人员不喜欢Maven。所以,我想提供一份使用Ant构建的示例应用程序。需要在build.xml配置什么才可以让Ant使用到Jetty呢?

可以使用Ant integration for Jetty,但它比Maven更麻烦。即使使用了Ivy这样的依赖管理系统, Ant脚本还是无法下载和管理嵌入式服务器。你必须自己下载一个独立的Jetty服务器,然后手动复制到您的项目。谁不想把这6M可执行的二进制文件添加到源码中呢?

当你复制完了Jetty的JAR包后,你还要手动添加另一个关于Ant集成的JAR。出乎意料的是,支持的最新版本是Jetty7(实现的是Servlet 2.5规范,都已经八年了)。

上个月我发现可以支持Jetty8了,但是我是去年秋天写的这本书。我必须重写我的示例程序,将Servlet3.0替换为Servlet2.5,我都开始怀疑这是否值得。

在代码中使用嵌入式服务器

我的书的最后一章讲了在集群环境中的Hibernate 搜索应用。Maven插件是单例的,所以我决定写一个启动类可以在不同的端口创建两个Jetty实例。将这个类作为一个JUnit测试类,这样我就可以通过Maven启动它:

mvn clean compile war:exploded test

应用中的servlets,listeners和RESTful服务在启动时还没注册呢。经过研究我发现,可以设置Jetty对Servlet3.0特性的支持(例如注解),默认是不支持的

说实话,我也不完全理解“hightide”和“non-hightide”的区别。但是加上下面的代码就可以保证注解是有效的:

...

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命令来进行构建,然后执行profile脚本里面的命令。

我可以通过Maven 的run命令启动Jetty服务器。Maven在测试阶段会管理classpath下的依赖,Heroku推荐使用他们的demo Java applications,可以将你的应用和Tomcat绑定在一起。太好了,毕竟我对Tomcat熟悉点。

但是,如果你的应用程序的数据库连接是JNDI资源,那就有问题了。 因为Heroku捆绑的Tomcat不支持JNDI。这就是为什么Heroku的servlet demo只能演示基于Spring的应用。James离开Heroku后,Heroku就没有更新过他们的Java站点。

不用担心,因为还有其他版本的Jetty,而且支持将JNDI设置当作命令参数。现在解决了关于嵌入Jetty服务器的问题了。

但是,如果在JSP中使用了JSTL标签库 ,Jetty在处理classpath的时候就会出问题。当在命令行中运行它,你需要传递一些参数

1.Jetty JAR包

2.应用程序的WAR包

3.Maven build好的WAR包

(*)你没看错。结束了嵌入式的噩梦后, Heroku最后还是用WAR包!

我的Heroku Profile:

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从它的classpath加载JSTL标签库而不是从应用classpath。

结论

将嵌入式服务器添加到框架中在概念上不会有什么问题。写一个Play框架的应用程序很容易,但是部署到Heroku却很麻烦。在日常工作中,我使用hybris(基于Spring)将Tomcat服务器构建到应用中。这样你就不用写很多的自定义脚本。

但是,这种方法难被广泛使用。将嵌入式服务器和应用绑在一起本来就很痛苦了。别人的示例代码可能没有问题,但是你的应用可能就出现一些不同的问题,需要自己解决。将嵌入式服务器和直接使用Tomcat比较下:

1.下载Tomcat和将其解压缩

2.将应用WAR包放到Tomcat 的webapps目录下

3.启动Tomcat

唯一的优势是可以在Heroku上演示。云服务商正在提高对Java的支持。现在可以使用Jelastic将WAR包部署到Tomcat 7 或 GlassFish 3上。 AppFog支持部署到Tomcat 6与Tomcat 7。在不久的将来,就不用为了云部署而修改应用了。

因此,概括地说,这取决于你所使用的框架。如果应用和嵌入式服务器集成在一起,效果就很好,如果只是一味的粘贴在一起,那么就很糟糕。如果我现在写的Hibernate searhc By 示例程序,那么构建脚本将生成:一个WAR文件,和一个Tomcat的下载链接。

原文链接: javacodegeeks 翻译: Wld5.com - MarkGZ

译文链接: http://www.wld5.com/10666.html

[ 转载请保留原文出处、译者和译文链接。]

相关文章暂无相关文章

无需数据库 本资源含界面预览 本系统没有数据库,您可将目前网络上的任意网站的接口瞬间变成您的数据源,取数据超 easy ------------------------------------------------ -----------------如何部署------------------------- ------------------------------------------------ 下载压缩,将压缩中的 yijavaBlog-1.0.0.war 解压缩到 Tomcat 的 webapps/ROOT 即可访问浏览 ------------------------------------------------ -----------------接口配置的例子------------------- ------------------------------------------------ { name:"mobileSegment", url:"https://api.it120.cc/common/mobile-segment/location", returnType:"json" } 上面配置后,您就可以直接在 html 静态页面上这样写: ${mobileSegment("mobile=13500000000").data.province} 即可在页面上显示 “广东” ,除了 province ,您可以获取接口返回的任意数据哦 ~ ------------------------------------------------ -----------------关于接口------------------------ ------------------------------------------------ 目前有很多网站偶读提供了接口服务,比如 juhe.cn apistore.baidu.com market.aliyun.com/data 您无需担心接口的稳定性和速度等问题 (您自己搭建的数据库能比他们稳定、安全么?) 脱离了数据库还有一个棒棒的原因: 您可以随时更换你的网站服务器,而不要关心数据迁移问题,因为数据本身就是保存在 阿里云、百度、聚合数据 上的 同时,聪明的您或许发现了 : 可以同时部署在多台服务器上,配置一样的接口即可,不就轻松实现分布式集群部署了么 ?~ ------------------------------------------------ -----------------开源项目------------------------ ------------------------------------------------ 本项目是一个开源项目,所以您完全可以免费使用,同时也希望您加入到这个项目的贡献中来,为开源出一份微博之力吧 :~ 开源项目地址: https://github.com/gooking/yijava-blog 有什么好的想法或者建议,欢迎在 github 上面给我留言、互动 ~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值