您的位置:首页 > 其它

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