文章目录

  • 1 使用 maven 创建一个 project
    • 1.1 下载安装 maven
    • 1.2 创建 project
    • 1.3 构建 project 生成 jar 包
  • 2 Maven 生命周期及常见命令
    • 2.1 maven 生命周期
    • 2.2 其它命令
  • 3 父子项目管理
    • 3.1 Super POM
    • 3.2 Minimal POM
    • 3.3 项目继承的内容
    • 3.4 项目继承几种示例 —— parent
      • 3.4.1 示例1
      • 3.4.2 示例2
    • 3.5 项目汇总几种示例 —— module
      • 3.5.1 示例1
      • 3.5.2 示例2
  • 4 Maven 依赖管理
    • 4.1 依赖传递机制
    • 4.2 *Dependency scope*
    • 4.3 *Dependency Management*
      • 4.3.1 示例1 —— 依赖版本选择
      • 4.3.2 示例 2 —— BOM
        • 4.3.2.1 BOM 项目
        • 4.3.2.2 正常的父项目
        • 4.3.2.3 其它子项目引入 bom
    • 4.4 system scope
  • 5 profiles 解析
    • 5.1 profile 级别
    • 5.2 profile 激活方式
    • 5.3 profile 中可以定义的内容
      • 5.3.1 在外部文件中
      • 5.3.2 在本项目的 pom 中
    • 5.4 显示激活的 profile
  • 6 Settings 节点解析
  • 7 pom 节点解析

1 使用 maven 创建一个 project

1.1 下载安装 maven

  • maven 是一个 java 工具,使用它必须 下载安装 Java 环境

  • 去 maven 官网 下载安装 maven,安装配置参考官方文档

  • 运行以下命令查看安装的 maven 信息

mvn -v

1.2 创建 project

  • 使用以下命令创建一个 project,创建命令的目录下不要有 pom.xml 文件
# 注:不换行
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
# 以上命令会在当前目录下创建一个项目,项目结构如下
my-app
|-- pom.xml
`-- src|-- main|   `-- java|       `-- com|           `-- mycompany|               `-- app|                   `-- App.java`-- test`-- java`-- com`-- mycompany`-- app`-- AppTest.java

1.3 构建 project 生成 jar 包

#进入项目根目录(cd my-app),使用以下命令进行构建生成 jar 包
mvn package
# jar 包在 my-app/target/ 目录下,使用以下命令运行 jar 包,会打印出 hello world
java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App

2 Maven 生命周期及常见命令

2.1 maven 生命周期

  • validate: 验证项目是否正确

  • compile: 编译项目的源代码

  • test: 使用合适的单元测试框架测试编译的源代码。这些测试不应该要求代码被打包或部署

  • package: 打包项目,生成 jar 包 或 war 包

  • verify: 运行所有检查,检测 package 是否有效

  • install: 将项目打成 maven 放入本地 maven 仓库

  • deploy: 将项目发布到远程 maven 仓库

  • clean: 清空 target 目录

  • site: 生成项目文档,运行 mvn site 命令会在 target/site/目录下生成文件

  • 注: maven 命令可顺序执行,如下

mvn clean dependency:copy-dependencies package
  • 注: test 命令默认执行以下类型类 **/*Test.java **/Test*.java **/*TestCase.java。默认不执行以下类型 **/Abstract*Test.java **/Abstract*TestCase.java

2.2 其它命令

  • 官方文档命令总结
mvn test-compile #编译测试源码-D 指定参数,如 -Dmaven.test.skip=true 跳过单元测试;
-P 指定 Profile 配置,用逗号隔开,可以用于区分环境;
-e 显示maven运行出错的信息;
-o 离线执行命令,即不去远程仓库更新包;
-X 显示maven允许的debug信息;
-U 强制去远程更新snapshot的插件或依赖,默认每天只更新一次;
-f 强制指定 pom 文件
-l 指定构建日志路径
-X 输出 debug 日志
-s 指定 settings 文件
-N 不去递归执行子模块

3 父子项目管理

3.1 Super POM

  • Super POM 是 Maven 默认的 POM,如果项目没有显示继承某个 pom,则此项目继承 Super POM

