原文地址:https://blog.csdn.net/liupeifeng3514/article/details/79553011

1、Maven聚合

我们在平时的开发中,项目往往会被划分为好几个模块,比如common公共模块、system系统模块、log日志模块、reports统计模块、monitor监控模块等等。这时我们肯定会出现这么一个需要,我们需要一次构件多个模块,而不用每个模块都去mvn clean install一次,Maven聚合就是用来实现这个需求的。

我们需要构建另外一个模块,假设是UidpWeb,然后通过该模块来构件整个项目的所有模块,POM结构如下:

  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/maven-v4_0_0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4.  
  5. <groupId>com.uidp</groupId>
  6. <artifactId>UidpWeb</artifactId>
  7. <packaging>pom</packaging>
  8. <version>0.0.1-SNAPSHOT</version>
  9. <name>UidpWeb</name>
  10. <url>http://maven.apache.org</url>
  11.  
  12. <modules>
  13. <!-- parent pom -->
  14. <module>parent</module>
  15. <!-- 公共资源文件,第三方js库,图片等媒体资源 -->
  16. <module>ThirdParty</module>
  17. <!-- 公共依赖,工具包 -->
  18. <module>common</module>
  19. <!-- 日志模块 -->
  20. <module>log/pom-pack.xml</module>
  21. <!-- 第三方客户定制服务模块 -->
  22. <module>biz/pom-pack.xml</module>
  23. <!-- 客户管理 -->
  24. <module>customer/pom-pack.xml</module>
  25. <!-- 策略模块 -->
  26. <module>strategy/pom-pack.xml</module>
  27. <!-- 统计报表 -->
  28. <module>reports/pom-pack.xml</module>
  29. <!-- 监控统计 -->
  30. <module>monitor/pom-pack.xml</module>
  31. <!-- 系统管理模块 -->
  32. <module>sysmgr/pom-pack.xml</module>
  33. <!-- 统一打war包 -->
  34. <module>/pom-app.xml</module>
  35. </modules>
  36.  
  37. </project>

注释:

<packaging>pom</packaging>:对于聚合模块UidpWeb来说,packaging的类型必须为pom,否则无法构建。

<name>UidpWeb</name>:提供一个更容易阅读的名称,没什么其他太大作用。

<modules>......</modules>:这是实现聚合的标签,其下可包含多个module元素。

<module>...</module>:用来指定实现聚合的模块或者实现聚合的POM。

为了方便用户构建项目,通常将聚合模块放在项目目录的最顶层,其他模块则作为聚合模块的子目录存在,这时聚合的时候便可如我这般指定路径:

  1. <module>parent</module>
  2. <module>log/pom-pack.xml</module>

这就表示聚合模块下面的parent目录,聚合模块下面的log目录下的pom-pack.xml

聚合模块下的内容只需要POM文件,它不像其他模块那样有src/main/javasrc/test/java等目录。他只是用来帮助聚合其他模块构建,他本身并不会有过多的实质内容。

关于目录结构要注意的是,聚合模块既可以作为其他模块的父目录,也可以与其他模块处于平行的目录,如图:

如果使用平行目录,聚合模块的POM要做相应的修改,以指向正确的模块目录:

  1. <module>../parent</module>
  2. <module>../log/pom-pack.xml</module>

最后运行mvn clean install命令,Maven会分析聚合模块的POM、分析要构建的模块、并计算出一个反应堆构建顺序,然后根据这个顺序依次构建各个模块,这样便可以一次性构建所有聚合的模块。

2、Maven继承

如果多个模块出现相同的依赖包,这样在pom.xml文件的内容出现了冗余、重复的内容,解决这个问题其实使用Maven的继承机制即可,就像Java的继承一样,父类就像一个模板,子类继承自父类,那么有些通用的方法、变量都不必在子类中再重复声明了。Maven的继承机制类似,在一个父级别的Maven的pom文件中定义了相关的常量、依赖、插件等等配置后,实际项目模块可以继承此父项目 的pom文件,重复的项不必显示的再声明一遍了,相当于父Maven项目就是个模板,等着其他子模块去继承。不过父Maven项目要高度抽象,高度提取公共的部分(交集),做到一处声明,多处使用。

