本文转载自:http://my.oschina.net/xuqiang/blog/99854

本文介绍一个多maven项目的实例demo,展示了聚合、继承、工程依赖、单元测试、多war聚合、cargo发布等场景  
一、工程介绍  
该项目由5个maven项目组成

task-aggregator是父工程,同时承担聚合模块和父模块的作用,没有实际代码和资源文件  task-common是基础工程,里面是公共的代码  task-sla是某一个业务子模块,不包含web内容  task-sla-web是某一个web子模块  task-web-dist是最外围的web工程,聚合多个web工程,形成最终的war包  
依赖关系是:task-common <-- task-sla <-- task-sla-web <-- task-web-dist  
二、task-aggregator

这个工程是起到聚合作用,并充当parent pom,所以没有任何实际代码和资源文件。我这里选择了平行结构,另外一种方式是树形结构,我个人感觉平行结构看起来更舒服一点  
下面是pom,有所简化:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  <!-- 定义公共变量 -->  <properties>  <spring.version>3.1.0.RELEASE</spring.version>  <struts2.version>2.3.1</struts2.version>  <hibernate.version>3.2.7.ga</hibernate.version>  </properties>  <modelVersion>4.0.0</modelVersion>  <groupId>com.huawei.inoc.wfm.task</groupId>  <artifactId>task-aggregator</artifactId>  <version>0.0.1-SNAPSHOT</version>  <packaging>pom</packaging>  <!-- 待聚合模块 -->  <modules>  <module>../task-common</module>  <module>../task-sla</module>  <module>../task-sla-web</module>  <module>../task-web-dist</module>  </modules>  <!-- 配置部署的远程仓库 -->  <distributionManagement>  <snapshotRepository>  <id>nexus-snapshots</id>  <name>nexus distribution snapshot repository</name>  <url>http://10.78.68.122:9090/nexus-2.1.1/content/repositories/snapshots/</url>  </snapshotRepository>  </distributionManagement>  <build>  <pluginManagement>  <plugins>  <plugin>  <groupId>org.apache.maven.plugins</groupId>  <artifactId>maven-resources-plugin</artifactId>  <version>2.6</version>  <configuration>  <encoding>UTF-8</encoding>  </configuration>  </plugin>  <plugin>  <groupId>org.apache.maven.plugins</groupId>  <artifactId>maven-compiler-plugin</artifactId>  <version>2.5.1</version>  <configuration>  <encoding>UTF-8</encoding>  </configuration>  </plugin>  </plugins>  </pluginManagement>  </build>  <dependencyManagement>  <dependencies>  <dependency>  <groupId>com.sun</groupId>  <artifactId>tools</artifactId>  <version>1.6.0</version>  <scope>system</scope>  <systemPath>${env.JAVA_HOME}/lib/tools.jar</systemPath>  </dependency>  </dependencies>  </dependencyManagement>  </project>  

基本上是一目了然,只是有几点注意下:  
    1、这里配置了<distributionManagement>,这样子项目就不需要重复配置了  
    2、通过<pluginManagement>,对一些插件进行了公共的配置,这里主要是为了消除构建时的告警  
    3、配置tools,是因为实际中发现,其他开发人员从svn上check out工程以后,有的人会报错,找不到tools.jar,这样配置以后就好了  
三、task-common  
该工程是公共工程,提供了项目中的公共代码,这里只包括了通用的DAO组件,作为示例。  
该工程不依赖任何其他工程

该工程里有几点要点:  
    1、在代码内部用了Spring的注解

public abstract class GenericDAO<T> implements IGenericDAO<T> {  private Class<T> entityClass;  public GenericDAO(Class<T> clazz) {  this.entityClass = clazz;  }  @Autowired  private HibernateTemplate hibernateTemplate;  }  

