博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个多maven项目聚合的实例
阅读量:6863 次
发布时间:2019-06-26

本文共 7942 字,大约阅读时间需要 26 分钟。

本文转载自:

本文介绍一个多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,有所简化: 

3.1.0.RELEASE
2.3.1
3.2.7.ga
4.0.0
com.huawei.inoc.wfm.task
task-aggregator
0.0.1-SNAPSHOT
pom
../task-common
../task-sla
../task-sla-web
../task-web-dist
nexus-snapshots
nexus distribution snapshot repository
http://10.78.68.122:9090/nexus-2.1.1/content/repositories/snapshots/
org.apache.maven.plugins
maven-resources-plugin
2.6
UTF-8
org.apache.maven.plugins
maven-compiler-plugin
2.5.1
UTF-8
com.sun
tools
1.6.0
system
${env.JAVA_HOME}/lib/tools.jar

基本上是一目了然,只是有几点注意下:  

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

该工程里有几点要点:  

    1、在代码内部用了Spring的注解 

public abstract class GenericDAO
implements IGenericDAO
{ private Class
entityClass; public GenericDAO(Class
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如下,省略了依赖部分: 

com.huawei.inoc.wfm.task
task-aggregator
0.0.1-SNAPSHOT
../task-aggregator
4.0.0
task-sla-web
war
org.apache.maven.plugins
maven-war-plugin
false
org.springframework
spring-beans

上面的<failOnMissingWebXml>,就是配置缺少web.xml也不使构建失败  

六、task-web-dist  
这个工程是最外围的web工程,起到聚合的作用,即把所有的web项目,打成最终的war包。同时,在这个工程里,放置里公共的配置文件,比如struts.xml、ssoconfig.properties等  

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

提供了项目通用的配置,并把各子项目的struts2配置文件聚合起来。war包中的web.xml也是在这里提供的  

下面是该工程的pom,也省略了依赖的配置: 

com.huawei.inoc.wfm.task
task-aggregator
0.0.1-SNAPSHOT
../task-aggregator
4.0.0
task-web-dist
war
task
org.apache.maven.plugins
maven-war-plugin
WEB-INF/web.xml
com.huawei.inoc.wfm.task
task-sla-web
org.codehaus.cargo
cargo-maven2-plugin
1.2.3
tomcat7x
D:\apache-tomcat-7.0.29
standalone
${project.build.directory}/tomcat7.0.29
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8787
cargo-run
pre-integration-test
run

这里主要是对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包 

 

你可能感兴趣的文章
CSDN V5 CSDN统一天下
查看>>
经典排序算法 - 鸽巢排序Pigeonhole sort
查看>>
Android,visibility属性
查看>>
springboot~configserver里对重要信息进行RSA加密
查看>>
DotNetCore跨平台~文章索引~永久更新
查看>>
iOS-Get the NSString height in iOS 7
查看>>
对象调用成员的过程
查看>>
linux安装man中文手册并保留英文man手册
查看>>
SSH密码和秘钥认证原理
查看>>
现有‘abcdefghijkl’12个字符,将其所有的排列按字典序进行排序,给出任意一组排列,说出这租排列在所有排列中是第几小的...
查看>>
数据结构12——哈希
查看>>
云计算简介及总结
查看>>
提高ASP.NET网站性能的方法
查看>>
这几天学习Objective的笔记
查看>>
oracle REPLACE 函数 介绍
查看>>
mybatis动态SQL标签的用法
查看>>
学习extjs的布局
查看>>
java-swing模拟实现时钟效果
查看>>
java points[复习]
查看>>
在另一个线程中无法用((CMainFrame *)AfxGetMainWnd())
查看>>