与聚合一样我们需要构建另外一个模块,假设是parent,在聚合模块UidpWeb下面创建parent模块,然后通过该模块来作为所有模块的父POM,POM结构如下:

  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.  
  5. <groupId>com.uidp</groupId>
  6. <artifactId>UidpParent</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <packaging>pom</packaging>
  9.  
  10. <name>UidpParent</name>
  11. <url>http://maven.apache.org</url>
  12.  
  13. <properties>
  14. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  15.  
  16. <repository-url>http://192.168.0.70:8081/content/groups/public/</repository-url>
  17.  
  18. <maven-compiler-plugin.version>3.1</maven-compiler-plugin.version>
  19. <maven-war-plugin.version>2.4</maven-war-plugin.version>
  20. <maven-javadoc-plugin.version>2.9.1</maven-javadoc-plugin.version>
  21. <maven-release-plugin.version>2.4.1</maven-release-plugin.version>
  22. <maven-deploy-plugin.version>2.7</maven-deploy-plugin.version>
  23.  
  24. <junit.version>4.11</junit.version>
  25. <oracle.version>10.2.0.4</oracle.version>
  26. <springframework.version>3.2.8.RELEASE</springframework.version>
  27. <mybatis.version>3.2.2</mybatis.version>
  28. <mybatis-spring.version>1.2.0</mybatis-spring.version>
  29. <mysql-driver.version>5.1.25</mysql-driver.version>
  30. <aspectjweaver.version>1.7.3</aspectjweaver.version>
  31.  
  32. <commons-dbcp.version>1.4</commons-dbcp.version>
  33. <commons-pool.version>1.5.5</commons-pool.version>
  34. <commons-fileupload.version>1.2.2</commons-fileupload.version>
  35.  
  36. <log4j.version>1.2.17</log4j.version>
  37. <slf4j-api.version>1.7.5</slf4j-api.version>
  38. <slf4j-log4j12.version>1.7.5</slf4j-log4j12.version>
  39.  
  40. <freemarker.version>2.3.19</freemarker.version>
  41.  
  42. <jackson-core.version>2.5.0</jackson-core.version>
  43. <jackson-mapper-asl.version>1.9.7</jackson-mapper-asl.version>
  44.  
  45. <javax.servlet-api.version>3.0.1</javax.servlet-api.version>
  46. <jsp-api.version>2.2</jsp-api.version>
  47. <kryo.version>1.04</kryo.version>
  48. <snakeyaml.version>1.8</snakeyaml.version>
  49. <jedis.version>2.0.0</jedis.version>
  50. <commons-lang.version>2.6</commons-lang.version>
  51.  
  52. <mockito-core.version>1.8.5</mockito-core.version>
  53. <powermock-core.version>1.4.9</powermock-core.version>
  54. <powermock-api-mockito.version>1.4.9</powermock-api-mockito.version>
  55. <powermock-module-junit4.version>1.4.9</powermock-module-junit4.version>
  56. </properties>
  57.  
  58. <dependencyManagement>
  59. <dependencies>
  60.  
  61. <dependency>
  62. <groupId>junit</groupId>
  63. <artifactId>junit</artifactId>
  64. <version>${junit.version}</version>
  65. <scope>test</scope>
  66. </dependency>
  67.  
  68. <!-- spring jar begin -->
  69. <dependency>
  70. <groupId>org.springframework</groupId>
  71. <artifactId>spring-web</artifactId>
  72. <version>${springframework.version}</version>
  73. </dependency>
  74.  
  75. <dependency>
  76. <groupId>org.springframework</groupId>
  77. <artifactId>spring-webmvc</artifactId>
  78. <version>${springframework.version}</version>
  79. </dependency>
  80.  
  81. <dependency>
  82. <groupId>org.springframework</groupId>
  83. <artifactId>spring-beans</artifactId>
  84. <version>${springframework.version}</version>
  85. </dependency>
  86.  
  87. <dependency>
  88. <groupId>org.springframework</groupId>
  89. <artifactId>spring-context</artifactId>
  90. <version>${springframework.version}</version>
  91. </dependency>
  92.  
  93. <dependency>
  94. <groupId>org.springframework</groupId>
  95. <artifactId>spring-context-support</artifactId>
  96. <version>${springframework.version}</version>
  97. </dependency>
  98.  
  99. <dependency>
  100. <groupId>org.springframework</groupId>
  101. <artifactId>spring-core</artifactId>
  102. <version>${springframework.version}</version>
  103. </dependency>
  104.  
  105. <dependency>
  106. <groupId>org.springframework</groupId>
  107. <artifactId>spring-jdbc</artifactId>
  108. <version>${springframework.version}</version>
  109. </dependency>
  110.  
  111. <dependency>
  112. <groupId>org.springframework</groupId>
  113. <artifactId>spring-tx</artifactId>
  114. <version>${springframework.version}</version>
  115. </dependency>
  116.  
  117. <dependency>
  118. <groupId>org.springframework</groupId>
  119. <artifactId>spring-test</artifactId>
  120. <version>${springframework.version}</version>
  121. </dependency>
  122.  
  123. <dependency>
  124. <groupId>org.springframework</groupId>
  125. <artifactId>spring-expression</artifactId>
  126. <version>${springframework.version}</version>
  127. </dependency>
  128.  
  129. <dependency>
  130. <groupId>org.springframework</groupId>
  131. <artifactId>spring-aop</artifactId>
  132. <version>${springframework.version}</version>
  133. </dependency>
  134. <!-- spring jar end -->
  135.  
  136. <dependency>
  137. <groupId>org.mybatis</groupId>
  138. <artifactId>mybatis</artifactId>
  139. <version>${mybatis.version}</version>
  140. </dependency>
  141.  
  142. <dependency>
  143. <groupId>org.mybatis</groupId>
  144. <artifactId>mybatis-spring</artifactId>
  145. <version>${mybatis-spring.version}</version>
  146. </dependency>
  147.  
  148. <dependency>
  149. <groupId>mysql</groupId>
  150. <artifactId>mysql-connector-java</artifactId>
  151. <version>${mysql-driver.version}</version>
  152. </dependency>
  153.  
  154. <dependency>
  155. <groupId>com.oracle</groupId>
  156. <artifactId>ojdbc14</artifactId>
  157. <version>${oracle.version}</version>
  158. </dependency>
  159.  
  160. <dependency>
  161. <groupId>org.aspectj</groupId>
  162. <artifactId>aspectjweaver</artifactId>
  163. <version>${aspectjweaver.version}</version>
  164. </dependency>
  165.  
  166. <dependency>
  167. <groupId>commons-dbcp</groupId>
  168. <artifactId>commons-dbcp</artifactId>
  169. <version>${commons-dbcp.version}</version>
  170. </dependency>
  171. <dependency>
  172. <groupId>commons-pool</groupId>
  173. <artifactId>commons-pool</artifactId>
  174. <version>${commons-pool.version}</version>
  175. </dependency>
  176. <dependency>
  177. <groupId>commons-fileupload</groupId>
  178. <artifactId>commons-fileupload</artifactId>
  179. <version>${commons-fileupload.version}</version>
  180. </dependency>
  181.  
  182. <!-- log jar -->
  183. <dependency>
  184. <groupId>log4j</groupId>
  185. <artifactId>log4j</artifactId>
  186. <version>${log4j.version}</version>
  187. </dependency>
  188. <dependency>
  189. <groupId>org.slf4j</groupId>
  190. <artifactId>slf4j-api</artifactId>
  191. <version>${slf4j-api.version}</version>
  192. </dependency>
  193. <dependency>
  194. <groupId>org.slf4j</groupId>
  195. <artifactId>slf4j-log4j12</artifactId>
  196. <version>${slf4j-log4j12.version}</version>
  197. </dependency>
  198.  
  199. <!-- freemarker -->
  200. <dependency>
  201. <groupId>org.freemarker</groupId>
  202. <artifactId>freemarker</artifactId>
  203. <version>${freemarker.version}</version>
  204. </dependency>
  205.  
  206. <!-- jackson -->
  207. <dependency>
  208. <groupId>com.fasterxml.jackson.core</groupId>
  209. <artifactId>jackson-core</artifactId>
  210. <version>${jackson-core.version}</version>
  211. </dependency>
  212. <dependency>
  213. <groupId>org.codehaus.jackson</groupId>
  214. <artifactId>jackson-mapper-asl</artifactId>
  215. <version>${jackson-mapper-asl.version}</version>
  216. </dependency>
  217.  
  218. <dependency>
  219. <groupId>javax.servlet</groupId>
  220. <artifactId>javax.servlet-api</artifactId>
  221. <version>${javax.servlet-api.version}</version>
  222. <scope>provided</scope>
  223. </dependency>
  224.  
  225. <dependency>
  226. <groupId>javax.servlet.jsp</groupId>
  227. <artifactId>jsp-api</artifactId>
  228. <version>${jsp-api.version}</version>
  229. <scope>provided</scope>
  230. </dependency>
  231.  
  232. <dependency>
  233. <groupId>com.googlecode</groupId>
  234. <artifactId>kryo</artifactId>
  235. <version>${kryo.version}</version>
  236. </dependency>
  237.  
  238. <dependency>
  239. <groupId>org.yaml</groupId>
  240. <artifactId>snakeyaml</artifactId>
  241. <version>${snakeyaml.version}</version>
  242. </dependency>
  243.  
  244. <dependency>
  245. <groupId>redis.clients</groupId>
  246. <artifactId>jedis</artifactId>
  247. <version>${jedis.version}</version>
  248. </dependency>
  249.  
  250. <dependency>
  251. <groupId>commons-lang</groupId>
  252. <artifactId>commons-lang</artifactId>
  253. <version>${commons-lang.version}</version>
  254. </dependency>
  255.  
  256. <dependency>
  257. <groupId>org.mockito</groupId>
  258. <artifactId>mockito-core</artifactId>
  259. <version>${mockito-core.version}</version>
  260. <scope>test</scope>
  261. </dependency>
  262.  
  263. <dependency>
  264. <groupId>org.powermock</groupId>
  265. <artifactId>powermock-core</artifactId>
  266. <version>${powermock-core.version}</version>
  267. <scope>test</scope>
  268. </dependency>
  269.  
  270. <dependency>
  271. <groupId>org.powermock</groupId>
  272. <artifactId>powermock-api-mockito</artifactId>
  273. <version>${powermock-api-mockito.version}</version>
  274. <scope>test</scope>
  275. </dependency>
  276.  
  277. <dependency>
  278. <groupId>org.powermock</groupId>
  279. <artifactId>powermock-module-junit4</artifactId>
  280. <version>${powermock-module-junit4.version}</version>
  281. <scope>test</scope>
  282. </dependency>
  283.  
  284. </dependencies>
  285. </dependencyManagement>
  286.  
  287. <distributionManagement>
  288. <repository>
  289. <id>releases</id>
  290. <name>public</name>
  291. <url>http://59.50.95.66:8081/nexus/content/repositories/releases</url>
  292. </repository>
  293. <snapshotRepository>
  294. <id>snapshots</id>
  295. <name>Snapshots</name>
  296. <url>http://59.50.95.66:8081/nexus/content/repositories/snapshots</url>
  297. </snapshotRepository>
  298. </distributionManagement>
  299.  
  300. <build>
  301. <plugins>
  302.  
  303. <plugin>
  304. <groupId>org.apache.maven.plugins</groupId>
  305. <artifactId>maven-compiler-plugin</artifactId>
  306. <version>${maven-compiler-plugin.version}</version>
  307. <configuration>
  308. <source>1.7</source> <!-- 源代码使用的开发版本 -->
  309. <target>1.7</target> <!-- 需要生成的目标class文件的编译版本 -->
  310. </configuration>
  311. </plugin>
  312.  
  313. <plugin>
  314. <groupId>org.apache.maven.plugins</groupId>
  315. <artifactId>maven-javadoc-plugin</artifactId>
  316. <version>${maven-javadoc-plugin.version}</version>
  317. </plugin>
  318.  
  319. <plugin>
  320. <groupId>org.apache.maven.plugins</groupId>
  321. <artifactId>maven-release-plugin</artifactId>
  322. <version>${maven-release-plugin.version}</version>
  323. </plugin>
  324.  
  325. <plugin>
  326. <groupId>org.apache.maven.plugins</groupId>
  327. <artifactId>maven-deploy-plugin</artifactId>
  328. <version>${maven-deploy-plugin.version}</version>
  329. <configuration>
  330. <updateReleaseInfo>true</updateReleaseInfo>
  331. </configuration>
  332. </plugin>
  333.  
  334. </plugins>
  335. </build>
  336.  
  337. <pluginRepositories>
  338. <pluginRepository>
  339. <id>nexus</id>
  340. <name>nexus</name>
  341. <url>http://192.168.0.70:8081/content/groups/public/</url>
  342. <releases>
  343. <enabled>true</enabled>
  344. </releases>
  345. <snapshots>
  346. <enabled>true</enabled>
  347. </snapshots>
  348. </pluginRepository>
  349. </pluginRepositories>
  350.  
  351. </project>

