`
qqjavagood
  • 浏览: 94956 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Maven中如何配WAR依赖WAR和JAR的多模块项目结构

    博客分类:
  • java
阅读更多
    要使用的warpath插件包括以下插件配置元素在你的pom.xml
[...]<build>  <plugins>    <plugin>      <groupid>org.appfuse</groupid>      <artifactid>maven-warpath-plugin</artifactid>      <version>1.0-snapshot</version>      <extensions>true</extensions>      <executions>        <execution>          <goals>            <goal>add-classes</goal>          </goals>        </execution>      </executions>    </plugin>  </plugins></build>[...]

你要在classpath中包含的依赖关系,并添加warpath类型的war
[...]<dependencies>  <dependency>    <groupid>org.appfuse</groupid>    <artifactid>appfuse-web</artifactid>    <version>2.0</version>    <type>war</type>  </dependency>  <dependency>    <groupid>org.appfuse</groupid>    <artifactid>appfuse-web</artifactid>    <version>2.0</version>    <type>warpath</type>  </dependency></dependencies>[...]

注:war和warpath依赖类型是必需的:war类型是由使用maven的war-plugin做战争war,warpath类型的warpath插件,以确定项目的类路径正确的文件列入名单。

以下是还建议,以避免相同的jar依赖的几个版本,在最后的war,建立覆盖过程中,由于工件(所有的传递依赖)
[...]<build>  <plugins>    <plugin>      <groupid>org.apache.maven.plugins</groupid>      <artifactid>maven-war-plugin</artifactid>      <configuration>        <dependentwarexcludes>web-inf/lib/*</dependentwarexcludes>      </configuration>    </plugin>  </plugins></build>[...]



先考虑如下实际情况:
war项目c和war项目b都依赖war项目a和jar项目x. 项目a中保存了b和c项目通用的web资源,比如通用的javascript,css,jsp等. 项目x中保存了b和c项目中都依赖的一些class
开发人员希望每次都只面对一个项目,即team a 开发项目a, team b开发项目b, team c开发项目c....以此类推
每个team在开发自己项目时,都希望能直接进行调试,例如war项目a可以直接部署到tomcat上运行测试
最后实际交付给客户的却只有2个项目: b和c .也就是说,最后要打包b和c,而在b和c的war包中都要包含a中的web资源和x中的class
在纯maven中的实现方案

纯maven环境比较简单,经过一段曲折(先是修改maven-war-plguin源码,再是自定义一个插件),最后发现居然有一个现成的插件可以实现这个功能,示范如下:
<dependency>   <groupid>com.isoftstone.gads</groupid>   <artifactid>common-web</artifactid>   <version>0.0.1-snapshot</version>   <type>war</type></dependency><dependency>   <groupid>com.isoftstone.gads</groupid>   <artifactid>common-web</artifactid>   <version>0.0.1-snapshot</version>   <type>warpath</type></dependency> <plugin>    <groupid>org.apache.maven.plugins</groupid>    <artifactid>maven-war-plugin</artifactid>    <version>2.1-beta-1</version>    <configuration>     <!- 必须指定,否则默认会变成在target/war/work 导致被打包进war文件,指定后为target/work ->     <workdirectory>${project.build.directory}/work</workdirectory>     <webappdirectory>webcontent</webappdirectory>     <usecache>false</usecache>     <archive>      <addmavendescriptor>true</addmavendescriptor>     </archive>     <overlays>      <overlay>       <groupid>com.isoftstone.gads</groupid>       <artifactid>ebiz-common-web</artifactid>      </overlay>      <overlay>       <!-- empty groupid/artifactid is detected as the current build -->       <!-- 代表当前war项目,默认情况下当前war项目是先被拷贝的,如果要控制其顺序,则使用空的overlay -->       <!-- any other overlay will be applied after the current build since they have not been configured in the overlays        element -->      </overlay>     </overlays>     <dependentwarexcludes>*/web.xml,web-inf/lib/*,/sql-map-config.xml,/jdbc.properties,/meta-inf/*</dependentwarexcludes>    </configuration>   </plugin><plugin>    <groupid>org.appfuse.plugins</groupid>    <artifactid>maven-warpath-plugin</artifactid>    <version>2.1.0-m1</version>    <extensions>true</extensions>    <executions>     <execution>      <goals>       <goal>add-classes</goal>      </goals>     </execution>    </executions>    <configuration><!-- below web-inf/classes -->     <warpathexcludes>**/logback-test.xml</warpathexcludes>    </configuration></plugin>

注意红色部分,说明如下:
首先是使用了maven-warpath-plugin插件,处理所有<type>warpath</type>的artifact,这个插件可以将从依赖的war中传递的依赖都打包到当前的war中,没有这个插件时,当前war从所依赖的war artifact那所传递来的依赖在打包成war时都会被忽略.既然现在能将传递的依赖打包了,就不用copy依赖的war中的web-inf/lib/*,所以被加入到<dependentwarexcludes>中
<workdirectory>的设置看我写的注释
webappdirectory的指定需要额外注意.首先,我使用了maven默认的资源路径,也就是 src/main/webapp,而这里却告诉maven-war-plugin另一个路径"webcontent",产生的结果就是,执行mvn package时,war-plugin和warpath-plugin会将当前war和所有依赖的war的web资源都拷贝到webcontent目录下.这样,webcontent目录包含的内容就是最终打包成war的内容了.
在eclipse集成了maven插件时的实现方案

纯maven确实很happy,但是我们开发项目可是要在eclipse中进行的,安装了m2e插件后 ,如何利用eclipse的wtp提供的server功能进行快速的部署调式,是个需要解决的问题.
在eclipse的配置文件".settings/.jsdtscope"修改<classpathentry kind="src" path="src/main/webapp"/>为<classpathentry kind="src" path="webcontent"/>
在".settings/org.eclipse.wst.common.component"中把<wb-resource deploy-path="/" source-path="/src/main/webapp"/>修改<wb-resource deploy-path="/web-inf/classes" source-path="/src/main/webapp"/>,并增加<wb-resource deploy-path="/" source-path="/webcontent"/>
ok,经过上述配置后,eclipse就把/webcontent目录认为web资源根路径了.这样在eclipse的servers view中,把这个war项目增加到tomcat上时,实际部署的就是/webcontent ,可以直接在eclipse部署运行这个war项目了
但是....实现了可以在eclipse上直接部署的功能后,我发现丧失了eclipse的文件变化监视功能.比如,原本在eclipse中修改一个jsp后,就可以自动同步到tomcat上,但现在我实际的web资源路径是src/main/webapp, 而eclipse识别的web资源路径却是webconten.我的文件修改都是在src/main/webapp,不执行mvn package是不会同步到webcontent中,eclipse也就不会把我修改的jsp同步到tomcat上.为了解决这个问题,我自定义了一个插件,示例如下:
<plugin>    <groupid>org.apache.maven.plugins</groupid>    <artifactid>maven-websources-plugin</artifactid>    <version>0.0.1-snapshot</version>    <executions>     <execution>      <goals>       <goal>websources</goal>      </goals>     </execution>    </executions></plugin>

   这个插件绑定了@phase process-resources,所以在src/main/webapp下的文件有变化时,会自动被调用,将src/main/webapp下有变化的文件拷贝到webcontent目录下.这时就会被eclipse发现这个变化,从而同步到tomcat上.
原文http://www.cnblogs.com/discuss/articles/1866924.html 
1
1
分享到:
评论
1 楼 emilyzhanghong 2012-03-06  
你好:

请教下.你这里说的 B的war包中包含X的class ,是包含X的jar 还是X里面所有的class文件都会到B项目中的class里面去呢?

谢谢!

相关推荐

Global site tag (gtag.js) - Google Analytics