2019独角兽企业重金招聘Python工程师标准>>>

先考虑如下实际情况:

  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上.

转载于:https://my.oschina.net/darkness/blog/802113

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

  1. 2016.7.5 如何在maven中添加所需依赖(只知道jar包的部分名字的情况)

    (1)进入官网仓库 http://mvnrepository.com/ (2)输入需要的jar包名 比如这里的jota-time (3)寻找需要的版本,并选取需要的版本 (4)复制需要的maven依赖 ...

  2. maven中阿里云镜像依赖无法加载的解决方案

    阿里云的镜像可以退下舞台了 替换为华为云 <mirror><id>huaweicloud</id><name>mirror from maven hua ...

  3. maven中出现 ‘dependencies.dependency.version‘ for xxxx:jar is missing

    mvn clean后,出现下面的log [INFO] Scanning for projects... [ERROR] [ERROR] Some problems were encountered w ...

  4. 如何在maven官网上找到dependency依赖信息即jar包

    如何找到maven依赖信息,即 <dependency><groupId>org.json</groupId><artifactId>json</ ...

  5. Maven中依赖文件的详解

    Maven是什么? 简单来说Maven是java中的一种项目管理.项目构建.依赖管理的工具. 为什么使用Maven? 因为Maven让我们的项目带来更多的方便,我们把所有的依赖放在Maven的依赖管理 ...

  6. maven生成html单元测试报告,Maven中配置生成单元测试报告配置

    对junit单元测试的报告: 1.  ------------------------------------------------------- 2.   T E S T S 3.  ------ ...

  7. maven ant_如何在Maven中运行Ant目标?

    maven ant maven-antrun-plugin允许我们在各种maven构建阶段中运行ant目标. 我将专门为具有开发环境的开发人员解释maven-antrun-plugin的非常实际的用法 ...

  8. 如何在Maven中运行Ant目标?

    maven-antrun-plugin允许我们在各种maven构建阶段中运行ant目标. 我将专门为具有开发环境的开发人员解释maven-antrun-plugin的非常实际的用法. 通常,使用mav ...

  9. maven中ssm框架快速搭建

    有不少朋友在maven中因为pom文件依赖的事导致报错 今天我这个快速搭建ssm框架,确保在jdk7或者jdk8的环境,tomcat没什么要求.但如果要用jdk8的话,最好用run as中的serve ...

最新文章

  1. Angular Http
  2. 用python画图代码简单-【Matplotlib】利用Python进行绘图
  3. [BZOJ4815][CQOI2017]小Q的表格 数论+分块
  4. mysql c语言数字转字符串函数_C++_c语言标准库中字符转换函数和数字转换函数,字符转换为数字: #includest - phpStudy...
  5. uva861 Little Bishops
  6. centOS6.6虚拟机启动后登陆界面无法显示
  7. 计算机mac地址设置路由器,路由器设置:如何查看电脑/手机的MAC地址?
  8. web前端开发面试题(三)
  9. 本地简易股票量化回测框架
  10. 机器人轨迹规划(熊友伦)
  11. 卡通渲染的3D电影《苹果核战记》
  12. Centos7下的zabbix安装与部署
  13. 苏州技师学院计算机专业怎么样,苏州技师学院口碑怎么样
  14. sqlserver中,四舍五入之后,小数点后显示2位的sql文
  15. 【数据结构】各种数据结构的简单特点
  16. 从翻硬币游戏看敏捷开发
  17. 使用 Yocto Project 构建自定义嵌入式 Linux 发行版
  18. 【翻译一下官方文档】邂逅uniCloud云函数(基础篇)
  19. 跟明汯投资学习适合散户的量化投资策略和方法!
  20. 无时无刻不蹭网,使用6款WIFI检测工具

热门文章

  1. 解释汇编中的AUGW LABEL WORD、ADDW LABEL WORD
  2. NFS exports命令
  3. python学习(1)启程
  4. 字符串、数组、randomAccessFile 中length的异同
  5. 搜索 意外错误 操作无法完成
  6. Fedora Linux基本配置
  7. 【转】关于EASYSIZE宏(动态调整控件位置、大小的宏)
  8. web_xml 控制web行为
  9. springboot和springcloud及常用注解积累
  10. 交互式 shell 玩转 Python