需要注意的是,他的packaging和聚合一样为pom,作为父模块的pom,其打包类型必须为pom。父模块只是为了帮助消除配置的重复,因此他本身不包含除POM的项目文件,也就不需要src/main/java之类的文件夹了。

有了父模块,就需要让其他模块来继承它,我们来看个实际的例子:

  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/maven-v4_0_0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4.  
  5. <parent>
  6. <groupId>com.uidp</groupId>
  7. <artifactId>UidpParent</artifactId>
  8. <version>0.0.1-SNAPSHOT</version>
  9. </parent>
  10.  
  11. <groupId>com.uidp</groupId>
  12. <artifactId>log</artifactId>
  13. <packaging>war</packaging>
  14. <version>0.0.1-SNAPSHOT</version>
  15. <name>log</name>
  16. <url>http://maven.apache.org</url>
  17.  
  18. <dependencies>
  19.  
  20. <dependency>
  21. <artifactId>ThirdParty</artifactId>
  22. <version>0.0.1-SNAPSHOT</version>
  23. <groupId>${project.parent.groupId}</groupId>
  24. <type>war</type>
  25. </dependency>
  26.  
  27. <dependency>
  28. <groupId>com.uidp</groupId>
  29. <artifactId>WebCommon</artifactId>
  30. <version>0.0.1-SNAPSHOT</version>
  31. </dependency>
  32.  
  33. <dependency>
  34. <groupId>junit</groupId>
  35. <artifactId>junit</artifactId>
  36. <scope>test</scope>
  37. </dependency>
  38.  
  39. <dependency>
  40. <groupId>org.aspectj</groupId>
  41. <artifactId>aspectjweaver</artifactId>
  42. </dependency>
  43.  
  44. <!-- spring jar begin -->
  45. <dependency>
  46. <groupId>org.springframework</groupId>
  47. <artifactId>spring-web</artifactId>
  48. </dependency>
  49. <dependency>
  50. <groupId>org.springframework</groupId>
  51. <artifactId>spring-webmvc</artifactId>
  52. </dependency>
  53. <dependency>
  54. <groupId>org.springframework</groupId>
  55. <artifactId>spring-beans</artifactId>
  56. </dependency>
  57. <dependency>
  58. <groupId>org.springframework</groupId>
  59. <artifactId>spring-context</artifactId>
  60. </dependency>
  61. <dependency>
  62. <groupId>org.springframework</groupId>
  63. <artifactId>spring-context-support</artifactId>
  64. </dependency>
  65. <dependency>
  66. <groupId>org.springframework</groupId>
  67. <artifactId>spring-core</artifactId>
  68. </dependency>
  69. <dependency>
  70. <groupId>org.springframework</groupId>
  71. <artifactId>spring-jdbc</artifactId>
  72. </dependency>
  73. <dependency>
  74. <groupId>org.springframework</groupId>
  75. <artifactId>spring-tx</artifactId>
  76. </dependency>
  77. <dependency>
  78. <groupId>org.springframework</groupId>
  79. <artifactId>spring-test</artifactId>
  80. </dependency>
  81. <dependency>
  82. <groupId>org.springframework</groupId>
  83. <artifactId>spring-expression</artifactId>
  84. </dependency>
  85. <dependency>
  86. <groupId>org.springframework</groupId>
  87. <artifactId>spring-aop</artifactId>
  88. </dependency>
  89. <!-- spring jar end -->
  90.  
  91. <!-- Quartz 框架 -->
  92. <dependency>
  93. <groupId>org.quartz-scheduler</groupId>
  94. <artifactId>quartz</artifactId>
  95. <version>1.8.6</version>
  96. </dependency>
  97.  
  98. <!-- mybatis db -->
  99. <dependency>
  100. <groupId>org.mybatis</groupId>
  101. <artifactId>mybatis</artifactId>
  102. </dependency>
  103.  
  104. <dependency>
  105. <groupId>org.mybatis</groupId>
  106. <artifactId>mybatis-spring</artifactId>
  107. </dependency>
  108.  
  109. <!-- mysql驱动依赖包 -->
  110. <dependency>
  111. <groupId>mysql</groupId>
  112. <artifactId>mysql-connector-java</artifactId>
  113. </dependency>
  114.  
  115. <!-- 数据库连接池 jar -->
  116. <dependency>
  117. <groupId>commons-dbcp</groupId>
  118. <artifactId>commons-dbcp</artifactId>
  119. </dependency>
  120. <dependency>
  121. <groupId>commons-pool</groupId>
  122. <artifactId>commons-pool</artifactId>
  123. </dependency>
  124. <dependency>
  125. <groupId>commons-fileupload</groupId>
  126. <artifactId>commons-fileupload</artifactId>
  127. </dependency>
  128.  
  129. <!-- jackson -->
  130. <dependency>
  131. <groupId>com.fasterxml.jackson.core</groupId>
  132. <artifactId>jackson-core</artifactId>
  133. </dependency>
  134. <dependency>
  135. <groupId>org.codehaus.jackson</groupId>
  136. <artifactId>jackson-mapper-asl</artifactId>
  137. </dependency>
  138.  
  139. <!-- log jar -->
  140. <dependency>
  141. <groupId>log4j</groupId>
  142. <artifactId>log4j</artifactId>
  143. </dependency>
  144. <dependency>
  145. <groupId>org.slf4j</groupId>
  146. <artifactId>slf4j-api</artifactId>
  147. </dependency>
  148. <dependency>
  149. <groupId>org.slf4j</groupId>
  150. <artifactId>slf4j-log4j12</artifactId>
  151. </dependency>
  152.  
  153. <!-- freemarker -->
  154. <dependency>
  155. <groupId>org.freemarker</groupId>
  156. <artifactId>freemarker</artifactId>
  157. </dependency>
  158.  
  159. <dependency>
  160. <groupId>com.oracle</groupId>
  161. <artifactId>ojdbc14</artifactId>
  162. </dependency>
  163.  
  164. <!--因为api是打jar包的,所以这里用compile,如果是正常情况打war包,用private -->
  165. <dependency>
  166. <groupId>javax.servlet</groupId>
  167. <artifactId>javax.servlet-api</artifactId>
  168. <scope>compile</scope>
  169. </dependency>
  170.  
  171. <dependency>
  172. <groupId>javax.servlet.jsp</groupId>
  173. <artifactId>jsp-api</artifactId>
  174. <scope>compile</scope>
  175. </dependency>
  176.  
  177. <dependency>
  178. <groupId>commons-lang</groupId>
  179. <artifactId>commons-lang</artifactId>
  180. <version>2.6</version>
  181. </dependency>
  182.  
  183. </dependencies>
  184.  
  185. <build>
  186. <plugins>
  187.  
  188. <plugin>
  189. <groupId>org.mortbay.jetty</groupId>
  190. <artifactId>jetty-maven-plugin</artifactId>
  191. <version>7.2.2.v20101205</version>
  192. <configuration>
  193. <stopKey>foo</stopKey>
  194. <stopPort>9999</stopPort>
  195. <webAppConfig>
  196. <contextPath>/</contextPath>
  197. </webAppConfig>
  198. <!-- 指定额外需要监控变化的文件或文件夹,主要用于热部署中的识别文件更新 -->
  199. <scanTargetPatterns>
  200. <scanTargetPattern>
  201. <directory>src</directory>
  202. <includes>
  203. <include>**/*.java</include>
  204. <include>**/*.properties</include>
  205. </includes>
  206. <excludes>
  207. <exclude>**/*.xml</exclude>
  208. <exclude>**/myspecial.properties</exclude>
  209. </excludes>
  210. </scanTargetPattern>
  211. </scanTargetPatterns>
  212. <scanIntervalSeconds>1</scanIntervalSeconds>
  213. <webAppSourceDirectory>${basedir}/src/main/webapp</webAppSourceDirectory><!--指定web页面的文件夹 -->
  214. </configuration>
  215. </plugin>
  216.  
  217. <plugin>
  218. <groupId>org.apache.maven.plugins</groupId>
  219. <artifactId>maven-war-plugin</artifactId>
  220. <version>${maven-war-plugin.version}</version>
  221. <configuration>
  222. <failOnMissingWebXml>false</failOnMissingWebXml>
  223. <warName>${project.artifactId}</warName>
  224. </configuration>
  225. </plugin>
  226. </plugins>
  227. </build>
  228.  
  229. </project>