3.2 Minimal POM

  • 一个 pom 最小需要元素为:project root modelVersion groupId artifactId version

3.3 项目继承的内容

  • dependencies
  • developers and contributors
  • plugin lists (including reports)
  • plugin executions with matching ids
  • plugin configuration
  • resources(资源配置属性)

3.4 项目继承几种示例 —— parent

  • 项目继承是在子模块中指定父项目
  • 当你拥有多个 maven 项目,且他们又共同的配置,就可以将公共配置重构成它们的父项目,并继承这个父项目

3.4.1 示例1

.|-- my-module|   `-- pom.xml`-- pom.xml<!--对应的子pom-->
<project><parent><groupId>com.mycompany.app</groupId><artifactId>my-app</artifactId><version>1</version></parent><!--可以继承父pom的version和groupId--><modelVersion>4.0.0</modelVersion><artifactId>my-module</artifactId>
</project>

3.4.2 示例2

.|-- my-module|   `-- pom.xml`-- parent`-- pom.xml
<!--对应的子pom-->
<project><parent><groupId>com.mycompany.app</groupId><artifactId>my-app</artifactId><version>1</version><!--使用此元素指定父pom的位置--><relativePath>../parent/pom.xml</relativePath></parent><modelVersion>4.0.0</modelVersion><artifactId>my-module</artifactId>
</project>

3.5 项目汇总几种示例 —— module

  • 项目汇总是在父项目中指定子模块

  • 父模块必须是 pom

  • 调用父项目的命令时,会触发子项目的相同命令

  • 当你拥有的几个项目需要同时构建运行时,你可以创建一个父项目,并在父项目中指定子项目

3.5.1 示例1

.|-- my-module|   `-- pom.xml`-- pom.xml
<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>

3.5.2 示例2

.|-- my-module|   `-- pom.xml`-- parent`-- pom.xml
<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>

4 Maven 依赖管理

4.1 依赖传递机制

  • 依赖多版本处理(Dependency mediation):当项目遇到多个版本的依赖时,maven 会选取依赖树中最浅层次的版本。如果版本在同一层次,取先声明的
  • 依赖版本管理(Dependency management):通过 dependencyManagement,可同一管理依赖版本
  • 依赖作用域(Dependency scope):可为每个依赖设置特定的生命周期(生效时期)
  • 依赖排除(Excluded dependencies):通过 exclusion 元素排除依赖
  • 依赖传递可选(Optional dependencies):使用 optional 元素可使得 A->(optional)B C->A 的情形下,C 不会继承 B
  • 注: 虽然依赖传递可以使你从依赖的项目中得到其它依赖,但是仍然建议在本项目中显示的依赖其它依赖
  • 注: excluded 与 optional 官方文档

4.2 Dependency scope

  • 依赖作用域用于限制依赖传递,并且会影响项目的各个 maven 任务的执行
  • 共有 6 个 scope
    • complie:依赖被传递,(默认)
    • provided:提示需要 JDK 或容器(tomcat)在运行时提供此依赖。被此 scope 修饰的依赖,只在编译和测试时有效,依赖不被传递
    • runtime:此依赖只在运行或测试时有效,不参与编译,依赖被传递
    • test:此依赖只在测试的编译和运行期时有效,依赖不被传递
    • system:见 5.4
    • import:此 scope 只用于 packaging 为 pom 的 dependencyManagement 节点下,用于伪实现 多父项目继承(maven 只支持单父项目)
  • 以下表格,左边列表是当前项目的依赖,上面行是当前依赖所依赖的依赖
compile provided runtime test
compile compile - runtime -
provided provided - provided -
runtime runtime - runtime -
test test - test -
  • 有上表可以得出以下结论

    • 被传递的依赖如果是 complie 类型,它会随着本项目的依赖的 scope 而相应变化(取最小作用域的那个 scope)
    • provided、test 不会被传递
    • 被传递的依赖如果是 runtime 类型,会综合本项目依赖的 scope 取最小作用域的那个 scope

