Maven基础
Maven
What is Maven
Maven是一个项目管理工具,它包含了一个项目对象模型 ,一组标准集合,一个项目生命周期,一个依赖管理系统,和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑
Maven可以管理:
- 构建
- 文档
- 报告
- 依赖
- SCMs
- 发布
- 分发
思想:约定优先于配置,例如Maven的项目有默认的项目结构,默认在特定的位置查找文件。还有Maven的父pom包含一系列默认设置。
项目创建
mvn archetype:generate单元测试
mvn test // 编译并运行测试
mvn test-compile // 仅编译打包Jar与安装
mvn package // 打包jar
mvn install // 将jar包安装到本地仓库
mvn site 创建html
mvn clean 清理 targetMaven 插件与目标
Maven 本身的功能不多。大部分的功能由插件提供。一个插件包含多个目标。 每个目标是单独的任务,每个任务可以单独执行,也可以在流程中调用
mvn plugin:goalMaven的生命周期
生命周期:项目构建中的一系列阶段的序列。 每个目标有对应的阶段,被绑定的目标随阶段而运行
项目坐标 Coordinate
是在仓库中定位使用某个特定项目的关键,可以唯一标识该项目,包含:
- groupId 通常是组织名称的逆向域名
- artifactId groupId下单独项目的唯一标识
- version 项目的特定版本
- packaging 项目打包后输出的类型,jar 或是 war
依赖
Maven 支持传递性依赖:例如A依赖B,B又依赖C。引用A时会自动下载A、B、C。 体现了Maven仓库不仅存储了二进制,也存储了元数据(pom.xml)
依赖范围
- compile(编译范围)
compile是默认的范围;如果没有提供一个范围,那该依赖的范围就是编译范 围。编译范围依赖在所有的classpath中可用,同时它们也会被打包。
- provided(已提供范围)
provided依赖只有在当JDK或者一个容器已提供该依赖之后才使用。例如,如果 你开发了一个web应用,你可能在编译classpath中需要可用的Servlet API来编 译一个servlet,但是你不会想要在打包好的WAR中包含这个Servlet API;这个 Servlet API JAR由你的应用服务器或者servlet容器提供。已提供范围的依赖在 编译classpath(不是运行时)可用。它们不是传递性的,也不会被打包。
- runtime(运行时范围)
runtime依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如,你 可能在编译的时候只需要JDBC API JAR,而只有在运行的时候才需要JDBC驱动实 现。
- test(测试范围)
test范围依赖,一般编译和运行时都不需要,它们只有在测试编译和测试阶段可用。
- system(系统范围)
system范围依赖与provided类似,但是你必须显式的提供一个对于本地系统中 JAR文件的路径。这么做是为了允许基于本地对象编译,而这些对象是系统类库 的一部分。这样的构件应该是一直可用的,Maven也不会在仓库中去寻找它。如 果你将一个依赖范围设置成系统范围,你必须同时提供一个systemPath元素。注 意该范围是不推荐使用的(你应该一直尽量去从公共或定制的Maven仓库中引用 依赖)。
冲突解决
案例,排除并替换一个传递性依赖。 用于替换某个依赖内的实现
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.2.5.ga</version>
<exclusions>
<exclusion>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-jta_1.1_spec</artifactId>
<version>1.1</version>
</dependency>
</dependencies>统一管理版本
在顶层dependencyManagement上添加依赖,在子项目中就不必显式指定版本。
多模块项目关系
案例 目录结构如下的项目,相互关联
top-group/pom.xml
top-group/sub-group/pom.xml
top-group/sub-group/project-a/pom.xml
top-group/sub-group/project-b/pom.xml
top-group/project-c/pom.xml可以在top-group的pom.xml上添加子模块,同理,子模块下若还有项目,也要在子模块的pom.xml上添加。Maven将会自动在子模块目录里寻找pom.xml。
<project>
<groupId>org.sonatype.mavenbook</groupId>
<artifactId>top-group</artifactId>
...
<modules>
<module>sub-group</module>
<module>project-c</module>
</modules>
...
</project>如何检查依赖冲突?
mvn dependency:tree -Dverbose | grep conflict版本升级
使用以下插件
<groupId>org.codehaus.mojo</groupId>
<artifactId>versions-maven-plugin</artifactId>
<version>2.7</version>模块版本升级
执行更改版本,此时Maven会修改pom.xml中的版本,同时创建*.versionsBackup备份
mvn versions:set -DnewVersion=1.0.2-SNAPSHOT执行mvn versions:commit提交版本更改 执行mvn versions:revert恢复修改
Jar包的版本升级
可使用 mvn versions:display-dependency-updates查询
plugin的版本升级
可使用 mvn versions:display-plugin-updates 查询