上述POM中使用parent元素声明父模块,parent下的子元素groupIdartifactIdversion指定了父模块的坐标,这三个元素是必须的。relativePath元素是可选的,我这里用的默认值所以并没有配置,relativePath元素的默认值为../pom.xml,也就是说,Maven默认父POM在上一层目录下。当项目构建时,Maven会首先根据relativePath检查父POM,如果找不到,再从本地仓库找。所以像我这里如果本地仓库中也没有父POM的话构建就会失败了,所以最好的做法是配置relativePath../parent/pom.xml表示父POM的位置与在log/目录平行的parent/下。这样就算本地仓库没有父POM构建的时候也不会报错了。

大家有木有发现log的groupId和version元素是与父POM一样的,所以这里其实是可以省略不要的,但是如果log有自己专门的groupId和version,那么就显示的配置一个就好了。对于artifactId元素来说,子模块应该显式的声明,避免造成坐标冲突和混淆。

对于依赖的继承,我们可以把依赖放入<dependencyManagement>元素当中,这样的依赖就成了可选的,我们只要在项目中继承我们所需的依赖即可,比如:

  1. <dependency>
  2.   <groupId>junit</groupId>
  3.   <artifactId>junit</artifactId>
  4.   <scope>test</scope>
  5. </dependency>

