Maven中如何配置WAR依赖WAR和JAR的多模块项目结构
2019独角兽企业重金招聘Python工程师标准>>>
先考虑如下实际情况:
- 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上.
转载于:https://my.oschina.net/darkness/blog/802113
Maven中如何配置WAR依赖WAR和JAR的多模块项目结构相关推荐
- 2016.7.5 如何在maven中添加所需依赖(只知道jar包的部分名字的情况)
(1)进入官网仓库 http://mvnrepository.com/ (2)输入需要的jar包名 比如这里的jota-time (3)寻找需要的版本,并选取需要的版本 (4)复制需要的maven依赖 ...
- maven中阿里云镜像依赖无法加载的解决方案
阿里云的镜像可以退下舞台了 替换为华为云 <mirror><id>huaweicloud</id><name>mirror from maven hua ...
- maven中出现 ‘dependencies.dependency.version‘ for xxxx:jar is missing
mvn clean后,出现下面的log [INFO] Scanning for projects... [ERROR] [ERROR] Some problems were encountered w ...
- 如何在maven官网上找到dependency依赖信息即jar包
如何找到maven依赖信息,即 <dependency><groupId>org.json</groupId><artifactId>json</ ...
- Maven中依赖文件的详解
Maven是什么? 简单来说Maven是java中的一种项目管理.项目构建.依赖管理的工具. 为什么使用Maven? 因为Maven让我们的项目带来更多的方便,我们把所有的依赖放在Maven的依赖管理 ...
- maven生成html单元测试报告,Maven中配置生成单元测试报告配置
对junit单元测试的报告: 1. ------------------------------------------------------- 2. T E S T S 3. ------ ...
- maven ant_如何在Maven中运行Ant目标?
maven ant maven-antrun-plugin允许我们在各种maven构建阶段中运行ant目标. 我将专门为具有开发环境的开发人员解释maven-antrun-plugin的非常实际的用法 ...
- 如何在Maven中运行Ant目标?
maven-antrun-plugin允许我们在各种maven构建阶段中运行ant目标. 我将专门为具有开发环境的开发人员解释maven-antrun-plugin的非常实际的用法. 通常,使用mav ...
- maven中ssm框架快速搭建
有不少朋友在maven中因为pom文件依赖的事导致报错 今天我这个快速搭建ssm框架,确保在jdk7或者jdk8的环境,tomcat没什么要求.但如果要用jdk8的话,最好用run as中的serve ...
最新文章
- Angular Http
- 用python画图代码简单-【Matplotlib】利用Python进行绘图
- [BZOJ4815][CQOI2017]小Q的表格 数论+分块
- mysql c语言数字转字符串函数_C++_c语言标准库中字符转换函数和数字转换函数,字符转换为数字:
#includest - phpStudy...
- uva861 Little Bishops
- centOS6.6虚拟机启动后登陆界面无法显示
- 计算机mac地址设置路由器,路由器设置:如何查看电脑/手机的MAC地址?
- web前端开发面试题(三)
- 本地简易股票量化回测框架
- 机器人轨迹规划(熊友伦)
- 卡通渲染的3D电影《苹果核战记》
- Centos7下的zabbix安装与部署
- 苏州技师学院计算机专业怎么样,苏州技师学院口碑怎么样
- sqlserver中,四舍五入之后,小数点后显示2位的sql文
- 【数据结构】各种数据结构的简单特点
- 从翻硬币游戏看敏捷开发
- 使用 Yocto Project 构建自定义嵌入式 Linux 发行版
- 【翻译一下官方文档】邂逅uniCloud云函数(基础篇)
- 跟明汯投资学习适合散户的量化投资策略和方法!
- 无时无刻不蹭网,使用6款WIFI检测工具