前言:
1、pom文件的配置,主要内容为属性、坐标与依赖、插件、仓库以及其他一些配置。
2、理解这些配置的内容,在一定程度上也就理解了Maven 的使用。
一、属性
(一)Maven内置属性:
1、${basedir} 项目根目录,即包含 pom.xml 的目录。
2、${version} 表示项目版本。
(二)Pom属性:使用该类属性引用pom文件内对应元素的值。如
1、${project.xxx} 当前pom文件的任意节点的内容。如${project.artifactId} 就对应了 <project><artifactId>元素的值。
2、${project.build.source.directory} :项目的主源码目录,默认为src/main/java
3、${project.build.directory} 构建项目输出目录,缺省为target
4、${project.build.outputDirectory} :项目主代码编译输出目录,缺省为target/classes
5、${project.build.finalName} 项目打包输出文件的名称,缺省为${project.artifactId}-${project.version}
6、${project.packaging} 打包类型,缺省为jar
(三)自定义属性:<properties >标签
1、实例
<span style="font-family:Arial;font-size:18px;"><properties>
<project.charset>UTF-8</project.charset>
<jdk.version>1.6</jdk.version>
<spring.version>3.2.2.RELEASE</spring.version>
<springsecurity.version>2.0.5.RELEASE</springsecurity.version>
<asm.version>3.3</asm.version>
<srtus2.version>2.3.15.1</srtus2.version>
<cxf.version>2.7.4</cxf.version>
</properties></span>
(四)Setting 属性:与pom属性同理
1、引用:以 setting. 开头的属性引用settings.xml 文件中 XML 元素的值,如常用的 ${settings,localRespository} 指向本地仓库。
(五)Java系统属性 与 环境变量属性。
1、Java系统属性:使用Maven属性引用。如 ${user.home}:指向用户目录。
2、环境变量属性:使用 env. 开头的Maven 属性引用。如${env.JAVA_HOME} 指代JAVA_HOME 的值。
3、使用 mvn help : system 插卡所有Java系统变量 与 环境变量变量 。
(六)注意点
1、Maven属性只能在pom中被解析,只有使用过滤后才可以在配置文件中被解析。
2、定义的属性在 pom 的其他地方使用 ${key} 引用。如这边定义的 <a>111</a> 在pom 的其他地方引用${a}使用。
3、使用属性与 Profile、 资源过滤可以实现动态构建。
二、坐标
1、实例
<groupId>JavaMaven</groupId>
<artifactId>maven-web-dao</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>maven-web-dao Maven Webapp</name>
2、关键字:
1)groupId:定义当前maven项目(模块)隶属的实际项目即一般为项目名。
2)artifactId:当前的maven项目名(模块名),即模块名。
3)version:版本。SNAPSHOT意为快照,说明该项目还处于开发中,是不稳定的版本。
4)package:定义Maven 的打包的方式,默认为 jar 。
5)classifier:定义一些属性构建。如通过插件生成源码包 xxx.sources.jar 等附属构建,这时sources 就是一个classifier 。
综合理解:如 项目spring-framework 为一个groupId,而其中 spring-core 和 spring-aop为分别的两个 artifactId 。
三、依赖 dependency
(一)简单依赖
1、新建项目JavaMaven的两个模块maven-entity 和 maven-common:common模块依赖于entity模块
2、maven-entity 模块中需要引入log4j 和 hibernate ,jar都在本地仓库的com/web-jar文件下。pom文件如下:
<span style="font-family:Arial;font-size:18px;"><span style="font-family:Arial;font-size:18px;"><span style="font-size:18px;"><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>JavaMaven</groupId>
<artifactId>maven-entity</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>maven-entity</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.web-jar</groupId>
<artifactId>hibernate-jpa</artifactId>
<version>2.0-api-1.0.1.Final</version>
</dependency>
<dependency>
<groupId>com.web-jar</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.2.1.Final</version>
</dependency>
<dependency>
<groupId>com.web-jar</groupId>
<artifactId>hibernate-commons-annotations</artifactId>
<version>4.0.1.Final</version>
</dependency>
<dependency>
<groupId>com.web-jar</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
</dependency>
</dependencies>
</project>
</span></span></span>
3、maven-common 模块依赖于 maven-entity 模块:
1)maven-entity 利用 install 打成jar包放入本地仓库:右击 run as--> maven build ,输入 clean install即可。
2)编写maven-common 的pom文件:
<span style="font-family:Arial;font-size:18px;"><span style="font-family:Arial;font-size:18px;"><span style="font-size:18px;"><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>JavaMaven</groupId>
<artifactId>maven-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>maven-common</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- Maven内置变量说明 ${project.xxx} 当前pom文件的任意节点的内容-->
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>maven-entity</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>
</span></span></span>
3)这时,entity依赖的hibernate 和 log4j的包,也会被comon所依赖,但是junit4却不会被common依赖:
4)这样,就完成了模块的依赖,可以在 common 中使用 entity ,如:
package com.maven.common;
import com.maven.entity.PersonEntity;
public class CommonTest {
public static void main(String[] args) {
PersonEntity tPersonEntity = new PersonEntity();//可以使用entity
}
}
(二)、scope 属性:
1、compile:缺省值,适用于所有阶段,会随着项目一起发布。(编译、打包都会加入)
2、provided:编译测试会加入此包,打包的时候不会加入。如 servlet.jar,一般指定为provided。
3、runtime:编译就不依赖,只在运行时使用,如JDBC驱动,数据库等适用运行和测试阶段。
4、test:只在测试时使用,在编译和打包时都不会使用这个依赖。
5、system:类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。
(三)依赖的传递
1、maven-common 依赖于 maven-entity ,那么maven-entity 所依赖的 hibernate 和 log4j包会传递依赖给 maven-common 。
2、传递的范围:只有scope 等于 compile的依赖才会被传递:如上,给loj4j 添加 <scope>test</scope>
<dependency>
<groupId>com.web-jar</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
<scope>test</scope>
</dependency>
这样,log4j就不会传递依赖了。
(四)间接依赖
1、案例1:同级别
1)A模块依赖于M模块1.0版本(A-->M1.0),B-->M2.0;C-->A、B,那么C会依赖于M的哪个版本?
2)A、B对于M为直接依赖,C对于M为间接依赖。C对于M的依赖决定于C依赖的A、B在Pom文件中依赖的前后顺序,谁在前,就会间接依赖谁依赖的M版本。如A在前,则C依赖M的1.0版本,反之为M2,0版本。
2、案例2:非同级别
1)A-->G-->Z1.0;B-->Z2.0,C-->A、B并且,在C模块的pom文件中,A在B之前,那么C依赖于Z的哪个版本?
2)依赖 Z2.0 。这时的Z模块对于A都是间接依赖,但是 Z2.0 在间接的路径上较短,所以会依赖于 Z2.0 。
(五)限制依赖:<exclusions><exclusion>
1、如想限制Z2.0,就想依赖Z1.0,就可以在C 的pom文件中,B模块的依赖中排除 Z2,0:
<!--排除依赖-->
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>B</artifactId>
<version>${project.version}</version>
<exclusions>
<exclusion>
<groupId>Z</groupId>
<artifactId>Z</artifactId><!--不需要使用版本,因为在B模块中只有一个版本的Z-->
</exclusion>
</exclusions>
</dependency>
四、聚合和继承
(一)聚合:
1、一个项目如果有多个模块,需要对每个模块进行编译等工作,为了统一管理所有的模块,使用聚合。
2、1)新建一个项目,勾选 create a simple project,不使用maven的 archetype 。
2)选择 packaging 为 pom
3)在maven-parent 模块的pom(超级Pom)文件中,使用 modules 关键字
<!-- 聚合是模块的位置 -->
<modules>
<module>../maven-common</module>
<module>../maven-entity</module>
</modules>
4)pom文件是在 maven-parent 模块中,如果把 pom 文件放在模块外,则可以去掉校对位置的标识。
5)聚合后,编译等工作只需要操作 maven-parent 模块即可。
(二)继承:<parent>
1、如果 maven-common 依赖hibernate,maven-entity也依赖hibernate,就需要分别在两个模块的pom文件中分别依赖于两个包,在实际项目中这种相同依赖的包会很多,那么需要引入继承的概念。
2、在 maven-parent 模块的pom文件中,加入hibernate 的依赖:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.web-jar</groupId>
<artifactId>hibernate-jpa</artifactId>
<version>2.0-api-1.0.1.Final</version>
</dependency>
<dependency>
<groupId>com.web-jar</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.2.1.Final</version>
</dependency>
<dependency>
<groupId>com.web-jar</groupId>
<artifactId>hibernate-commons-annotations</artifactId>
<version>4.0.1.Final</version>
</dependency>
<dependency>
<groupId>com.web-jar</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
<scope>test</scope>
</dependency>
</dependencies>
3、分别在maven-common 和 maven-entity 两个模块中,只要继承 maven-parent 模块就可以是实现 hibernate的依赖:
<parent>
<groupId>JavaMaven</groupId>
<artifactId>maven-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../maven-parent/pom.xml</relativePath>
</parent>