我们不需要进行版本的声明,这样就可以根据自己的需要引入需要的包,而不会继承全部的包。

对于每个项目都需要继承的依赖则不放在<dependencyManagement>元素当中,不过个人觉得没什么必要,都放在<dependencyManagement>元素当中,需要的时候引入一下就好了。

插件的继承与依赖的继承是类似的,这里不过多的说明,插件也有一个<pluginManagement></pluginManagement>元素,放在下面的插件也表示为可选的。

在使用父POM的时候也要在聚合模块中加入:<module>parent</module>

应该是放在最前面,大家可以看看上面的聚合POM。

3、可继承的POM元素

groupIdversion是可以被继承的,那么还有哪些POM元素可以被继承呢?以下是一个完整的列表,并附带了简单的说明:

  • groupId :项目组 ID ,项目坐标的核心元素;
  • version :项目版本,项目坐标的核心元素;
  • description :项目的描述信息;
  • organization :项目的组织信息;
  • inceptionYear :项目的创始年份;
  • url :项目的 url 地址;
  • develoers :项目的开发者信息;
  • contributors :项目的贡献者信息;
  • distributionManagerment :项目的部署信息;
  • issueManagement :缺陷跟踪系统信息;
  • ciManagement :项目的持续继承信息;
  • scm :项目的版本控制信息;
  • mailingListserv :项目的邮件列表信息;
  • properties :自定义的 Maven 属性;
  • dependencies :项目的依赖配置;
  • dependencyManagement :醒目的依赖管理配置;
  • repositories :项目的仓库配置;
  • build :包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等;
  • reporting :包括项目的报告输出目录配置、报告插件配置等。

