maven web项目开发

 

linkin: 
cargo(服务器部署):http://cargo.codehaus.org/
maven commands
描述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

标准的maven的web项目的布局是一个src/main/webapp目录,这里边放着所有以前构建j2ee web项目的目录webroot,(WebContent)中的一切静态文件(不包括lib和class),在执行mvn package 构建的时候,maven的war打包插件会从这个目录中抽取静态文件打包成.war文件。需要注意的是其他maven插件也会从这个标准的布局中执行他们的执行过程。比如jetty插件。

以下是自定义web应用静态文件的maven构建示例:

1.声明war的打包方式。
<packaging>war</packaging>
2.声明maven 处理资源文件的编码,和指定web.xml文件路径:(如果采用标准的maven布局,这个属性( maven.war.webxml)是不需要的)
<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>
   </plugins>
 </build>
4.用Jetty Plugin以 disassebled方式 部署应用
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
               -->
      <overrideDescriptor>${jetty.webdefault.xml}</overrideDescriptor>
    </webAppConfig>
    <stopKey>foo</stopKey>
    <stopPort>9999</stopPort>
  </configuration>
</plugin>
b.配置settings.xml文件,
这一步是用于简化maven运行jetty的命令。因为只有官方插件才默认支持简化的语法。一般第三方的插件需要mvn <groupId>:<artifactId>:<version>:<goalName> 这种语法。配置了之后就可以通过mvn jetty:run 这种简化的语法启动jetty

<pluginGroups>
     <pluginGroup>org.mortbay.jetty</pluginGroup>
</pluginGroups>
c.启动jetty:3
定位到项目目录,jetty:run就可以启动程序了。
d.关闭jetty:
mvn jetty:stop -DstopPort=<stop value> -DstopKey=<stop key>

5.生成site,会在${maven.build.t
a.配置site plugin
<plugin>
  <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>
b.mvn site:site
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个属性值。




你可能感兴趣的:(maven,Web,J2EE,jetty)