这里用到了@Autowired注解,所以最终形成的war包,必须在spring配置文件中声明HibernateTemplate类型的bean,否则会报错  
我这里用的maven环境是maven3.0.4,这个版本打出的jar包,带有Directory Entries信息,所以spring的注解即使在jar包中也可生效,如果是比较老的版本,spring的注解在jar包中不好用,关于这个问题的详细描述,见另外一篇博客:http://kyfxbl.iteye.com/blog/1675368  
    2、单元测试的写法

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring-test.xml")
@Transactional
public class GenericDAOTest {  @Autowired  private IBookDAO bookDAO;  @Test   public void testInsert() {  Book book = new Book();  book.setName("thinking in java");  book.setIsbn("111");  bookDAO.insert(book);  }  }  

这里用到了几个注解,@RunWith是为了在spring容器环境下跑这个单元测试类,以支持依赖注入。@ContextConfiguration是声明spring配置文件的位置。@Transactional注解之后,在单元测试方法中的事务会自动回滚,这个比较方便,这样在前面执行的方法,不会对后面的方法造成影响  
这个单元测试类,可以直接在maven里跑起来,让我比较惊喜。之前这样写,在ant里跑没有成功,可能是我没有找到合适的插件的原因  
    3、除了测试的java代码之外,还有3个资源文件,都是放在src/test/resources下,这些资源文件只在test阶段生效,package阶段不会被打包,也就是专门供测试阶段使用  
这个各有利弊,优点是测试的配置文件与开发的配置文件隔离,互不干扰。缺点是配置文件似乎缺少了集中放置的地点,这样如果多个maven工程都需要跑单元测试,要共享测试用配置文件,比较麻烦一点  
不过从我个人来看,也算是利大于弊。只是在每个maven项目下,都需要独立的测试相关资源文件,其实也有利于分别修改  
另外,可以看到这里的hibernate映射文件,不是和model类放在一个package下,而是放在resources目录下的,这样做可以避免一些潜在的问题,也有利于后续的聚合  
    4、pom文件没有什么特别的,只是要引入<scope>为test的junit和spring-test  
四、task-sla  
该工程依赖task-common(因为用到了GenericDAO),是某一个业务模块的逻辑部分,包含了数据库访问层和业务逻辑层,但是不包括web相关的部分

这里没有什么特别要注意的,目录结构和task-common基本一样。比较特别的是可以看到Maven Dependencies里,有一个task-common工程,所以task-common里的任何修改,都可以第一时间在这个工程里体现出来,是比较方便的  
关于这个问题,见另外一篇博客:http://kyfxbl.iteye.com/blog/1679806  
另外就是前面说过的,hibernate的映射文件,应该放在src/main/resources下,而不是与Model类放在一起  
五、task-sla-web  
这个工程是上述task-sla工程的web层,依赖于task-sla,由于task-sla又依赖task-common,所以这个工程最终会同时依赖task-common和task-sla

然后这个工程里包含了web层的东西,包括Action类、jsp、图片、struts2的配置文件等,这些东西放在web工程里是最合适的

这里需要注意2点:  
    1、这个工程的packaging类型是war,而不是jar。但是最终它不会独立打出war包来,其src/main/webapp里的所有文件,都会被最外围的task-web-dist工程聚合成一个总的war  
    2、这个工程的WEB-INF目录下,没有web.xml(有也没用,最终会被覆盖)。默认情况下,packaging类型为war的项目,如果没有web.xml,则构建会失败,因此需要在pom里做一个配置  
该项目的pom如下,省略了依赖部分:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  <parent>  <groupId>com.huawei.inoc.wfm.task</groupId>  <artifactId>task-aggregator</artifactId>  <version>0.0.1-SNAPSHOT</version>  <relativePath>../task-aggregator</relativePath>  </parent>  <modelVersion>4.0.0</modelVersion>  <artifactId>task-sla-web</artifactId>  <packaging>war</packaging>  <build>  <plugins>  <plugin>  <groupId>org.apache.maven.plugins</groupId>  <artifactId>maven-war-plugin</artifactId>  <configuration>  <failOnMissingWebXml>false</failOnMissingWebXml>  </configuration>  </plugin>  </plugins>  </build>  <!-- 配置依赖 -->  <dependencies>  <dependency>  <groupId>org.springframework</groupId>  <artifactId>spring-beans</artifactId>  </dependency>  </dependencies>  </project>

