Archetype插件经过 pom.xml 文件建立了一个项目。这就是项目对象模型 (POM),一个项目的声明性描述。html
当Maven运行一个目标的时候,每一个目标都会访问定 义在项目POM里的信息。java
这个POM文件在maven1中是project.xml,在maven2时改成pom.xml。web
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>MavenLearn</groupId> <artifactId>simple</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> </project>
上面是一个简单的pom.xml文件的例子,能够看到,在上面这个文件中主要定义了,项目的基本信息 和 项目的依赖信息(dependencies)。spring
项目的基本信息中最重要的就是: groupId,artifactId,version,这三个关键信息组成了一个项目的坐标(Coordinate),它能够惟一的标示一个项目,也是项目依赖的根据。apache
以上三个标记 加上 modelVersion(设置为4.0.0) 都是pom.xml中必需的。api
POM文件中除了能够指定上面提到的项目基本信息,dependencies,还能够定义插件, profiles,以及项目描述(description),研发人员(developer),邮件列表(mailing list)等。mvc
咱们在定义pom.xml 的时候,尤为是定义 dependencies时,一般会引入同一个版本的好多文件,好比spring 框架下,某个版本的spring-context,spring-test,spring-core,spring-beans,spring-webmvc 等等,即使它们下面有些是有依赖关系的,能够由maven帮咱们作了,可是还有好多都是要本身写的,至关麻烦,若是这个你还能够接受,毕竟只定义一次嘛,那若是spring在将来哪天出了一个新特性,你特别想用,要升级一下,那又得从新改一遍,没准还改错了呢。这个时候就须要用到maven的变量了。这个时候就须要用到maven的变量了。app
maven变量分为自定变量和内置变量框架
在pom文件中咱们能够这样定义变量,dom
<properties> <spring.group>org.springframework</spring.group> <spring.version>3.1.1.RELEASE</spring.version> </properties>
在使用的时候,经过以下方法引用
<dependency> <groupId>${spring.group}</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency>
须要注意的是,在“<properties>”中除了能够本身构建须要的变量,也能够指定项目内置变量的值,例如,设置源码编码、生成报告编码和surefire插件的jvm运行参数为utf-8:
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <argLine>-Dfile.encoding=UTF-8</argLine> </properties>
接下来讲一下pom的继承(Inheritance)和聚合(Aggregation),
继承是用在多个子项目,相同的配置的部分,能够抽离出来造成一个父pom,子项目都继承它。这样好处是,减小配置,配置的地方少了,出错的可能就减少了;抽取出了公共的配置,便于维护。
聚合是把多个子项目合并到一块儿,能够用一个命令就完成整个项目的集成。举个例子,一个系统有三个子模块,由三个团队分别负责开发,都开发完以后,须要发布系统,聚合以后就能够一个命令搞定,而不是各个子项目分别打包,再集成为一个,各类问题。。。
继承的内容包括:dependencies、研发者信息、插件列表(包含reports)、插件的执行设置(plugin executions with matching ids)、插件配置、资源配置(resource)。
一个列子:
com.mycompany.app:my-app:1,其配置以下:
<project> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-module</artifactId>
<version>1</version> <packaging>pom</packaging>
</project>
它有一个子模块,my-module,目录结构以下:
若是让my-module继承my-app,那其pom能够以下配置(前提是my-app已经install到了local repository,或者my-app的pom文件在my-module pom文件的上一级目录):
<project> <parent> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <version>1</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-module</artifactId> <version>1</version> </project>
若是不是上面的目录结构,又没有install到本地仓库的话,怎么破,好比这种结构:
额。。直接用<relativePath>标签指定父级pom的路径就行了,
<project> <parent> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <version>1</version> <relativePath>../parent/pom.xml</relativePath> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>my-module</artifactId> </project>
其实聚合的构建方法和继承的是很类似的,这里列举一个例子,假设目录以下:
parent是用于聚合的,my-module是子项目,
parent的pom以下:
<project> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <version>1</version> <packaging>pom</packaging> <modules> <module>../my-module</module> </modules> </project>
注意两点:
被聚合的项目my-module的pom以下:
<project> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-module</artifactId> <version>1</version> </project>
总结一下继承和聚合
区别 :
1.对于聚合模块来讲,它知道有哪些被聚合的模块,但那些被聚合的模块不知道这个聚合模块的存在。
2.对于继承关系的父 POM来讲,它不知道有哪些子模块继承与它,但那些子模块都必须知道本身的父 POM是什么。
共同点 :
1.聚合 POM与继承关系中的父POM的 packaging都是pom
2.聚合模块与继承关系中的父模块除了 POM以外都没有实际的内容。
咱们能够单独使用继承或者聚合的特性,也能够结合起来使用,
下面来一个集合继承与聚合的实例,
首先用idea创建四个项目,目录如图:
最终的目的是:pomLearn目录用于聚合,module1,module2继承module_parent
如今先配置好基础项目的关系,四个配置文件以下:
pomLearn——聚合 aggregation
注意:
module_parent
注意:
module1
注意:
module2
ok,运行一下mvn clean,出现如下结果,配置成功:
D:\Java\jdk1.8.0_65\bin\java -Dmaven.multiModuleProjectDirectory=$M2_HOME -Dmaven.home=D:\Coding\apache-maven-3.3.3 -Dclassworlds.conf=D:\Coding\apache-maven-3.3.3\bin\m2.conf -Didea.launcher.port=7539 "-Didea.launcher.bin.path=D:\Coding\JetBrains\IntelliJ IDEA 14.0\bin" -Dfile.encoding=UTF-8 -classpath "D:\Coding\apache-maven-3.3.3\boot\plexus-classworlds-2.5.2.jar;D:\Coding\JetBrains\IntelliJ IDEA 14.0\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain org.codehaus.classworlds.Launcher -Didea.version=14.0 clean
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] module_parent
[INFO] module1
[INFO] module2
[INFO] pomLearn
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building module_parent 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ module_parent ---
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building module1 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ module1 ---
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building module2 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ module2 ---
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building pomLearn 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ pomLearn ---
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] module_parent ...................................... SUCCESS [ 0.135 s]
[INFO] module1 ............................................ SUCCESS [ 0.003 s]
[INFO] module2 ............................................ SUCCESS [ 0.002 s]
[INFO] pomLearn ........................................... SUCCESS [ 0.001 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.230 s
[INFO] Finished at: 2016-01-19T23:50:18+08:00
[INFO] Final Memory: 8M/309M
[INFO] ------------------------------------------------------------------------
Process finished with exit code 0
在没有特别指定的状况下,咱们使用的pom文件都是继承自maven的Super POM,文章最后列出的就是Maven 2.1.x 的Super POM,也能够参看maven document 的 Introduction to the POM 。
<project> <modelVersion>4.0.0</modelVersion> <name>Maven Default Project</name> <repositories> <repository> <id>central</id> <name>Maven Repository Switchboard</name> <layout>default</layout> <url>http://repo1.maven.org/maven2</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>central</id> <name>Maven Plugin Repository</name> <url>http://repo1.maven.org/maven2</url> <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> <releases> <updatePolicy>never</updatePolicy> </releases> </pluginRepository> </pluginRepositories> <build> <directory>${project.basedir}/target</directory> <outputDirectory>${project.build.directory}/classes</outputDirectory> <finalName>${project.artifactId}-${project.version}</finalName> <testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory> <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory> <!-- TODO: MNG-3731 maven-plugin-tools-api < 2.4.4 expect this to be relative... --> <scriptSourceDirectory>src/main/scripts</scriptSourceDirectory> <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory> <resources> <resource> <directory>${project.basedir}/src/main/resources</directory> </resource> </resources> <testResources> <testResource> <directory>${project.basedir}/src/test/resources</directory> </testResource> </testResources> <pluginManagement> <plugins> <plugin> <artifactId>maven-antrun-plugin</artifactId> <version>1.3</version> </plugin> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.2-beta-2</version> </plugin> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>2.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>2.0.2</version> </plugin> <plugin> <artifactId>maven-dependency-plugin</artifactId> <version>2.0</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.4</version> </plugin> <plugin> <artifactId>maven-ear-plugin</artifactId> <version>2.3.1</version> </plugin> <plugin> <artifactId>maven-ejb-plugin</artifactId> <version>2.1</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.2</version> </plugin> <plugin> <artifactId>maven-jar-plugin</artifactId> <version>2.2</version> </plugin> <plugin> <artifactId>maven-javadoc-plugin</artifactId> <version>2.5</version> </plugin> <plugin> <artifactId>maven-plugin-plugin</artifactId> <version>2.4.3</version> </plugin> <plugin> <artifactId>maven-rar-plugin</artifactId> <version>2.2</version> </plugin> <plugin> <artifactId>maven-release-plugin</artifactId> <version>2.0-beta-8</version> </plugin> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>2.3</version> </plugin> <plugin> <artifactId>maven-site-plugin</artifactId> <version>2.0-beta-7</version> </plugin> <plugin> <artifactId>maven-source-plugin</artifactId> <version>2.0.4</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.4.3</version> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>2.1-alpha-2</version> </plugin> </plugins> </pluginManagement> </build> <reporting> <outputDirectory>${project.build.directory}/site</outputDirectory> </reporting> <profiles> <profile> <id>release-profile</id> <activation> <property> <name>performRelease</name> <value>true</value> </property> </activation> <build> <plugins> <plugin> <inherited>true</inherited> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <executions> <execution> <id>attach-sources</id> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin> <plugin> <inherited>true</inherited> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> <executions> <execution> <id>attach-javadocs</id> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin> <plugin> <inherited>true</inherited> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-deploy-plugin</artifactId> <configuration> <updateReleaseInfo>true</updateReleaseInfo> </configuration> </plugin> </plugins> </build> </profile> </profiles> </project>
参考:
Introduction to the POM,maven document,http://maven.apache.org/guides/introduction/introduction-to-the-pom.html
聚合与继承,iqeq00,http://iqeq00.iteye.com/blog/2033617?utm_source=tuicool&utm_medium=referral
Maven聚合与继承,chenzhou123520,http://chenzhou123520.iteye.com/blog/1582166
一个多maven项目聚合的实例,kyfxbl,http://www.iteye.com/topic/1126788
maven权威指南