5.Maven项目的聚合与继承
2016-04-22 13:27
344 查看
1.maven项目的聚合
在实际工作中,maven项目一般都分成好几个maven模块,我们来模拟这个实现。在eclipse中分别建立三个maven project,下面先来看一下建完后的项目结构。这三个模块,dao依赖domain, service依赖dao和domain。看一下service模块的pom代码:
<modelVersion>4.0.0</modelVersion> <groupId>com.jackie.maventest</groupId> <artifactId>maventest-service</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>maventest-service</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!--dao依赖--> <dependency> <groupId>com.jackie.maventest</groupId> <artifactId>maventest-dao</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <!--domain依赖--> <dependency> <groupId>com.jackie.maventest</groupId> <artifactId>maventest-domain</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> </dependencies> </project>
现在有三个项目,要一次性构建三个项目,而不是分别到两个项目的目录下分别执行mvn命令,那么Maven的聚合就是为该需求服务的。下面来看maven的聚合的用法。
新建一个新的maven项目,这个项目中只要一个pom文件就可以了,如图:
再来看pom文件的代码:
<modelVersion>4.0.0</modelVersion> <groupId>com.jackie.maventest</groupId> <artifactId>maventest-aggregation</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <name>maventest-aggregation</name> <url>http://maven.apache.org</url> <modules> <module>../maventest-domain</module> <module>../maventest-dao</module> <module>../maventest-service</module> </modules> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> </project>
可以看到,该文件的标签的值是pom,这个是必须的。再一个,中的路径问题:因为目前我们4个项目(一个聚合项目,三个普通项目)在同一个目录下,是一个级别,所以配置如上面代码。 这个配置原则是:以当前pom为根去查找其他项目的pom文件。平时也经常看到聚合项目是父目录,其他项目为子目录的情况,我们看一下项目结构:
这个结构下,pom文件中的配置如下:
<modules> <module>maventest-domain</module> <module>maventest-dao</module> <module>maventest-service</module> </modules>
2.maven项目的继承
2.1继承
分析上面项目的代码,我们发现,maventest-dao、maventest-service都依赖maventest-domain,并且这三个模块都依赖junit,各个pom文件都存在重复配置,maven通过继承消除重复配置。类似于面向对象设计中的父子机构。我们新建项目,结构如下:其中,maventest-parent项目是父项目。来看一下pom文件:
<modelVersion>4.0.0</modelVersion> <groupId>cn.jackie.maventest</groupId> <artifactId>mave 1000e ntest-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <!--必须是pom--> <packaging>pom</packaging> <name>maventest parent</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.3</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>18.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> </dependencies> </project>
再来看一下子项目maventest-service的配置:
<modelVersion>4.0.0</modelVersion> <artifactId>maventest-service</artifactId> <name>maventest-service</name> <url>http://maven.apache.org</url> <parent> <groupId>cn.jackie.maventest</groupId> <artifactId>maventest-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent> </project>
可以看到,在这个配置文件中,已经没有了依赖的配置,都已经从父项目中继承了下来。刷新项目目录树,可以看到确实已经继承下来。
2.2继承管理
上面的依赖管理存在一个问题,父项目配置了所有的依赖,子项目继承了父项目的依赖,但是子项目不需要父类的所有依赖,也许只用其中的一个或者几个,怎么办?Maven提供了依赖管理,我们来改造父项目的pom配置:省略了xml头。<modelVersion>4.0.0</modelVersion> <groupId>cn.jackie.maventest</groupId> <artifactId>maventest-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <name>maventest parent</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.0.8</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.3</version> </dependency> <dependency> <groupId>cn.jackie.maventest</groupId> <artifactId>maventest-domain</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>cn.jackie.maventest</groupId> <artifactId>maventest-dao</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>18.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement> </project>
父项目这样配置后,父项目不会引入实际的依赖,子项目在配置依赖时不用配置,因为该标签在父项目的pom中已经配置了。其中dao项目的pom配置文件如下:
4.0.0 hljs xml"> <artifactId>maventest-dao</artifactId> <name>maventest-dao</name> <url>http://maven.apache.org</url> <parent> <groupId>cn.jackie.maventest</groupId> <artifactId>maventest-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent> <dependencies> <dependency> <groupId>cn.jackie.maventest</groupId> <artifactId>maventest-domain</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> </dependencies> </project>
可见,子项目的配置简单了很多,从父项目的pom继承下来的标签有、等。最主要的是,在依赖管理配置时,不用再配置版本信息。
实际应用中,将聚合和继承配置在一起,子项目配置不变,父项目的配置如下:省略了头和一些依赖的配置。
<modelVersion>4.0.0</modelVersion> <groupId>cn.jackie.maventest</groupId> <artifactId>maventest-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <name>maventest parent</name> <url>http://maven.apache.org</url> <modules> <module>maventest-domain</module> <module>maventest-dao</module> <module>maventest-service</module> </modules> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencyManagement> <dependencies> ...
完整代码请查看:https://github.com/maodou95838/basicMaven
相关文章推荐
- maven学习
- maven插件maven-war-plugin的使用
- jenkins------部署项目到jboss eap下
- maven使用经验集
- window下安装和配置maven环境
- 使用maven+eclipse搭建struts2开发环境
- Java随手笔记8之包、环境变量和访问控制及maven profile实现多环境打包
- maven搭建java ee项目图文教程
- maven中下载jar包源码和javadoc的命令介绍
- 表单重复提交处理总结
- Maven私服配置记录 Nexus
- maven-war-plugin参数说明
- Maven学习笔记
- 项目构建工具学习与实践总结
- Maven实战(三)Eclipse构建Maven项目
- maven基本要点
- Maven for Eclipse
- maven 使用 问题记录
- 《Maven权威指南》学习笔记四_创建一个简单的Maven项目
- 《Maven权威指南》学习笔记十七_一个多模块项目 3ff0