上面的<failOnMissingWebXml>,就是配置缺少web.xml也不使构建失败  
六、task-web-dist  
这个工程是最外围的web工程,起到聚合的作用,即把所有的web项目,打成最终的war包。同时,在这个工程里,放置里公共的配置文件,比如struts.xml、ssoconfig.properties等

这个工程的聚合意图十分明显,比如struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">  <struts>  <constant name="struts.objectFactory" value="spring" />  <constant name="struts.ui.theme" value="simple" />  <constant name="struts.i18n.encoding" value="UTF-8" />  <constant name="struts.action.extension" value="action" />  <constant name="struts.enable.DynamicMethodInvocation" value="false" />  <constant name="struts.devMode" value="true" />  <include file="struts2/struts-sla.xml" />  </struts>

提供了项目通用的配置,并把各子项目的struts2配置文件聚合起来。war包中的web.xml也是在这里提供的  
下面是该工程的pom,也省略了依赖的配置:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  <parent>  <groupId>com.huawei.inoc.wfm.task</groupId>  <artifactId>task-aggregator</artifactId>  <version>0.0.1-SNAPSHOT</version>  <relativePath>../task-aggregator</relativePath>  </parent>  <modelVersion>4.0.0</modelVersion>  <artifactId>task-web-dist</artifactId>  <packaging>war</packaging>  <build>  <finalName>task</finalName>  <plugins>  <!-- 合并多个war -->  <plugin>  <groupId>org.apache.maven.plugins</groupId>  <artifactId>maven-war-plugin</artifactId>  <configuration>  <packagingExcludes>WEB-INF/web.xml</packagingExcludes>    <overlays>  <overlay>  <groupId>com.huawei.inoc.wfm.task</groupId>  <artifactId>task-sla-web</artifactId>  </overlay>  </overlays>  </configuration>  </plugin>  <!-- 利用cargo启动容器 -->  <plugin>  <groupId>org.codehaus.cargo</groupId>  <artifactId>cargo-maven2-plugin</artifactId>  <version>1.2.3</version>  <configuration>  <container>  <containerId>tomcat7x</containerId>  <home>D:\apache-tomcat-7.0.29</home>  </container>  <configuration>  <type>standalone</type>  <home>${project.build.directory}/tomcat7.0.29</home>  <properties>  <cargo.jvmargs>  -Xdebug  -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8787  </cargo.jvmargs>  </properties>  </configuration>  </configuration>  <executions>  <execution>  <id>cargo-run</id>  <phase>pre-integration-test</phase>  <goals>  <goal>run</goal>  </goals>  </execution>  </executions>  </plugin>  </plugins>  </build>  </project>

这里主要是对maven-war-plugin和cargo-maven2-plugin这2个插件进行了配置,以起到聚合war,以及通过cargo启动容器的作用 
关于多war聚合,以及cargo,见另外2篇博客:http://kyfxbl.iteye.com/blog/1678121、http://kyfxbl.iteye.com/blog/1677608  
七、启动构建  
在task-aggregator目录下,执行mvn clean deploy或者mvn clean install,就可启动整个构建过程,并将容器启动起来,跑最终生成的war包

转载于:https://www.cnblogs.com/wpcnblog/p/9054796.html

