jettyidea jetty 热部署署时,怎么设置能让war包

[插件]Maven&Jetty&Plugin&配置指南
& Jetty7 -
此插件更名为jetty-maven-plugin,以便更符合maven2的协定。为了在Web应用做快速应用开发做准备,。为了在Jetty里运行一个Web应用,你如果按照Maven默认的做法构造(resources文件存放
${basedir}/src/main/webapp下Classes文件存放在${project.build.outputDirectory}下,web.xml的配置描述${basedir}/src/main/webapp/WEB-INF/web.xml),你不需要配置任何其它东西,只需输入:mvn
jetty:run。这将在端口为8080的Jetty服务器上启动你的项目。Jetty将持续运行,直到插件是明确停止,例如,按下&ctrl-c&,您也可以使用mvn
jetty:stop命令。
&&委托这个插件运行Web应用是非常方便的,因为它可以配置成能定期扫描Web应用的任何改变和自动部署Web应用。这就可以消除开发周期中编译和部署的步骤从而更加富有成效。你使用的IDE时对项目做的任何改变,都将直接自动导入到当前运行的web容器里,使您可以立即对其进行测试,立竿见影。
&&如果不管出于什么原因,你总不能运行一个未组合过的web应用吧,在下文讨论中提到这个插件同样也支持jetty:run-war和jetty:run-exploded命令。
关于其他命令的更多信息请查阅Jetty文档中的、、。
自动执行插件
&&&有时候,例如在做集成测试时,你当然希望在测试开始时自动运行你的项目,测试完成时停止,而不只是手动的在命令行执行mvn
jetty:run吧。
&&&要做到这一点,你需要为jetty&插件创建几个&execution&脚本,并使用&daemon&true&/daemon&配置选项来预防Jetty无限期运行,迫使它只在执行Maven时才运行。
像下面pom.xml片段中描述的pre-integration-test和post-integration-test&就是用来触发执行和关闭Jetty:
&&&groupId&org.mortbay.jetty&/groupId&
&artifactId&maven-jetty-plugin&/artifactId&
&version&6.1.10&/version&
&configuration&
&&&&&&&&&&&&&&&
&scanIntervalSeconds&10&/scanIntervalSeconds&
&&&&&&&&&&&&&&&
&stopKey&foo&/stopKey&
&&&&&&&&&&&stopPort&9999&/stopPort&
&/configuration&
&executions&
&&&&&&&&&&&&&&&
&execution&
&&&&&&&&&&&&&&&&&&&&&&&
&id&start-jetty&/id&
&&&&&&&&&&&&&&&&&&&&&&&
&phase&pre-integration-test&/phase&
&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&goal&run&/goal&
&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&
&configuration&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&scanIntervalSeconds&0&/scanIntervalSeconds&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&daemon&true&/daemon&
&&&&&&&&&&&
&&&&&&&&&&&&&/configuration&
&&&&&&&&&&&&&&&
&/execution&
&&&&&&&&&&&&&&&
&execution&
&&&&&&&&&&&&&&&&&&&&&&&
&id&stop-jetty&/id&
&&&&&&&&&&&&&&&&&&&&&&&
&phase&post-integration-test&/phase&
&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&goal&stop&/goal&
&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&/execution&
&/executions&
注意:Maven默认都是通过org.apache.maven.plugins的groupId来查找插件的,即使这个groupId跟上面要表达的内容完全不同。为了更明确的指向这个groupId是我们需要的插件,唯一的办法就是在settings.xml也做如下设置:
&&&&&&&&&&&&&&&&&...
&&&pluginGroups&
&&&&&pluginGroup&org.mortbay.jetty&/pluginGroup&
&&&/pluginGroups&
&/profile&
如何通过命令行停止插件
委托Jetty插件无限期运行的目标包括run、run-war和run-exploded。你可以在视窗控制终端(如DOS窗口)使用&ctrl-c&关闭它,或者在另一个视窗控制终端使用stop目标关闭。如果你希望能使用mvn
jetty:stop&执行关闭命令,则需要你在插件中配置一个特殊的端口和控制键。下面是一个例子配置:
&&&&&&&&&groupId&org.mortbay.jetty&/groupId&
&&&&&&&&&artifactId&maven-jetty-plugin&/artifactId&
&&&&&&&&&version&6.1.10&/version&
&&&&&&&&&configuration&
&&&&&&&&&&&stopPort&9966&/stopPort&
&&&&&&&&&&&stopKey&foo&/stopKey&
&&/configuration&
mvn jetty:start
mvn jetty:stop
如何配置插件
配置公共的run,
run-war&和&run-exploded&目标
不管你执行哪一个Jetty目标,下述的配置参数都是可用的。一般来说它们分为应用于Web容器的配置和应用于具体web应用的配置:
容器级配置
Connectors&可选.一组对象,包含jetty的端口监听。如果你不指定任何一个NIO的,将默认配置一个8080端口。当然,你可以在命令行使用系统参数jetty.port改变默认端口。例如"mvn -Djetty.port=9999
jetty:run"。另外,您也可以指定许多您想要的连接。jettyConfig&可选。除插件配置参数外,你也可以指定一个jetty.xml文件的路径。当你有其他的web应用和操作需要部署时,或者一些你无法在插件中配置的jetty对象,你就可以使用到它,。
scanIntervalSeconds&可选[秒]。在很短的时间间隔内在扫描web应用检查是否有改变,如果发觉有任何改变则自动热部署。默认为0,表示禁用热部署检查。任何一个大于0的数字都将表示启用。
systemPropertie&可选。它们允许你在设置一个插件的执行操作时配置系统属性.更多的信息请查阅.
userRealms&可选。一组实现。请注意,它没有一个默认的Realm。如果你在你的web.xml应用了一个Realm,你需要在这里指定一个对应的Rleam。
requestLog&可选。一个请求日志接口的实现。比如就是一个作为NCSA格式的实现。
[译注:(美国)国家超级计算技术应用中心&(NCSA)&公用格式是常用的标准日志格式]
“手动重载”
6.2.0pre0版本起,添加了一个新的可用组件,用于控制web应用的重新部署。
配置参数:&reload&[manual|automatic]&/reload&
当你设置成手动模式后,web应用不会自动的扫描和重部署。相反,用户可以控制的Web应用时,通过键入”回车换行键”重载。当设置成自动模式时,将根据scanIntervalSeconds参数的设置不定时的扫描和自动重部署。你也能通过在命令行使用系统参数-Djetty.reload&配置选择重载的模式。
比如:"mvn -Djetty.reload=manual
jetty:run"&将强制手动重载,不管pom.xml文件里如何配置。同理: "mvn -Djetty.reload=automatic
-Djetty.scanIntervalSeconds=10
jetty:run"&每隔十秒中后台将重载一次,而不管pom.xml文件里如何配置。
Web应用级配置
contextPath&可选。这个contex地址指向你的webapp.默认情况下,它被设置成该项目的pom.xml的&artifactId&。当然你也可以设置一个你喜欢的从而覆盖它。
tmpDir&可选。它作为web应用的临时目录。它默认设置在{${basedir}/target}下,但是你也可在这里改变它的路径。
overrideWebXml&可选.&它是一个应用于web应用的web.xml的备用web.xml文件.这个文件可以存放在任何地方.你可以根据不同的环境中(如测试、开发等等)利用它增加或修改一个web.xml配置.
webDefaultXml&可选. webdefault.xml文件用来代替webapp默认提供给jetty的文件.
从6.1.6rc0发行版开始,一个替代的更灵活的方式是配置web应用时使用webAppConfig元素代替上面列出的那些单独的参数。使用webAppConfig元素,你能有效的调用类中任何setter方法。下面显示的列子将展示这个元素跟它上面的例子比较是如何配置同样的特性的(当然它们还有更多的特性能让你设置):
&&plugins&
&&&&&&&plugin&
&&&&&&&&&groupId&org.mortbay.jetty&/groupId&
&&&&&&&&&artifactId&maven-jetty-plugin&/artifactId&
&&&&&&&&&configuration&
&&&&&&&&&&&scanIntervalSeconds&10&/scanIntervalSeconds&
&&&&&&&&&&&!—web应用的配置&--&
&&&&&&&&&&&contextPath&/biggerstrongerbetterfaster&/contextPath&
&&&&&&&&&&&tmpDir&target/not/necessary&/tmpDir&
&&&&&&&&&&&webDefaultXml&src/main/resources/webdefault.xml&/webDefaultXml&
&&&&&&&&&&&overrideWebXml&src/main/resources/override-web.xml&/overrideWebXml&
&!—从jetty6.1.6rc0起,&你能用webAppConfig&元素代替
&&&&&&&&&&&webAppConfig&
&&&&&&&&&&&&&contextPath&/test&/contextPath&
&&&&&&&&&&&&&tempDirectory&${project.build.directory}/work&/tempDirectory&
&&&&&&&&&&&&&defaultsDescriptor&src/main/resources/webdefault.xml&/defaultsDescriptor&
&&&&&&&&&&&&&overrideDescriptor&src/main/resources/override-web.xml&/overrideDescriptor&
&&&&&&&&&&&/webAppConfig&
&&&&&&&&&&&!—容器的配置&--&
&&&&&&&&&&&jettyConfig&/my/special/jetty.xml&/jettyConfig&
&&&&&&&&&&connectors&
&&&&&&&&&&&&&connector
implementation="org.mortbay.jetty.nio.SelectChannelConnector"&
&&&&&&&&&&&&&&&port&9090&/port&
&&&&&&&&&&&&&&&maxIdleTime&60000&/maxIdleTime&
&&&&&&&&&&&&&/connector&
&&&&&&&&&&&/connectors&
&&&&&&&&&&&userRealms&
&&&&&&&&&&&&&userRealm
implementation="org.mortbay.jetty.security.HashUserRealm"&
&&&&&&&&&&&&&&&name&Test
Realm&/name&
&&&&&&&&&&&&&&&config&etc/realm.properties&/config&
&&&&&&&&&&&&&/userRealm&
&&&&&&&&&&&/userRealms&
&&&&&&&&&&&requestLog
implementation="org.mortbay.jetty.NCSARequestLog"&
&&&&&&&&&&&&&filename&target/yyyy_mm_dd.request.log&/filename&
&&&&&&&&&&&&&retainDays&90&/retainDays&
&&&&&&&&&&&&&append&true&/append&
&&&&&&&&&&&&&extended&false&/extended&
&&&&&&&&&&&&&logTimeZone&GMT&/logTimeZone&
&&&&&&&&&&&/requestLog&
&&&&&&&&&/configuration&
&&&&&&&/plugin&
&&/plugins&
&/project&
jetty:run的配置
&&run目标允许你把你未打包的web应用部署到Jetty.它包含在你的pom.xml文件的一部分元素里。下面额外的配置参数都是可用到的:
classesDirectory&这是你的web应用编译的classes存放的路径。你很少需要设置这个参数,其实可以在你的pom.xml用&build&&outputDirectory&替代它。
webAppSourceDirectory&默认设置在${basedir}/src/main/webapp下。如果你的源文件夹结构跟左边不同,就可以设置这个参数。
webXml&&默认设置在${maven.war.webxml}或者${basedir}/src/main/webapp/WEB-INF/web.xml,无论哪个文件都不是空的。如果觉得前两者都不合适,就设置它。
jettyEnvXml&可选。它指向一个jetty-env.xml文件的路径。允许你创建JNDI绑定并满足web.xml中&env-entry&、&resource-env-ref&和&resource-ref&元素中的条件。当然这个文件的使用范围仅仅在你的当前应用和其他应用同时部署时它并没有共享的情况下。(例如使用一个jettyConfig文件)
scanTargets&可选。周期性的扫描除了插件自动扫描外的文件和文件夹列表。
scanTargetPatterns&可选。如果你想扫描有一长串的额外文件,通过使用模式匹配表达式制定它们更加方便,它可以用来替代&&scanTargets&参数的枚举展示。这个参数包含一组&scanTargetPattern&。每一个都是由一个&directory&和&includes&[或者&excludes&]参数来指定文件的匹配模式。
下面的示例设置了所有这些参数:
&&plugins&
&groupId&org.mortbay.jetty&/groupId&
&artifactId&maven-jetty-plugin&/artifactId&
&configuration&
&webAppSourceDirectory&${basedir}/src/staticfiles&/webAppSourceDirectory&
&webXml&${basedir}/src/over/here/web.xml&/webXml&
&jettyEnvXml&${basedir}/src/over/here/jetty-env.xml&/jettyEnvXml&
&classesDirectory&${basedir}/somewhere/else&/classesDirectory&
&scanTargets&
&&&&&&&&&&&
&scanTarget&src/mydir&/scanTarget&
&&&&&&&&scanTarget&src/myfile.txt&/scanTarget&
&/scanTargets&
&scanTargetPatterns&
&&&&&&&&&&&
&scanTargetPattern&
&&&&&&&&&&&&&
&directory&src/other-resources&/directory&
&&&&&&&&&&&&&
&includes&
&&&&&&&&&&&&&&&
&include&***.properties&/include&
&&&&&&&&&&&&&
&/includes&
&&&&&&&&&&&&&
&excludes&
&&&&&&&&&&&&&&&
&exclude&**/myspecial.xml&/exclude&
&&&&&&&&&&&&&&&
&exclude&**/myspecial.properties&/exclude&
&&&&&&&&&&&&&
&/excludes&
&&&&&&&&&&&
&/scanTargetPattern&
&/scanTargetPatterns&
&/configuration&
&&/plugins&
&/project&
你也可以查看。
配置jetty:run-war
这个目标将首先把你的web应用打包成一个war文件,再发布到Jetty。如果你设置扫描间隔为非零,Jetty将观察你的pom.xml和war文件。如果有任何变化,它都将重新打包并部署war。
配置参数的详细描述如下:
webApp&打包后war的路径。默认为${project.build.directory}/${project.build.finalName}.war。如果目标存储空间不足,设置它到你的自定义路径下。
详细设置如下:
&&plugins&
&&&&&&&plugin&
&&&&&&&&&groupId&org.mortbay.jetty&/groupId&
&&&&&&&&&artifactId&maven-jetty-plugin&/artifactId&
&&&&&&&&&configuration&
&&&&&&&&&&&webApp&${basedir}/target/mycustom.war&/webApp&
&&&&&&&&&/configuration&
&&&&&&&/plugin&
&&/plugins&
&/project&&&
你也可以查看.
配置jetty:run-exploded
这个目标首先装配你的web应用到exploded-war文件,再发布到Jetty。如果你设置扫描间隔为非零,Jetty将观察你的pom.xml,WEB-INF/lib,&WEB-INF/classes和WEB-INF/web.xml的改变。如果有必要,它都将重新打包并部署war。
配置参数的详细描述如下:
webApp&exploded-war的路径。默认在${project.build.directory}/${project.build.finalName},但是能通过设置这个参数,从而覆盖它。
详细设置如下:
&&plugins&
&&&&&&&plugin&
&&&&&&&&&groupId&org.mortbay.jetty&/groupId&
&&&&&&&&&artifactId&maven-jetty-plugin&/artifactId&
&&&&&&&&&configuration&
&&&&&&&&&&&webApp&${basedir}/target/myfunkywebapp&/webApp&
&&&&&&&&&/configuration&
&&&&&&&/plugin&
&&/plugins&
&/project&
你也可以查看.
设置系统属性
你可以为插件的执行操作按name/value成对的方式指定系统属性。
请注意,如果发现有系统属性已经设置过(例如从命令行或者JVM本身),则这些配置的属性不会覆盖它们。
这个特性在整理命令行和保存一系列的键盘键入操作时是很有用的。
譬如,你通常会需要产生Commons logging:
-mons.logging.Log=mons.logging.impl.SimpleLog
使用了systemProperty配置的命令行可以再次更简短的运行mvn jetty:run,看下面的pom.xml&:
&&plugins&
&&&&&&&plugin&
&&&&&&&&&groupId&org.mortbay.jetty&/groupId&
&&&&&&&&&artifactId&maven-jetty-plugin&/artifactId&
&&&&&&&&&configuration&
&&&&&&&&&&systemProperties&
&&&&&&&&&&&&&systemProperty&
&&&&&&&&&&&&&&&name&mons.logging.Log&/name&
&&&&&&&&&&&&&&&&value&mons.logging.impl.SimpleLog&/value&
&&&&&&&&&&&&&/systemProperty&
&&&&&&&&&&&
&&&&&&&&&&/systemProperties&
&&&&&&&&&/configuration&
&&&&&&&/plugin&
&&/plugins&
&/project&
注意:你可以按&name&或者&key&的方式指定&systemProperty&的名称,使用哪个按你的喜好吧。
& Jetty本身并没有依赖一个特定的日志框架,它使用一个内置的日志记录器来输出标准错误。不管怎样,允许了Jetty和其他日志方法集成,如果在类路径中发现了一个日志的实现,它的使用将优先于Jetty内置的日志记录器。
&其实Jetty的JSP引擎已经包含了一个日志依赖。如果你使用JSP 2.0(即你运行的Java虚拟机[JVM]版本&1.5),这个JSP引擎依赖于commons-logging。默认的commons-logging日志记录器在记录信息为INFO及以上级别[DEBUG,WARN,ERROR]时,将提供插件使用的和的实现。
&您可以忽略这一点,按照下列步骤提供自己的commons-logging:
1.&使用插件中&dependencies&增加一个commons-logging和一个commons-logging的实现到插件类路径(如log4j)。请注意,如果您想把Jetty&容器的日志也将发送到这个记录器,你还应该加上这个用于桥接的jar包:
&&&&&&&&&groupId&org.mortbay.jetty&/groupId&
&&artifactId&maven-jetty-plugin&/artifactId&
&&&version&6.0-SNAPSHOT&/version&
&&&&&&&configuration&
&&&&&&&&scanIntervalSeconds&5&/scanIntervalSeconds&
&&&&&/configuration&
&&&&&&dependencies&
&&&&&dependency&
&&&&&&&&&&&groupId&commons-logging&/groupId&
&&&&&&&&&&&artifactId&commons-logging&/artifactId&
&&&&&&&&version&1.1&/version&
&&&&&&&&&&&type&jar&/type&
&&&&&&/dependency&
&&&&&&dependency&
&&&&&&&&&&&groupId&org.slf4j&/groupId&
&&&&&&&&&&&artifactId&slf4j-jcl&/artifactId&
&&&&&&&&&&&version&1.0.1&/version&
&&&&&&&&&&&type&jar&/type&
&&&&&&&/dependency&
&&&&&&&dependency&
&&&&&&&&&&&groupId&log4j&/groupId&
&&&&&&&&&&&artifactId&log4j&/artifactId&
&&&&&&&&&&&version&1.2.13&/version&
&&&&&&&&&&&type&jar&/type&
&&&&&&&/dependency&
&&&&/dependencies&
2.用-Dslf4j=false系统属性运行插件:
-Dslf4j=false&jetty:run
注意:如果你使用的是log4j,你将需要告诉log4j你配置文件的位置。譬如:
mvn -Dslf4j=false
-Dlog4j.configuration=file:./target/classes/log4j.properties
如果您使用的是JSP2.1&(即你运行的Java虚拟机[JVM]版本&=1.5&),那太好了,因为这个JSP已经没有什么特别的日志依赖。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。& & Jenkins 是个开源项目,提供一种易于使用的持续集成系统,让开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上。同时 Jenkins 能实施监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。
Jenkins 的前身是Hudson是一个可扩展的持续集成引擎。
安装Jenkins
本例用的是最新版Jetty9,在安全上做了升级,直接放在webapps目录部署不能成功,需要在webapps目录下添加文件jenkins.xml,内容如下:
class="org.eclipse.jetty.webapp.WebAppContext"
name="contextPath"/jenkins
name="war" name="jetty.home" default="."/webapps/jenkins.war
name="securityHandler"
name="loginService"
class="org.eclipse.jetty.security.HashLoginService"
name="name"Jenkins Realm
name="config" name="jetty.home" default="."/etc/realm.properties
详见:https://wiki.jenkins-ci.org/display/JENKINS/Jetty
Jetty发布项目
WAR包:直接拷贝到Jetty的webapps目录即可,Jetty会监测变化进行热部署,无需手动重新启动jetty。
在Jetty启动项目时有可能遇到OOME错误,解决方法:
vim /jetty9/start.ini
##找到#--exec取消注释,修改如下:
-XX:MaxPermSize=512m
配置jenkins的nginx代理时候出现: Jenkins says my reverse proxy setup is broken请修改一下nginx虚拟机host配置如下:
proxy_set_header
proxy_set_header
proxy_set_header
X-Forwarded-For
$proxy_add_x_forwarded_
location / {
proxy_pass http://127.0.0.1:8080$request_
access_log logs/-access_
Jenkins配置
主要设置包括三项:
源码管理SCM,本例用的是SVN,必要胡设置有一项是SVN地址,另一项是项目相对存放路径;
Poll SCM:根据SVN版本的变化选择是否需要进行项目集成;
本例是每天上午10点和下午3点,周一到周五(H 10,15 * * 1-5),用的是cron语法,详细请参考Jenkins说明;
执行Gradle构建脚本
##进入项目目录
cd ${WORKSPACE}/WAP
##赋予gradlew执行权限
chmod +x ./gradlew
##执行单元测试
./gradlew test
配置如图:
Gradle - build.gradle测试和部署部分
//======================Test集成测试===========================
//测试结果,默认为成功!
ext.testResult = true
testLogging.showStandardStreams = true
// 使用 TestNG ,默认是JUnit
useTestNG()
// 设置JVM运行时参数
minHeapSize = "128m"
maxHeapSize = "512m"
jvmArgs '-XX:MaxPermSize=256m'
//一组测试完成,如果有一组测试是失败的则设置整体结果为失败
afterSuite { descriptor, result -&
if (result.resultType == TestResult.ResultType.FAILURE) {
testResult = false
* 单元测试完成,如果成功则部署应用到测试环境的Jetty webapps目录,Jetty会自动热部署!
task testCompleted &&{
if (test.testResult) {
logger.lifecycle("Build war package!" )
//编译、打包
war.execute()
//COPY到部署目录进行部署
//可根据不版本分别分发到不同开发过程服务器,如M,BETA类型等
//本例只发布到集成测试服务器
//发布目录,可通过gradle.properties配置
def projectBuildDir = "/webapps/"
def warname = projectName + '-' + version + '.war'
def fromdir = buildDir.toString() + "/libs/" + warname
logger.lifecycle("Copy war
$fromdir To : $projectBuildDir")
from fromdir
into projectBuildDir
rename { String fileName -&
projectName + '.war'
} catch (Exception ex) {
logger.error("Error!" + ex.message )
//在执行完集成测试后执行testCompleted任务,根据测试结果判断是否需要部署。
test.finalizedBy testCompleted
查看集成测试报告
测试报告地址:
http://xxx/jenkins/job/WAP/ws/WAP/target/reports/tests/index.html
结果如图:
构建控制台输出Console Output
Started by an SCM change
Building in workspace /home/hadoop/.hudson/jobs/WAP/workspace
Updating https://192.168.0.140/svn/JENKINS-TEST/WAP at revision 'T15:28:28.900 +0800'
src/main/webapp/WEB-INF/spring-mvc.xml
src/main/webapp/tologin.html
At revision 12
[workspace] $ /bin/sh -xe /tmp/hudson384228.sh
+ cd /home/hadoop/.hudson/jobs/WAP/workspace/WAP
+ chmod +x ./gradlew
+ ./gradlew test
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:buildDashboard UP-TO-DATE
:testCompleted
Build war package!
/home/xxx/.hudson/jobs/WAP/workspace/WAP/target/libs/wap-1.0.war To : /usr/local/jetty9/webapps/
BUILD SUCCESSFUL
Total time: 35.719 secs
Finished: SUCCESS
频道: 脚本 标签:
&&&&相关课程jetty热部署时,怎么设置能让war包自动解压到webapps目录下_百度知道
jetty热部署时,怎么设置能让war包自动解压到webapps目录下
  通过Gradle我们可以很方便的使用内置jetty启动我们的web程序,在本地进行调试。但是在使用的过程中,我发现了几个问题,导致本地调试的效率大受影响。  如果使用 gradle jettyRun 启动jetty服务器后,项目里的静态资源(jsp,html,JavaScript文件)都被锁定了,导致无法实时修改这些静态资源。  既然无法实时修改这些静态资源,那意味着我们做一个很小的改动都需要先停止jetty server,然后修改,再重新启动jetty server,这样来回浪费很多时间,尤其是涉及前台页面改动时,每调整一个参数都需要重启jetty。  由于我以前使用过Maven,在Maven里jetty是可以显示热部署的。也就是说如果有静态文件被改动,那么jetty可以实时load并展现。那么在Gradle里面实现这个应该也不是难事,花了一些时间搞定了。  首先要解决文件被锁定的问题。  文件被锁定是由于在使用windows系统时,jetty默认在内存中映射了这些文件,而windows会锁定内存映射的文件。解决的办法就是修改jetty的配置,让其在启动server时将useFileMappedBuffer标志位设置为false。  设置方法有两种,一种是修改webdefault.xml文件中的useFileMappdBuffer标志位。webdefault.xml文件是jetty启动服务的配置文件,其先于项目中的WEB-INF/web.xml文件被加载。 jetty包中默认有这个文件,可以将其提取出来,保存在项目根目录下,并修改useFileMappedBuffer节点。  &param-name&useFileMappedBuffer&/param-name&  &param-value&false&/param-value&  然后在build.gradle加入对此文件的引用。  [jettyRun, jettyRunWar,jettyStop]*.with {  webDefaultXml = file(&${rootDir}/webdefault.xml&)  }  第二种方法是修改项目中的 WEB-INF/web.xml 文件,在其中加入这个节点。  &servlet&  &!-- Override init parameter to avoid nasty --&  &!-- file locking issue on windows.
--&  &servlet-name&default&/servlet-name&  &init-param&  &param-name&useFileMappedBuffer&/param-name&  &param-value&false&/param-value&  &/init-param&  &/servlet&  解决jetty的hot deploy的问题。  这个就比较简单了,Gradle的jetty插件有两个属性,一个是reload属性,需要设置为automatic。另一个属性是 scanIntervalSeconds,这是指定jetty扫描文件改变的时间间隔,默认为0,单位是秒。 在build.gradle中加入设置。  jettyRun {  reload =&automatic&  scanIntervalSeconds = 1  }  齐活。接下来运行 gradle jettyRun ,待服务启动起来以后,如果修改了静态资源,只需要按 Ctrl + R 刷新页面即可重新加载资源。
其他类似问题
为您推荐:
jetty的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 maven jetty 热部署 的文章

 

随机推荐