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

简介:

先考虑如下实际情况:

  1. war项目C和war项目B都依赖war项目A和JAR项目X. 项目A中保存了B和C项目通用的web资源,比如通用的javascript,CSS,jsp等. 项目X中保存了B和C项目中都依赖的一些class
  2. 开发人员希望每次都只面对一个项目,即Team A 开发项目A, Team B开发项目B, Team C开发项目C....以此类推
  3. 每个Team在开发自己项目时,都希望能直接进行调试,例如war项目A可以直接部署到TOMCAT上运行测试
  4. 最后实际交付给客户的却只有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>

注意红色部分,说明如下:

  1. 首先是使用了maven-warpath-plugin插件,处理所有<type>warpath</type>的artifact,这个插件可以将从依赖的WAR中传递的依赖都打包到当前的WAR中,没有这个插件时,当前WAR从所依赖的WAR artifact那所传递来的依赖在打包成WAR时都会被忽略.既然现在能将传递的依赖打包了,就不用copy依赖的war中的WEB-INF/lib/*,所以被加入到<dependentWarExcludes>中
  2. <workDirectory>的设置看我写的注释
  3. 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功能进行快速的部署调式,是个需要解决的问题.

  1. 在eclipse的配置文件".settings/.jsdtscope"修改<classpathentry kind="src" path="src/main/webapp"/>为<classpathentry kind="src" path="WebContent"/>
  2. 在".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"/>
  3. OK,经过上述配置后,eclipse就把/WebContent目录认为web资源根路径了.这样在eclipse的Servers View中,把这个war项目增加到TOMCAT上时,实际部署的就是/WebContent ,可以直接在eclipse部署运行这个war项目了
  4. 但是....实现了可以在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上.



本文转自 tianya23 51CTO博客,原文链接:http://blog.51cto.com/tianya23/997890,如需转载请自行联系原作者

相关文章
|
9月前
|
Java Maven 微服务
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的 maven 依赖
在项目中使用Swagger2工具时,需导入Maven依赖。尽管官方最高版本为2.8.0,但其展示效果不够理想且稳定性欠佳。实际开发中常用2.2.2版本,因其稳定且界面友好。以下是围绕2.2.2版本的Maven依赖配置,包括`springfox-swagger2`和`springfox-swagger-ui`两个模块。
351 0
|
7月前
|
Java 应用服务中间件 Maven
在IntelliJ IDEA中如何配置使用Maven以创建Tomcat环境
所以,别担心这些工具看起来有些吓人,实际上这些都是为了帮助你更好的完成工作的工具,就像超市里的各种烹饪工具一样,尽管它们看起来可能很复杂,但只要你学会用,它们会为你烹饪出一道道美妙的食物。这就是学习新技能的乐趣,让我们一起享受这个过程,攀登知识的高峰!
430 27
|
7月前
|
Java 应用服务中间件 Apache
在IntelliJ IDEA中使用Maven配置Tomcat环境
此配置方法具有较高的实用性,简单易懂。遵循以上步骤,您将能顺利在IntelliJ IDEA中使用Maven配置Tomcat环境,从而进行Web项目的开发和调试。
816 18
|
8月前
|
存储 Java Maven
Maven系统级别依赖:解决部署时Jar包缺失问题
以上就是关于Maven系统级别依赖解决部署时Jar包缺失问题的解答,希望对你有所帮助。在软件开发中,遇到问题并解决问题是常态,希望你能够善用这些工具,解决你遇到的问题。
487 28
|
11月前
|
缓存 架构师 Java
Maven实战进阶(01)面试官:Maven怎么解决依赖冲突?| 有几种解决方式
本文介绍了Maven的核心功能和依赖管理技巧。Maven是基于项目对象模型(POM)的构建工具,具备跨平台、标准化、自动化等特性。其三大核心功能为依赖管理、仓库管理和项目构建。依赖管理通过pom.xml文件引入第三方组件并自动下载;仓库管理涉及中央仓库、私服和本地仓库;项目构建则通过生命周期管理编译、测试、打包等流程。文章还详细讲解了依赖冲突的解决方法,包括默认规则、手工排除和版本指定等策略。
|
12月前
|
缓存 Java Maven
【简单四步教你解决♥十分有效】Maven依赖报错、依赖或插件导入失败的万能解决办法
【简单四步教你解决♥十分有效】Maven依赖报错、依赖或插件导入失败的万能解决办法!在处理Maven项目问题时,首先检查Maven配置是否正确。接着通过“File--Invalidata Caches”清除IDEA缓存并重启。使用Maven命令`mvn dependency:purge-local-repository`和`mvn dependency:resolve`清除本地依赖缓存。最后,在Terminal中输入`mvn clean install`完成构建。
3381 1
【简单四步教你解决♥十分有效】Maven依赖报错、依赖或插件导入失败的万能解决办法
|
12月前
|
存储 Java Linux
【Maven】——基础入门,插件安装、配置和简单使用,Maven如何设置国内源
Maven插件安装,Maven项目构建,依赖管理,Haven Help插件,Maven仓库,Maven如何设置国内源
|
Java Maven
maven打瘦包,且只打入部分想打入的依赖瘦包
maven打瘦包,且只打入部分想打入的依赖瘦包 设计 工程结构分析 环境管理 城市资源 安全工程 工程管理
259 10
|
Java 应用服务中间件 Maven
Maven的三种项目打包方式——pom,jar,war的区别
Maven 提供了多种打包方式,分别适用于不同类型的项目。pom 用于父项目或聚合项目,便于项目的结构和依赖管理;jar 用于Java类库或可执行的Java应用程序;war 则专用于Java Web应用程序的部署。理解这些打包方式的用途和特点,可以帮助开发者更好地配置和管理Maven项目,确保构建和部署过程的顺利进行。无论是单模块项目还是多模块项目,选择合适的打包方式对于项目的成功至关重要。
1791 3

热门文章

最新文章

推荐镜像

更多