`
woshixushigang
  • 浏览: 578513 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

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

分享到:
评论

相关推荐

    使用Maven构建多模块项目

    Maven构建多模块项目极大地简化了大型项目的管理,通过合理地组织模块间的依赖关系和统一的配置管理,提高了开发效率和代码质量。实践中,需要灵活运用Maven的各种特性,结合最佳实践,以构建高效、稳定的多模块...

    Maven引入本地Jar包并打包进War包中的方法

    "Maven引入本地Jar包并打包进War包中的方法" Maven是一种流行的项目管理工具,主要用于Java项目的构建、测试和部署。在实际开发中,我们经常需要引入本地Jar包以满足项目的需求。本文将介绍Maven引入本地Jar包并...

    maven多模块项目(简单实例)

    总结来说,Maven多模块项目是一种优秀的代码组织方式,它通过模块化的结构提高了代码的可读性和可维护性,同时也简化了构建和依赖管理。在"ssm_modules"实例中,我们可以学习到如何根据SSM框架创建和配置多模块项目...

    maven-war-plugin-3.2.3.jar

    java运行依赖jar包

    maven多模块项目工程-已搭建好

    总之,"maven多模块项目工程-已搭建好"是一个已经配置好的、使用Eclipse开发的项目结构,通过"xd-parent"模块实现了依赖和插件的集中管理,方便开发者进行模块化开发,提高了项目的可维护性和开发效率。在实际使用中...

    maven构建多模块项目

    总结来说,Maven构建多模块项目能够帮助开发者有效地组织大型项目,通过父子项目结构和依赖管理,实现模块间的解耦和协同开发。"simple-parent"项目就是一个典型的例子,它展示了如何创建和管理一个包含多个子模块的...

    maven-module多模块依赖项目在eclipse中搭建与开发

    整个项目以pom型项目进行组织,其模块可以是jar项目,也可以是war项目,也可以pom项目。合理的使用maven-module项目,可以是项目结构分明,同时提高了代码的复用性。本文以maven插件官方示例(具体地址请查看附录)...

    Maven构建多模块项目

    首先,我们要理解Maven的多模块项目结构。在Maven中,一个项目可以被分解为多个子项目,这些子项目共享相同的父 pom.xml 文件,这就是所谓的多模块项目。在`demo-parent`案例中,"parent"通常表示顶层的父模块,它...

    maven-war-plugin-2.2.jar

    java运行依赖jar包

    maven 模块化项目demo

    通过这个“maven 模块化项目demo”,开发者可以学习如何划分项目结构,如何配置POM文件,以及如何利用Maven管理多模块项目。这有助于提升开发效率,降低维护成本,同时便于团队协作,因为每个人都只需要关注自己负责...

    maven打包 maven打jar包详细步骤

    在Java开发中,Maven是一个强大的构建工具,它简化了项目的构建、依赖管理和部署过程。本文将详细讲解如何使用Maven来打包一个Java项目,并创建JAR文件。 首先,Maven有三个主要生命周期阶段:`clean`、`default`...

    Springboot 打Jar包,Maven完美解决本地Jar包自动打入Springboot Jar包中

    **Maven 插件** 如`spring-boot-maven-plugin`能够实现将Spring Boot应用打包为可执行的Jar或War文件,并且可以配置不同的参数来控制构建行为。例如,指定主类、排除某些依赖等。 ##### 2. 使用Maven安装本地Jar包 ...

    maven-war-plugin-2.0.2.jar

    maven-war-plugin-2.0.2.jar

    用Eclipse创建Maven多模块项目

    创建Maven多模块项目的第一步是安装并配置Eclipse IDE和Maven插件。确保Eclipse已安装M2E插件(Maven Integration for Eclipse),该插件允许Eclipse与Maven无缝集成。 接下来,我们开始创建多模块项目: 1. **...

    Maven发布Jar包中文乱码解决方法

    Maven发布Jar包中文乱码解决方法 Maven 是一个基于项目对象模型(Project Object...通过在 pom.xml 文件中添加配置、在 Maven 命令中添加参数、在资源文件中添加配置等方式,可以解决 Maven 发布 Jar 包中文乱码问题。

    ssm+maven多模块项目搭建

    总结起来,"ssm+maven多模块项目搭建"是一个涉及Spring、SpringMVC、Mybatis和Maven四个关键技术的项目实践,它展示了如何在Java Web开发中运用这些工具进行模块化设计和构建,以达到提高开发效率和代码质量的目标。...

    springboot_jsp_maven(war+jar).rar

    【标题】"springboot_jsp_maven(war+jar)"是一个综合了Spring Boot、JSP和Maven技术的示例项目,旨在展示如何在Spring Boot框架下开发并部署包含Web界面的应用程序。该项目的独特之处在于它同时支持两种常见的部署...

    maven多模块

    在Maven多模块项目中,通常会有以下几个层次结构: 1. **顶层父项目(Parent Project)**:顶层父项目不包含任何源代码,它的主要作用是定义共用的配置,如版本管理、依赖管理和构建设置。在`parentProj`这个例子中...

    maven打包war配置

    在Java开发领域,Maven是一个不可或缺的构建工具,它能够帮助开发者管理项目依赖、构建工件,如JAR或WAR包。"maven打包war配置"这个主题涉及到如何使用Maven来打包一个Web应用程序(WAR)项目。WAR文件是Web应用的...

    maven多模块web项目

    总的来说,"maven多模块web项目"是一个采用Maven构建、整合Spring MVC和Spring的Web应用程序,利用IDEA进行开发,拥有清晰的模块化结构和标准的Web应用目录布局,便于团队协作和维护。通过理解Maven的生命周期和目标...

Global site tag (gtag.js) - Google Analytics