maven 项目的核心就是 pom.xml
maven的主要命令:
- mvn clean compile
- mvn clean test
- mvn clean package
- mvn clean install
这里主要是在eclipse中使用maven,因此只使用到了一部分命令,整理下来方便以后查阅。
生成清除Eclipse项目结构:
mvn eclipse:eclipse
mvn eclipse:clean
清理(删除target目录下编译内容)
mvn clean
仅打包Web页面文件
mvn war:exploded
编译项目
mvn compile
打包发布
mvn package
打包时跳过测试
mvn package -Dmaven.test.skip=ture
创建一个简单的Java工程:
mvn archetype:create -DgroupId=com.mycompany.example -DartifactId=Example
创 建一个java的web工程:
mvn archetype:create -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=com.mycompany.app -DartifactId=my-webapp
打包:mvn package
编译:mvn compile
编译测试程序:mvn test-compile
清空:mvn clean
运行测试:mvn test
生成站点目录: mvn site
生成站点目录并发布:mvn site-deploy
安装当前工程的输出文件到本地仓库: mvn install
安 装指定文件到本地仓库:
mvn install:install-file -DgroupId=<groupId> -DartifactId=<artifactId> -Dversion=1.0.0 -Dpackaging=jar -Dfile=<myfile.jar>
查看实际pom信息: mvn help:effective-pom
分析项目的依赖信息:mvn dependency:analyze 或 mvn dependency:tree
跳过测试运行maven任务: mvn -Dmaven.test.skip=true XXX
生成eclipse项目文件: mvn eclipse:eclipse
查看帮助信息:mvn help:help
或 mvn help:help -Ddetail=true
查看插件的帮助信息:mvn <plug-in>:help
,比如:mvn dependency:help 或 mvn ant:help 等等。
执行test 之前会先执行compile的,执行package之前是会先执行test的,而类似的,instal之前会执行package。
maven 坐标和依赖
maven的一大功能就是管理项目依赖。为了能自动化地解析任何一个Java构件,maven就必须将它们进行唯一化标识(ps:就像我们数据库中表的唯一主键一样),这就依赖管理的底层基础——坐标。
maven 的坐标的元素包括:
- groupId
- artifactId
- version
- packaging
- classifier
<dependency>
<groupId>org.sonatype.nexus/</groupId>
<artifactId>nexus-indexer</artifactId>
<version>2.0.0</version>
<packaging>jar</packaging>
</dependency>
这是nexus-idexer的坐标定义。
groupId : 定义当前Maven项目所属的实际项目。(ps : Maven 项目和实际项目不一定是一对一的关系)。
artifactId : 定义实际项目中的一个Maven项目(模块),默认情况下Maven生存的构建,其文件名会以artifactId做为开头。
version : 定义Maven项目当前所处的版本。
packaging : 定义maven项目的打包方式。打包方式通常与所生存的构建的文件扩展名对应。打包方式会影响到构建的生命周期,比如 jar 包和 war 打包会使用不同的命令。不定义packaging的时候,maven 会使用默认值 jar。
classifier : 该元素用来帮助构建输出的一些附属构件。
groupId、artifactId、version 是必须定义的,packaging 是可选的(默认为 jar),而classifier 是不能直接定义的。
依赖的配置
- groupId、artifactId 和 version: 依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,maven根据基本坐标才能找到需要的依赖。
- type: 依赖的类型,对应于项目坐标定义的packaging。大部分情况下,该元素不必声明,默认值为 jar。
- scope : 依赖范围。maven在编译项目主代码的时候需要使用一套classpath。maven 在编译和执行厕所的时候会使用另一套classpath。maven 在实际运行的时候,又会使用一套classpath。
- * optional:标记依赖是否可选。*
- * exclusions : 用来排除传递依赖。*
依赖范围
- complie : 编译依赖范围。没有指定,就会默认是哦那个该依赖范围。使用这个
- test : 测试依赖范围。只对测试 classpath 有效。
- provided : 已提供依赖范围。对于编译和测试 classpath 有效,但在运行时无效。
- runtime : 运行时有效依赖。对于测试和运行 classpath 有效,但在便于主代码时无效。
- system : 系统依赖范围。该依赖与三种 classspath 的关系,和provided 依赖范围完全一致。(使用system 范围的依赖时必须通过 systemPath 元素显示的指定依赖文件的路径。此类依赖不通过Maven 仓库解析的,而是于本机系统绑定,可能造成构建不可移植)
依赖范围(scope) | 对于编译 classpath 有效 | 对于测试 classpath 有效 | 对于运行时 classpath 有效 |
---|---|---|---|
compile | Y | Y | Y |
test | - | Y | - |
provided | Y | Y | _ |
runtime | - | Y | Y |
system | - | Y | - |
传递性依赖和依赖范围
依赖范围不仅可以控制依赖与三种 classpath 的关系,还对传递性依赖产生影响。
. | comile | test | provided | runtime |
---|---|---|---|---|
compile | comile | - | - | runtime |
test | test | - | - | test |
provided | provided | - | provided | provided |
runtime | ruiment | - | - | runtime |
依赖调解
例子:
A -> B -> C - > X(1.0)
A -> D -> X(2.0)
Maven 依赖调解的第一原则是:路径最近者优先。
第二原则是:第一声明者优先。
可选依赖
例子:
A -> B
B -> X(可选)
B ->Y(可选)
根据传递性依赖的定义,如果所有这三个依赖的范围都是compile,那么X、Y就是 A 的 compile 范围传递性依赖。然而,由于这里 X,Y 是可选依赖,依赖将不会得以传递。
##可选依赖配置
<project>
...
<dependencies>
<!-- declare the dependency to be set as optional -->
<dependency>
<groupId>sample.ProjectA</groupId>
<artifactId>Project-A</artifactId>
<version>1.0</version>
<optional>true</optional> <!-- value will be true or false only -->
</dependency>
</dependencies>
</project>
## 不可选依赖配置
<project>
...
<dependencies>
<!-- declare the dependency to be set as optional -->
<dependency>
<groupId>sample.ProjectA</groupId>
<artifactId>Project-A</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</project>
排除依赖
代码中使用 exclusions 元素声明排除依赖,exclusions 可以包含一个或者多个 exclusion 子元素,因此可以排除一个或者多个传递性依赖。
声明 exclusion 的时候只需要 groupId 和 artifactId,而不需要 version 元素。
归类依赖
使用 properties 元素。
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.company</groupId>
<artifactId>lol</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>LOL</name>
<properties>
<framework.version>3.2.3.RELEASE</framework.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${framework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${framework.version}</version>
</dependency>
...
</dependencies>
...
</project>
优化依赖
查看已解析的依赖: mvn dependency : list
查看当前项目的依赖树: mvn dependency : tree
生命周期
maven 的生命周期就是为了对所有的构建过程进行抽象和统一。
项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有构建步骤。
三套生命周期
- clean :生命周期的目的是清理项目。
- default :生命周期的目的是构建项目。
- site :生命周期的目的是建立项目站点。
clear 生命周期
-
目的:清理项目。
- pre-clean 执行一些清理前需要完成的工作。
- clean 清理上一次构建生成的文件。
- post-clean 执行一些清理后需要完成的工作。
default 生命周期
-
目的:定义真正构建时所需要执行的所有步骤。是最核心的部分。
- validate
- initialize
- generate-sources
- process-sources 处理项目主资源文件。对src/main/resources 目录的内容进行变量替换等工作后,复制到项目输出的主 classpath 目录中。
- generate-resources
- process-resources
- compile 编译项目的主源码。 java 文件至项目输出的主 classpath 目录中。
- process-classes
- generate-test-sources
- process-test-sources 处理项目测试资源文件。 对 src/test/resources 目录的内容进行变量替换等工作后,复制到项目输出的测试 classpath 目录中。
- generate-test-resources
- process-test-resources
- test-compile 编译项目的测试代码, src/test/java 目录下的 Java 文件至项目输出的测试 classpath 目录中。
- process-test-classes
- test 使用单元测试框架运行测试,测试代码不会被打包或部署。
- prepare-package
- package 接受便于好的代码,打包成可发布的格式,如 jar。
- pre-integration-test
- integration-test
- post-integration-test
- verify
- install 将包安装到 Maven 本地仓库,供本地其他 Maven 项目使用。
- deploy 讲最终的包复制到远程仓库,供其他开发人员和 Maven 项目使用。
site 生命周期
-
目的:建立和发布项目站点。
- pre-site 执行一些在生成项目站点之前需要完成的工作。
- site 生成项目站点文档。
- post-site 执行一些在生成项目站点之后需要完成的工作。
- site-deploy 将生成的项目站点发布到服务器上。
命令行执行
- $mvn clean: 调用clean 生命周期的 clean 阶段。实际执行的阶段为 clean 生命周期的 pre-clean 和 clean 阶段。
- $mvn test:调用default生命周期的 test 阶段。实际执行的阶段为default生命周期的validate到test的所有阶段。
- $mvn clean install:调用clean生命周期的clean阶段和default生命周期的install阶段。实际执行的是clean生命周期的pre-clean、clean阶段和default生命周期的validate到install的所有阶段。该命令结合了两个生命周期,是执行真正项目构建之前清理项目的一个很好的实践。
- $mvn clean deploy site-deploy:调用了clean生命周期的clean阶段和default生命周期的deploy阶段,以及site生命周期的site-deploy阶段。实际执行的是clean生命周期的pre-clean、clean阶段和default生命周期的所有阶段,以及site生命周期的所有阶段。
Maven的插件
Maven的生命周期与插件相互绑定,用以完成实际的构建任务。具体而言是生命周期的阶段与插件的目标相互绑定,以完成某个具体的构建任务。
内置绑定
Maven在核心为一些主要的生命周期阶段绑定了很多插件的目标
clean生命周期阶段与插件目标的绑定关系
生命周期阶段 | 插件目标 |
---|---|
pre-clean | |
clean | maven-clean-plugin:clean |
post-clean |
site生命周期阶段与插件目标的绑定关系
生命周期阶段 | 插件目标 |
---|---|
pre-site | |
site | maven-site-plugin:site |
post-site | |
site-deploy | maven-site-plugin:deploy |
default生命周期与内置插件绑定关系及具体任务(打包类型: jar)
生命周期阶段 | 插件目标 | 执行任务 |
---|---|---|
process-resources | maven-resources-plugin:resources | 复制主资源文件至主输出目录 |
compile | maven-compile-plugin:compile | 编译主代码至主输出目录 |
process-test-resources | maven-resources-plugin:testRresources | 复制测试资源文件至测试输出目录 |
test-compile | maven-compiler-plugin:testCompile | 编译测试代码至测试输出目录 |
test | maven-surefire-plugin:test | 执行测试用例 |
package | maven-jar-plugin:jar | 创建项目jar包 |
install | maven-install-plugin:install | 将项目输出构件安装到本地仓库 |
deploy | maven-deploy-plugin:deploy | 将项目输出构件部署到远程仓库 |
仓库
对于 SNAPSHOT 快照 ,生效时间的第二天。