一个多maven项目聚合的实例相关推荐

  1. 《maven实战》笔记(2)----一个简单maven项目的搭建,测试和打包

    参照<maven实战>在本地创建对应的基本项目helloworld,在本地完成后项目结构如下: 可以看到maven项目的骨架: src/main/java(javaz主代码) src/te ...

  2. Eclipse创建一个普通maven项目详细步骤

    首先找到Eclipse最顶部左边的File,new一个 Maven Project项目 下一步,勾选第二个即可 下一步,选择  maven-archetype-webapp Group Id 写域名倒 ...

  3. Maven项目环境搭建实例.

    前言: 最近下班比较早, 总是不愿意让自己闲着, 此时刚好从网上找到了一些项目的资源, 结合自己在公司做的项目, 所以拿来一起学习加复习一些平常用到和没接触过的新知识. 做的这个项目的名称叫做baba ...

  4. Maven项目依赖管理 学习笔记

    本学习笔记根据慕课视频[Maven项目依赖管理]摘录,主要学习maven的使用方式,从理念到实践.基础到应用,掌握基于maven管理java项目的方式. 目录 第一章 Maven概述 Maven简介 ...

  5. eclipse创建springboot项目_创建一个 Spring Boot 项目,你会几种方法?

    我最早是 2016 年底开始写 Spring Boot 相关的博客,当时使用的版本还是 1.4.x ,文章发表在 CSDN 上,阅读量最大的一篇有 42W+,如下图: 2017 年由于种种原因,就没有 ...

  6. Maven项目缺少Maven Dependencies解决方法总结

    一.今天搭建了一个maven项目,在pom.xml文件引入依赖后,发现项目结构中没有Maven Dependencies文件(下图),但是在java Build Path中又可以找到Maven Dep ...

  7. idea 创建多模块依赖Maven项目

    转载地址: http://www.cnblogs.com/tibit/p/6185704.html idea 创建多模块依赖Maven项目 本来网上的教程还算多,但是本着自己有的才是自己的原则,还是自 ...

  8. maven 公共模块依赖_idea 创建多模块依赖Maven项目

    本来网上的教程还算多,但是本着自己有的才是自己的原则,还是自己写一份的好,虽然可能自己也不会真的用得着. 1. 创建一个新maven项目 2. 3. 输入groupid和artifactid,后面步骤 ...

  9. 创建一个Spring Boot项目

    文章目录 Spring Boot的功能 Spring Boot的优点 Spring Boot 的三种创建方式 在线创建 使用开发工具创建 IntelliJ IDEA Maven 创建 项目结构 修改T ...

最新文章

  1. Discuz! 6.0.0 安装图文教程
  2. java 不同数据类型之间的转换
  3. linux 程序读写Env分区 --- mtdparts,/dev/mtd*,mtd_debug
  4. How to become an expert in the IP industry? Here is where you should start
  5. jquery flexigrid 增加行双击事件
  6. {“errmsg“:“name length invalid rid: 5fbf54ef-3a02c“,“errcode“:300002}
  7. 当你和天猫精灵对话时,它在想什么?阿里智能对话技术深度解读
  8. window 如何查看tomcat 实时日志_如何处理生产环境Tomcat的catalina.out日志?
  9. css 百分比 怎么固定正方形_css样式写出三角形,宽高自适应的正方形,扇形!...
  10. 得物回应中消协点名批评:感谢监督 涉及案例已处理完结
  11. python 函数参数的传递(参数带星号的说明) 元组传递 字典传递
  12. 计算机中是如何存储图片的,电脑如何保存图片
  13. 卖租房子房产中介管理系统平台小程序app开发搭建
  14. TPM管理解决制造型企业成本大问题的常用手段
  15. ant linux版本下载安装,linux下ant的安装
  16. Android studio真机调试(用小米10s为例)
  17. iOS两个.a文件合并成一个.a文件
  18. 等比序列的实际应用 —等额本息还款金额公式推导
  19. 2006年江苏专转本计算机试卷答案,2006年度江苏省普通高校专转本计算机试卷.doc...
  20. java 笔记本i7 i5_笔记本i5处理器和i7处理器哪个好

热门文章

  1. 前端那些事之Bootstrap篇
  2. OC高效率52之理解消息转发机制
  3. C# winform中MouseDoubleClick与DoubleClick的区别
  4. 如何取得sql语句的运行时间
  5. mysql创建库几种方法_MySQL创建数据库的两种方法
  6. iptables 常用规则使用实例
  7. 最近在学C语言,非常痛苦,怎么办?
  8. JavaScript初学者编程题(16)
  9. java别踩白块_java别踩白块(基础功能)
  10. linux 支持7代cpu型号,win7最高支持几代cpu