4、聚合与继承的关系

区别 :

  1. 对于聚合模块来说,它知道有哪些被聚合的模块,但那些被聚合的模块不知道这个聚合模块的存在。
  2. 对于继承关系的父POM来说,它不知道有哪些子模块继承于它,但那些子模块都必须知道自己的父POM是什么。

共同点 :

  1. 聚合POM与继承关系中的父POM的packaging都是pom。
  2. 聚合模块与继承关系中的父模块除了POM之外都没有实际的内容。

图示:

5、有关版本的简单说明

对于用过svn或者cvs的朋友们,都会知道,每次修改都会提交一个版本到服务器上,对于我们平常所搭建的项目,大家可能没有注意到版本这个概念。其实版本对于叠加式开发的项目是个很重要的概念,通过上面的依赖,我们就可以清楚地看到一个version,这个就是引入依赖包的版本。

那么版本一共可以分为几个层次,一般来说,版本可以分为:总版本号.分支版本号.小版本号-里程碑版本。

  • 总版本号:一般表示框架的变动。
  • 分支版本号:一般表示增加了一些功能。
  • 小版本号:在分支版本上面进行bug的修复。
  • 里程碑:SNAPSHOT–>alpha–>beta–>release–>GA

结束语:关于继承所包含的内容比较多,不是三言两语就能描述的很清楚的,所以再次强烈建议大家可以购买许晓斌老师的《Maven实战》,这本书会介绍的比较详细,个人觉得最好的投资就是投资自己的学习,所以如果你是Maven的初学者,应该和我一样购买这本书籍,如果是大神,那么也就没必要看这篇博文了,营养价值并不高。

