Maven继承

继承为了消除重复,可以把pom 中很多相同的配置提取出来;如:grouptId, version 等。

在使用的时候子工程直接继承父工程的依赖版本号,子工程中不再需要指定具体版本号,方便统一管控项目的依赖版本问题。

创建一个父工程,

父工程的pom.xml

 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 2     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 3     <modelVersion>4.0.0</modelVersion>
 4     <groupId>cn.sm1234</groupId>
 5     <artifactId>sm1234-parent</artifactId>
 6     <version>0.0.1-SNAPSHOT</version>
 7     <packaging>pom</packaging>
 8     <description>这是一个父工程,锁定版本</description>
 9 
10     <!-- 抽取相同的属性,如版本号,集中定义版本依赖号 -->
11     <properties>
12         <!-- 名称需要自定义 -->
13         <servlet.version>2.5</servlet.version>
14         <spring.version>5.1.3.RELEASE</spring.version>
15     </properties>
16 
17     <!-- 抽取子工程的依赖配置 -->
18     <!-- 版本锁定,当子工程有需要并且自行添加了具体依赖后才有效 -->
19     <dependencyManagement>
20         <dependencies>
21             <!-- 依赖servlet的api -->
22             <!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api -->
23             <dependency>
24                 <groupId>javax.servlet</groupId>
25                 <artifactId>servlet-api</artifactId>
26                 <version>${servlet.version}</version>
27                 <!-- privided依赖范围,编译时有效,但是运行发布的时候是无效的。 -->
28                 <scope>provided</scope>
29             </dependency>
30 
31             <!-- 依赖spring框架 -->
32             <!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
33             <dependency>
34                 <groupId>org.springframework</groupId>
35                 <artifactId>spring-beans</artifactId>
36                 <version>${spring.version}</version>
37             </dependency>
38 
39             <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
40             <dependency>
41                 <groupId>org.springframework</groupId>
42                 <artifactId>spring-aop</artifactId>
43                 <version>${spring.version}</version>
44             </dependency>
45 
46             <!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
47             <dependency>
48                 <groupId>org.springframework</groupId>
49                 <artifactId>spring-aspects</artifactId>
50                 <version>${spring.version}</version>
51             </dependency>
52 
53         </dependencies>
54     </dependencyManagement>
55 
56 
57 </project>

子工程的pom.xml

 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 2     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 3 
 4     <!-- 引用父工程 -->
 5     <parent>
 6         <groupId>cn.sm1234</groupId>
 7         <artifactId>sm1234-parent</artifactId>
 8         <version>0.0.1-SNAPSHOT</version>
 9         <!-- 父项目的pom.xml文件的相对路径,一般可不指定 -->
10         <!-- <relativePath>../parent</relativePath> -->
11     </parent>
12 
13     <modelVersion>4.0.0</modelVersion>
14     <artifactId>sm1234-web</artifactId>
15     <packaging>war</packaging>
16 
17     <dependencies>
18         <dependency>
19             <groupId>javax.servlet</groupId>
20             <artifactId>servlet-api</artifactId>
21             <!-- 继承父工程后,版本号由父工程里面统一指定,不再需要特别指定 -->
22             <!-- <version>${servlet.version}</version> -->
23             <!-- privided依赖范围,编译时有效,但是运行发布的时候是无效的。 -->
24             <scope>provided</scope>
25         </dependency>
26 
27         <!-- 依赖spring框架 -->
28         <!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
29         <dependency>
30             <groupId>org.springframework</groupId>
31             <artifactId>spring-beans</artifactId>
32         </dependency>
33 
34         <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
35         <dependency>
36             <groupId>org.springframework</groupId>
37             <artifactId>spring-aop</artifactId>
38         </dependency>
39 
40         <!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
41         <dependency>
42             <groupId>org.springframework</groupId>
43             <artifactId>spring-aspects</artifactId>
44         </dependency>
45     </dependencies>
46 
47     <!-- JDK编译插件,改变JDK编译环境 -->
48     <build>
49         <plugins>
50             <!-- 1.java编译插件 -->
51             <plugin>
52                 <groupId>org.apache.maven.plugins</groupId>
53                 <artifactId>maven-compiler-plugin</artifactId>
54                 <version>3.6.1</version>
55                 <configuration>
56                     <source>1.8</source>
57                     <target>1.8</target>
58                     <encoding>UTF-8</encoding>
59                 </configuration>
60             </plugin>
61 
62             <!-- 2.配置打包项目源码包的插件 -->
63             <plugin>
64                 <groupId>org.apache.maven.plugins</groupId>
65                 <artifactId>maven-source-plugin</artifactId>
66                 <version>2.2.1</version>
67                 <!-- 完成绑定.执行完打包后执行 -->
68                 <executions>
69                     <execution>
70                         <goals>
71                             <goal>jar-no-fork</goal>
72                         </goals>
73                         <phase>verify</phase>
74                     </execution>
75                 </executions>
76             </plugin>
77 
78             <!-- 3.tomcat7插件 -->
79             <plugin>
80                 <groupId>org.apache.tomcat.maven</groupId>
81                 <artifactId>tomcat7-maven-plugin</artifactId>
82                 <version>2.2</version>
83                 <configuration>
84                     <port>8080</port>
85                     <server>tomcat7</server>
86                 </configuration>
87             </plugin>
88         </plugins>
89     </build>
90 </project>

说明:在子工程中引入父工程的内容时,会有重复内容,会有黄色感叹号提示,我们只需将子工程的重复内容删除即可。

注意:

relativePath:父项目的 pom.xml 文件的相对路径。默认值为../pom.xml。maven首先从当前构建项目开始查找父项目的 pom 文件,然后从本地仓库,最后从远程仓库。RelativePath 允许你选择一个不同的位置;一般Eclipse 找不到 parent 项目时可以先update project,还不行则可配置此项。
如果所有子工程都需要依赖某些包,父工程可以通过设置依赖,将依赖关系传递到子工程中。
<dependencies>
//添加公共依赖包
</dependencies>

【注意】dependencyManagement 与 dependencies 的区别

原文地址:https://www.cnblogs.com/116970u/p/10137968.html