linkin:
cargo(服务器部署):http://cargo.codehaus.org/
maven commands
标准的maven的web项目的布局是一个src/main/webapp目录,这里边放着所有以前构建j2ee web项目的目录webroot,(WebContent)中的一切静态文件(不包括lib和class),在执行mvn package 构建的时候,maven的war打包插件会从这个目录中抽取静态文件打包成.war文件。需要注意的是其他maven插件也会从这个标准的布局中执行他们的执行过程。比如jetty插件。描述jetty插件 :mvn help:describe -Dplugin=org.mortbay.jetty:jetty-maven-plugin -Ddetail描述jetty:stop goal: mvn help:describe -Dcmd=jetty:stop -Ddetail启动jetty: mvn jetty:run默认的端口停止jetty: mvn jetty:stop -DstopPort=9999
以下是自定义web应用静态文件的maven构建示例:
1.声明war的打包方式。
2.声明maven 处理资源文件的编码,和指定web.xml文件路径:(如果采用标准的maven布局,这个属性( maven.war.webxml)是不需要的)<packaging>war</packaging>
<properties ><!--通过此属性覆盖maven自带的多种插件的默认编码方式 --><project.build.sourceEncoding >utf-8</project.build.sourceEncoding><webapp.dir>${basedir}/WebContent</webapp.dir><!-- 指定webapp的web.xml文件路径 --><webapp.webxml>${webapp.dir}/WEB-INF/web.xml</webapp.webxml><jetty.webdefault.xml>${basedir}/src/test/resources/webdefault.xml</jetty.webdefault.xml></properties >
3.自定义war插件的配置,手动指定指定webapp的目录
<build><!--这个属性是用来打包成war格式的命名,会覆盖掉 maven本身带版本号的命名方式 --><finalName >MavenWebBuildDemo</finalName><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>2.3</version><executions><execution><id>extract-web-resource</id><phase>package</phase><goals><goal>war</goal></goals><inherited>false</inherited><configuration><warSourceDirectory>${webapp.dir}</warSourceDirectory></configuration></execution></executions></plugin><!--- Generate Exploded War Dir -->
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>2.3</version><executions><execution><id>generate-exploded-war</id><phase>package</phase><goals><goal>exploded</goal></goals><inherited>false</inherited><configuration><warSourceDirectory>${webapp.dir}</warSourceDirectory></configuration></execution></executions></plugin>
4.用Jetty Plugin以 disassebled方式 部署应用</plugins></build>
a. 配置jetty插件
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>8.1.8.v20121106</version>
<configuration>
<webAppSourceDirectory>${webapp.dir}</webAppSourceDirectory>
<scanIntervalSeconds>10</scanIntervalSeconds>
<webAppConfig>
<contextPath>/</contextPath>
<descriptor>${webapp.webxml}</descriptor><!--解决jetty对css,javascript等的静态文件的锁定问题(工作空间更新css,javascript文件,但是没有任何效果)详情: https://www.assembla.com/spaces/liftweb/wiki/Fix_file_locking_problem_with_jettyrun-->b.配置settings.xml文件,
<overrideDescriptor>${jetty.webdefault.xml}</overrideDescriptor>
</webAppConfig>
<stopKey>foo</stopKey>
<stopPort>9999</stopPort>
</configuration>
</plugin>
这一步是用于简化maven运行jetty的命令。因为只有官方插件才默认支持简化的语法。一般第三方的插件需要mvn <groupId>:<artifactId>:<version>:<goalName> 这种语法。配置了之后就可以通过mvn jetty:run 这种简化的语法启动jetty
<pluginGroups>c.启动jetty:3
<pluginGroup>org.mortbay.jetty</pluginGroup>
</pluginGroups>
定位到项目目录,jetty:run就可以启动程序了。d.关闭jetty:
5.生成site,会在${maven.build.tmvn jetty:stop -DstopPort=<stop value> -DstopKey=<stop key>
a.配置site plugin
<plugin>b.mvn site:site
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<version>3.2</version>
<configuration>
<!--
配置maven site插件的report插件,
由于pmd生成报告会试图调用jxr插件来生成引用交叉,
而jxr插件的调用会试图关联javaDoc所以最好3个插件
一起声明。当然pmd插件也可以单独使用。用正常的插件配置
之后mvn pmd:pmd就ok了
-->
<reportPlugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.9</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jxr-plugin</artifactId>
<version>2.3</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>2.7.1</version>
<configuration>
<targetJdk>1.6</targetJdk>
<aggregate>true</aggregate>
</configuration>
</plugin>
</reportPlugins>
</configuration>
</plugin>
Appendix A: issue reference
Bean type class com.opensymphony.xwork2.ObjectFactory with the name xwork has already been loaded by bean jetty maven...
这种错误是由于jetty重复载入了jar包,一般出现这种问题是由于你自定义了web应用的静态文件(html, jsp, vm, js, css..)目录(默认是src/main/webapp)。这个目录的WEB-INF/lib下包含了web应用的jar包,但是maven构建的时候,它又会从local repository(本地库)中载入jar包,所以就会引起这样的冲突。这时只要删除WEB-INF/lib下的目录就好了 并在eclipse中,在工程上右键->properties->deployment assembly->将deploy path一栏中的WEB-INF/lib干掉就
多模块构建
多模块构建的时候,如果直接从web子模块启动jetty,它就会报找不到父工程的错误。只要切换到父工程目录 , mvn install 将父工程的pom部署到local repository就ok了
the parameters 'stopPort', 'stopKey' for goal org.mortbay.jetty:jetty-maven-plugin:8.1.8.v20121106:stop are missing or invalid
缺少stopPort,和stopPort参数来停止jetty。如果没有在配置中指定,stopPort属性,运行 mvn jetty:stop -DstopPort=9999就可以了。默认的端口9999。如果配置了则需要指定相应的2个属性值。