Maven 教程(14)— Maven聚合与继承的更多相关文章

  1. (转)Maven学习总结(五)——聚合与继承

    孤傲苍狼只为成功找方法,不为失败找借口! Maven学习总结(五)——聚合与继承 一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 1 <mod ...

  2. 转】Maven学习总结(五)——聚合与继承

    原博文出自于: http://www.cnblogs.com/xdp-gacl/p/4058008.html 感谢! 一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1. ...

  3. Maven详解之聚合与继承

    说到聚合与继承我们都很熟悉,maven同样也具备这样的设计原则,下面我们来看一下Maven的pom如何进行聚合与继承的配置实现. 一.为什么要聚合? 随着技术的飞速发展和各类用户对软件的要求越来越高, ...

  4. Maven学习总结(五)——聚合与继承

    一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 <modules> <module>模块一</module> & ...

  5. Maven详解 之 聚合与继承

    说到聚合与继承我们都很熟悉,maven同样也具备这样的设计原则,下面我们来看一下Maven的pom如何进行聚合与继承的配置实现. 一.为什么要聚合? 随着技术的飞速发展和各类用户对软件的要求越来越高, ...

  6. (5)Maven快速入门_5maven聚合与继承_scope依赖范围

    多个maven项目实现统一管理, maven 插件jar继承自父的maven项目.对maven中jar的版本进行管理. 1.创建一个项目来管理多个maven项目 new ----maven Proje ...

  7. Maven学习小结(四 聚合与继承)

    1.聚合 一次构建多个项目模块. 2.继承 为了消除重复,把很多相同的配置提取出来,例如groupid和version: 2.1 Maven中可以继承的POM元素 groupId :项目组 ID ,项 ...

  8. maven学习笔记四(聚合和继承)

    聚合 现在假如,我创建了3个maven项目, user-core.2.user-log,3.user-service 这个时候,假如我们要打包这些项目,要一个一个来,会很麻烦.那么我们有没有更好的办法 ...

  9. Maven学习总结(5)——聚合与继承

    Maven学习总结(五)--聚合与继承 一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 <modules> <module> ...

  10. 你分得清楚Maven的聚合和继承吗?

    用了 Maven 好几年了,许多人还是只懂得简单的依赖坐标.对于 Maven 的聚合和继承还是一知半解,甚至很多人以为是同一个东西.但其实聚合是用于快速构建项目,是表示项目与子项目之间的关系.而继承则 ...