4.3 Dependency Management

  • 依赖项管理是一种集中依赖项信息的机制
  • 如果有很多项目继承与一个共同的父项目,可以将所有依赖信息放入父 pom,并且在子 pom 中简单的引用父 pom
  • dependencyManagement 中的依赖优先于 依赖就近原则

4.3.1 示例1 —— 依赖版本选择

  • Project A
<project><modelVersion>4.0.0</modelVersion><groupId>maven</groupId><artifactId>A</artifactId><packaging>pom</packaging><name>A</name><version>1.0</version><dependencyManagement><dependencies><dependency><groupId>test</groupId><artifactId>a</artifactId><version>1.2</version></dependency><dependency><groupId>test</groupId><artifactId>b</artifactId><version>1.0</version><scope>compile</scope></dependency><dependency><groupId>test</groupId><artifactId>c</artifactId><version>1.0</version><scope>compile</scope></dependency><dependency><groupId>test</groupId><artifactId>d</artifactId><version>1.2</version></dependency></dependencies></dependencyManagement>
</project>
  • Project B
<project><parent><artifactId>A</artifactId><groupId>maven</groupId><version>1.0</version></parent><modelVersion>4.0.0</modelVersion><groupId>maven</groupId><artifactId>B</artifactId><packaging>pom</packaging><name>B</name><version>1.0</version><dependencyManagement><dependencies><dependency><groupId>test</groupId><artifactId>d</artifactId><version>1.0</version></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>test</groupId><artifactId>a</artifactId><version>1.0</version><scope>runtime</scope></dependency><dependency><groupId>test</groupId><artifactId>c</artifactId><scope>runtime</scope></dependency></dependencies>
</project>
  • b 为 1.0:b 在其父模块中的 management 中定义了,并且 management 优先于就近原则(即使 a、c 中依赖了 b,也不会被使用)

  • d 为 1.0:d 在本项目中定义了,并且本项目定义优先于父项目定义

  • dependencyManagement 中可用的 element、tag

4.3.2 示例 2 —— BOM

  • 根项目为 BOM pom 项目,通过它统一指定需要被创建的子项目的版本,构成了一个统一版本库
  • 其它项目使用这个统一版本库时,通过在 dependencyManagement 中 import 此 BOM
4.3.2.1 BOM 项目
  • 它定义了一个项目库
<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.test</groupId><artifactId>bom</artifactId><version>1.0.0</version><packaging>pom</packaging><properties><project1Version>1.0.0</project1Version><project2Version>1.0.0</project2Version></properties><dependencyManagement><dependencies><dependency><groupId>com.test</groupId><artifactId>project1</artifactId><version>${project1Version}</version></dependency><dependency><groupId>com.test</groupId><artifactId>project2</artifactId><version>${project1Version}</version></dependency></dependencies></dependencyManagement><modules><module>parent</module></modules>
</project>
4.3.2.2 正常的父项目
  • 此项目为其他项目的父项目
  • 此项目继承 BOM 项目
<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><parent><groupId>com.test</groupId><version>1.0.0</version><artifactId>bom</artifactId></parent><groupId>com.test</groupId><artifactId>parent</artifactId><version>1.0.0</version><packaging>pom</packaging><dependencyManagement><dependencies><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1.1</version></dependency></dependencies></dependencyManagement><modules><module>project1</module><module>project2</module></modules>
</project>
4.3.2.3 其它子项目引入 bom
  • 依赖了 bom 中定义的版本号
<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.test</groupId><artifactId>use</artifactId><version>1.0.0</version><packaging>jar</packaging><dependencyManagement><dependencies><dependency><groupId>com.test</groupId><artifactId>bom</artifactId><version>1.0.0</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>com.test</groupId><artifactId>project1</artifactId></dependency><dependency><groupId>com.test</groupId><artifactId>project2</artifactId></dependency></dependencies>
</project>

4.4 system scope

  • 在当前系统路径中找依赖(而不是在仓库中)。一般为 JDK 或 VM 提供的依赖
