先考虑如下实际情况:
- 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上.
相关推荐
java运行依赖jar包
整个项目以pom型项目进行组织,其模块可以是jar项目,也可以是war项目,也可以pom项目。合理的使用maven-module项目,可以是项目结构分明,同时提高了代码的复用性。本文以maven插件官方示例(具体地址请查看附录)...
java运行依赖jar包
maven-war-plugin-2.0.2.jar
本篇文章主要介绍了Maven引入本地Jar包并打包进War包中的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
maven-war-plugin-20030413.023708.jar
maven-war-plugin-2.1.jar
maven-war-plugin-1.6.2.jar
maven-war-plugin-2.0.1.jar
maven-war-plugin-2.0.jar
maven-war-plugin-1.6.3.jar
maven-jar-plugin-3.1.1.jar
一个基于springboot + jsp的demo项目, 非常简洁,可通过maven一键构建,亮点是不仅可以war包方式运行,还可以可执行jar包方式运行(实现这个需要突破很多关键技术和限制...)
java运行依赖jar包
maven 用法 指南 java 基础 配置 安装 入门 eclipse jar ear war 打包 rad
java运行依赖jar包
java运行依赖jar包
java运行依赖jar包
执行程序中有巨多第三方依赖包,要一起打进 jar 包,怎么办? maven-assembly-plugin 插件打第三方依赖包进 jar,spring 有 org.springframework.beans.factory.parsing.BeanDefinitionParsingException 异常怎么办...
maven-aether-provider-3.2.1-sources.jar maven-antrun-plugin-1.3.jar maven-archiver-2.2.jar maven-artifact-3.2.1-sources.jar maven-assembly-plugin-2.2-beta-5.jar ...maven-war-plugin-2.3.jar