随机推荐

  1. Entity Framework 学习系列(4) - EF 增删改

    目录 写在前面 一.开发环境 二.创建项目 三.新增 1.单表新增 2.批量新增 3.多表新增 四.编辑 1.先查询,后编辑 2.创建实体,后编辑 五.删除 写在前面 在上一小节中,学习了如何 通过C ...

  2. ASP.Net Core中设置JSON中DateTime类型的格式化(解决时间返回T格式)

    最近项目有个新同事,每个API接口里返回的时间格式中都带T如:[2019-06-06T10:59:51.1860128+08:00],其实这个主要是ASP.Net Core自带时间格式列化时间格式设置 ...

  3. Macbook中VMWare的Centos7虚拟机配置静态IP并允许上网的配置方法

    一.检查Macbook本身的配置 1.打开[系统偏好设置]-[网络]- 选中[Wi-Fi]项(如果您是WIFI上网请选择此项)- 点右侧[高级] 选择[TCP/IP]选项卡,记录好[子网掩码].[路由 ...

  4. golang下载图片,而非预览

    1 前言 网上查询使用html5,a增加属性download和使用表单get,post提交,都是只能预览,根本原因是返回值需要加入头 w.Header().Add("Content-Type ...

  5. contos7自启动django服务

    研究了很多种办法 1.新建一个sh 文件 vi django_autostart.sh 2.编辑文件内容 #!/bin/bash #chkconfig:345 61 61 //此行的345参数表示,在 ...

  6. Python 基础总结篇

    变量及数据类型 Numbers数字分为:int整型,long长整型,float浮点型,complex复数 String字符串由数字.字母.下划线组成的一串字符,用于表示文本的数据类型 bool布尔型: ...

  7. ASP.NET Core MVC 502 bad gateway 超时如何处理

    在网页程序运行需要较长时间运行的时候,ASP.NET Core MVC会出现502 bad gateway请求超时情况.一般默认的超时时间都比较短,我们需要在 web.config 中配置一下.其中  ...

  8. 04、rpm+yum+tar解压

    Linux 下安装软件: 1.rpm 软件包的安装 一般安装都用 rpm -ivh 包路径及名字 如:rpm -ivh /soft/RealPlayer11GOLD.rpm   --安装/soft下 ...

  9. node中glob模块总结

    参考文章:   githup_glob    node-glob学习 前言: 最近在学习webpack配置, 其中有一项glob配置入口文件, 来获取对应的文件名, 达到入口entry和output文 ...

  10. 【JavaScript】JavaScript基本语法&知识点

    JavaScript: 是脚本语言:是一种解释性的语言(不需要编译) 作用: 让页面有具有动态效果 组成部分: ECMAScipt(核心),包含基本语法.变量.关键字.保留字.数据类型.语句.函数等 ...