1.自动创建目录骨架
- 利用archetype插件,用于创建符合maven规定的目录骨架(目录见4)
2.常用的构建命令介绍
利用archetype自动创建目录骨架
构建普通项目:
mvn archetype:generate -DgroupId=com.imooc.maven03 - DartifactId=maven03-service -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
- com.imooc.maven03:groupId(包内容)【即组织名,公司网址的反写+项目名】
- maven03-service:artifactId(项目名-模块名)
构建Web项目:
mvn archetype:generate -DgroupId=project-packaging -DartifactId=project-name -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
3.maven中的坐标和仓库
- 坐标
- 构件:构件通过坐标作为其唯一的标识
- 仓库(管理项目的依赖)
- 本地仓库
- 远程仓库(全球中央仓库【存放大量的jar】)——地址设置在maven安装包
/lib/maven-model-builder-3.5.4.jar中org/apache/maven/model/pom.xml
的<repopsitories>
下的<url>
中
- 镜像仓库
- 国内镜像仓库设置地址:maven包
/conf/settings.xml
下的<mirrors>
中的<mirror>
(<mirrorof>
需要时central,即中央仓库的id)
- 国内镜像仓库设置地址:maven包
- 更改本地仓库的位置
- 依旧修改settings.xml文件,中的
<localRepository>
设置了对应的本地仓库的地址
- 依旧修改settings.xml文件,中的
4.eclipse安装maven插件以及创建maven项目
- 在preferences中存在Maven选项
- 创建maven项目:
- new -> maven project 选择对应的插件创建不同骨架的项目
- 运行运行maven项目:
- 项目右击 -> run as -> maven build -> 在Goals中书写对应命令 -> Run
5.maven生命周期和插件
完整项目的构建过程包括:
清理、编译、测试、打包、集成测试、验证、部署
maven生命周期(对于生命周期的阶段而言,执行某个阶段默认之前之前的阶段内容):
clean 清理项目
- pre-clean 执行清理前的工作
- clean清理上一次构建生成的所有文件
- post-clean执行清理后的文件
default 构建项目【核心】
compile、test、package、install
site 生成项目的站点(根据pom生成相应站点)
- pre-site在生成项目站点前要完成的工作
- site生成项目的站点文档
- post-site在生成项目站点后要完成的工作
- site-deploy发布生成的站点到服务器上
添加插件
加入source插件
指定source插件坐标
绑定其他阶段
利用
<executions>
中绑定并设置goal目标(goal是根据插件不同,有不同的goal)
<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>com.imooc.hi</groupId> <artifactId>himaven-project</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>himaven-project</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> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>jar-no-fork</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
6.pom.xml常用元素介绍
pom.xml
pom是maven项目的管理文件,用于项目描述、组织管理、依赖管理和构建信息的管理
<project>
是pom的根元素,包含pom约束信息<modelVersion>
指定当前pom的版本坐标信息
<groupId>
主项目标识,用定义当前maven属于哪个实际的项目,即为项目创建的包<artifactId>
模块标识,通常以项目名+模块名标识<version>
当前项目的版本号 大版本号.分支版本号.小版本号<packaging>
打包的类型,默认为jar,还可以是war/zip/pom<name>
项目描述名<url>
项目地址<description>
项目描述<developers>
开发人员列表<license>
许可证信息<organization>
组织信息
<dependencies>
依赖列表<dependency>
依赖项
<groupId>
<artifactId>
<version>
<type>
<scope>
表示依赖范围,值为test表示jar只在测试范围内有用,如在主代码中引入该类则会报错<optional>
设置依赖是否可选,true和false(默认)<exclusions>
排除依赖传递的列表<exclusion>
设置排除的依赖
<dependencyManagement>
依赖的管理(定义在父模块中)<dependencies>
依赖列表
<build>
为构建的行为提供相应的支持<plugins>
插件列表
<plugin>
插件<groupId>
<artifactId>
<version>
<parent>
用于在子模块中关于父模块pom的继承<modules>
用来聚合运行多个的maven项目,可以一起编译<module>
7.依赖范围
- 我们开发时需要用到的jar包就要引入到该项目的classpath路径中,此时就可以使用该框架。
- maven中提供的三种classpath
- 编译
- 测试
- 运行
<scope>
的值就是控制依赖与classpath的关系<scope>
属性
- compile 默认的范围,对编译测试运行都有效
- provided 在测试和编译时有效
- runtime 在测试和运行时有效
- test 只在测试范围有效
- system 在编译和测试时有效,与本机系统相关联,可移植性差
- import 导入的范围,它只使用在dependencyManagement中,表示从其他的pom中导入dependency的配置
8.依赖传递
依赖具有传递性
当B依赖A,C依赖B时,如果对C进行compile,将导入A和B的jar包
排除依赖传递
利用在C中添加
<exclusions>
–><exclusion>
–> A的groupId和artifactId则在C中自动去除A的依赖
//pom.xml (A) <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>com.project1</groupId> <artifactId>project1</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>project1</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> </dependencies> </project> //pom.xml (B) <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>com.project2</groupId> <artifactId>project2</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>project2</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> <dependency> <groupId>com.project1</groupId> <artifactId>project1</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> </project> //pom.xml (C) <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>com.project3</groupId> <artifactId>project3</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>project3</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> <dependency> <groupId>com.project2</groupId> <artifactId>project2</artifactId> <version>0.0.1-SNAPSHOT</version> <exclusions> <exclusion> <groupId>com.project1</groupId> <artifactId>project1</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </project>
9.maven项目的jre版本
- 默认是1.5版本
- 可以右击properties修改或是在settings.xml文件中添加
<profile>
进行修改
10.依赖冲突原则
短路优先
A 依赖 B ,B 依赖 C ,C依赖X(jar)
A 依赖 D ,D依赖 X(jar)
则A 依赖的是 D 依赖的X的版本
//pom.xml A <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>com.project1</groupId> <artifactId>project1</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>project1</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> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> </dependencies> </project> //pom.xml B <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>com.project2</groupId> <artifactId>project2</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>project2</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> <dependency> <groupId>com.project1</groupId> <artifactId>project1</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.0</version> </dependency> </dependencies> </project> //pom.xml C <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>com.project3</groupId> <artifactId>project3</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>project3</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> <dependency> <groupId>com.project2</groupId> <artifactId>project2</artifactId> <version>0.0.1-SNAPSHOT</version> <exclusions> <exclusion> <groupId>com.project1</groupId> <artifactId>project1</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </project> 则最终C依赖的是B的common-io的版本,因为B离C近
先声明先优先
如果路径长度相同,则谁先声明,先解析谁(即在dependency中谁定义在前面就以谁的版本为准)
//pom.xml A <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>com.project1</groupId> <artifactId>project1</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>project1</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> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> </dependencies> </project> //pom.xml B <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>com.project2</groupId> <artifactId>project2</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>project2</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> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.0</version> </dependency> </dependencies> </project> //pom.xml C <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>com.project3</groupId> <artifactId>project3</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>project3</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> <dependency> <groupId>com.project1</groupId> <artifactId>project1</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>com.project2</groupId> <artifactId>project2</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> </project> 由于C中同时引用A和B,A和B中都引用common-io(但版本不同),又由于在C的pom.xml中,A在B的声明前,故以A引入的common-io版本加入到C中
11.聚合和继承
聚合:即将模块统一打包安装到本地仓库中
//project_aggreation.xml <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>com.projectaggreation</groupId> <artifactId>project_aggreation</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <name>project_aggreation</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> </dependencies> <modules> <module>../project1</module> <module>../project2</module> <module>../project3</module> </modules> </project> 运行mvn install 可以看到三次构建,分别将三个模块打包成jar安装到本地仓库中(注意packaging的值为pom,modules为打包安装的模块)
继承:子pom继承父pom中的依赖信息
//project_parent pom.xml <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>com.projectparent</groupId> <artifactId>project_parent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <name>project_parent</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <junit-version>3.8.1</junit-version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit-version}</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement> </project> //project3 pom.xml <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>com.project3</groupId> <artifactId>project3</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>project3</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <parent> <groupId>com.projectparent</groupId> <artifactId>project_parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>com.project1</groupId> <artifactId>project1</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>com.project2</groupId> <artifactId>project2</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> </project> 利用parent标签进行继承,指定父pom的坐标,并指定需要的依赖坐标版本即会按照父pom的版本进行安装。 xml中使用properties可以指定属性,并利用${自定义标签名}进行取值