<project>...<dependencies><dependency><groupId>javax.sql</groupId><artifactId>jdbc-stdext</artifactId><version>2.0</version><scope>system</scope><systemPath>${java.home}/lib/rt.jar</systemPath></dependency><dependency><groupId>sun.jdk</groupId><artifactId>tools</artifactId><version>1.5.0</version><scope>system</scope><systemPath>${java.home}/../lib/tools.jar</systemPath></dependency></dependencies>...
</project>

5 profiles 解析

  • Maven 2.0 开始支持 profile 功能
  • 通过指定有效的 profile 可以很方便的更换运行配置,而不需要使用 -f 来指定不同的 pom
  • 官网地址

5.1 profile 级别

  • 项目级别:定义在本项目中的 pom.xml

  • 用户级别:定义在 %USER_HOME/.m2/settings.xml

  • 全局级别:定义在 ${maven.home}/conf/settings.xml

  • Profile descriptor:定义在项目根路径下的 profiles.xml ,Maven 3.0 不支持

5.2 profile 激活方式

  • 通过 -P 指定
mvn groupId:artifactId:goal -P profile-1,profile-2
  • 通过 Maven settings 中的 activeProfiles 节点指定
<settings>...<activeProfiles><activeProfile>profile-1</activeProfile></activeProfiles>...
</settings>
  • 通过 activation 节点 的 jdk
<profiles><profile><activation><jdk>1.4</jdk><!--jdk 为 1.4 开头--><jdk>[1.3,1.6)</jdk><!--jdk 1.3 到 1.6--><jdk>[1.3,1.6]</jdk><!--其实基本上等于上面,因为 1.6_x 就不在范围了--></activation>...</profile>
</profiles>
  • 通过 activation 节点 的 os
<profiles><profile><activation><os><name>Windows XP</name><family>Windows</family><arch>x86</arch><version>5.1.2600</version></os></activation>...</profile>
</profiles>
  • 通过 activation 节点 的 property

    • Note: Environment variables like FOO are available as properties of the form env.FOO. Further note that environment variable names are normalized to all upper-case on Windows.
<profiles><profile>mvn groupId:artifactId:goal -Ddebug=false  <activation><property><!--如果系统配置中有 debug 对应的的值则激活-->  <name>debug</name><!--如果系统配置中没有debug 对应的的值则激活-->  <!--<name>debug</name>--><!--<value>!true</value>--><!--同时可以指定value值--></property></activation>...</profile><profile>mvn groupId:artifactId:goal -Denvironment=test  As of Maven 3.0, profiles in the POM can also be activated based on properties from active profiles from the settings.xml.<activation><property><name>environment</name><value>test</value></property></activation>...</profile>
</profiles>
  • 通过 file 节点
<profiles><profile><activation><file><missing>target/generated-sources/axistools/wsdl2java/org/apache/maven</missing></file></activation>...</profile>
</profiles>
  • 定义默认激活 profile

    • 当没有其他 profile 被激活时,才激活此 profile
<profiles><profile><id>profile-1</id><activation><activeByDefault>true</activeByDefault></activation>...</profile>
</profiles>

5.3 profile 中可以定义的内容

5.3.1 在外部文件中

  • 在 settings.xml 或 profiles.xml 中只能定义 <repositories> <pluginRepositories> <properties>

5.3.2 在本项目的 pom 中

  • <repositories>
  • <pluginRepositories>
  • <dependencies>
  • <plugins>
  • <properties> (not actually available in the main POM, but used behind the scenes)
  • <modules>
  • <reporting>
  • <dependencyManagement>
  • <distributionManagement>
  • a subset of the <build> element, which consists of
    • <defaultGoal>
    • <resources>
    • <testResources>
    • <finalName>

5.4 显示激活的 profile

mvn help:active-profiles

6 Settings 节点解析

  • 官网地址

7 pom 节点解析

  • 官网地址

Maven 中文文档相关推荐

  1. springboot中文文档_登顶 Github 的 Spring Boot 仓库!艿艿写的最肝系列

    源码精品专栏 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 My ...

  2. spring boot 中文文档地址

    http://oopsguy.com/documents/springboot-docs/1.5.4/index.html Spring Boot 参考指南(翻译中) 作者 Phillip Webb, ...

  3. Spring Boot中文文档

    1.5.2.RELEASE Part I. Spring Boot 文档 本节简要介绍了Spring Boot文档,是整个文档的参考指南. 您可以完整阅读本参考指南,或者如果您不感兴趣的话可以跳过该部 ...

  4. javax.servlet-api 简介、中文文档、中英对照文档 下载

    javax.servlet-api 文档 下载链接(含jar包.源码.pom) 组件名称 中文-文档-下载链接 中英对照-文档-下载链接 javax.servlet-api-3.1.0.jar 暂无 ...

  5. easyexcel 简介、中文文档、中英对照文档 下载

    easyexcel 文档 下载链接(含jar包.源码.pom) 组件名称 中文-文档-下载链接 中英对照-文档-下载链接 easyexcel-3.0.5.jar easyexcel-3.0.5-API ...

  6. commons-lang3 简介、中文文档、中英对照文档 下载

    commons-lang3 文档 下载链接(含jar包.源码.pom) 组件名称 中文-文档-下载链接 中英对照-文档-下载链接 commons-lang3-3.10.jar commons-lang ...

  7. Beetl2.7.13 中文文档

    ## Beetl2.7.13 中文文档 ### 1. 什么是Beetl Beetl目前版本是2.7.13,相对于其他java模板引擎,具有功能齐全,语法直观,性能超高,以及编写的模板容易维护等特点.使 ...

  8. itext 简介、中文文档、中英对照文档 下载

    itext 文档 下载链接(含jar包.源码.pom) 组件名称 中文-文档-下载链接 中英对照-文档-下载链接 itext-2.1.7.jar itext-2.1.7-API文档-中文版.zip i ...

  9. kafka中文文档(0.10.0)

    kafka中文文档(0.10.0) 作者:链上研发-老杨叔叔 时间:2016-07-22 版本:Apache Kafka 0.10.0 (2016年5月底发布) .目录 kafka中文文档0100 目 ...

最新文章

  1. SEL:世界土壤日Stefan Geisen报告(朱永官院士主持,12月4日)
  2. 数据加密之MD5加密
  3. java 无向图子图_无向图的连通子图
  4. timed_waiting线程是否占用cpu_程序CPU占用率飙升,如何定位线程的堆栈信息?超详细,值得收藏看不懂还有配套视频 第319篇...
  5. c打印无符号整数_C语言基础知识:printf的输出格式,C/C++语言编程讲解
  6. shell调用python权限不足_使用权限从python运行shell脚本
  7. 《我们不一样》β冲刺_3
  8. Verilog设计实例(1)线性反馈移位寄存器(LFSR)
  9. 京东大数据技术白皮书 附下载地址
  10. java ios开发_使用Java开发iOS应用
  11. Codeforces Round #700 (Div. 2)-B. The Great Hero-题解-一行实现向上取整
  12. 微信小程序 使用cookie
  13. 【JavaSE进阶(上)】自学笔记 记得收藏时时回顾
  14. Python 适合初学编程的人学吗?
  15. Ramnit 蠕虫分析
  16. 2015 Syrian Private Universities Collegiate Programming Contest 题解
  17. 8 岁小学生B站教编程惊动苹果,库克亲自送生日祝福!
  18. Leetcode 92反转链表
  19. Mysql 常用 表操作
  20. 域名批量查询 到期未续费域名查询

热门文章

  1. 中国技术经济学会区块链分会秘书长贾永政:人工智能与区块链上的存储和计算
  2. SVG描边动画实现过程
  3. 1.1 机器学习和深度学习综述
  4. pps服务器没有响应,为什么pps服务器未响应,停止播放我家用的是Avira AntiVir 控制中心...
  5. “流支付”掀起互联网支付创新浪潮,SAK支付白皮书揭秘
  6. 快充技术及电源IC芯片的浅显认识
  7. 【MySQL:Use Of MySQL】使用记录
  8. 基于 SpringBoot + Vue 的学生公寓管理系统
  9. 顶会竟然攀比起了拒稿率?教授发文怒斥「挑刺式审稿」
  10. 支持软件是计算机软件,()是计算机必备的支持软件。