Maven是专门为Java项目打造的项目管理和构建工具,类似 NodeJS 的 NPM,PHP 的 composer。
它的主要功能有:
- 提供了一套标准化的项目结构;
- 提供了一套标准化的构建流程(编译,测试,打包,发布……);
- 提供了一套依赖管理机制。
安装配置
MasOS
1、下载 apache-maven-x.x.x-bin.tar.gz
压缩包
2、解压到自定义目录,如:/usr/local
3、配置环境变量
4、查看是否安装成功
目录结构
一个使用Maven管理的普通的Java项目,它的目录结构默认如下:
pom.xml
groupId
:类似于Java的包名,通常是公司或组织名称artifactId
:类似于Java的类名,通常是项目名称version
:项目版本号
一个Maven工程就是由groupId
,artifactId
和version
作为唯一标识。我们在引用其他第三方库的时候,也是通过这3个变量确定。例如,依赖commons-logging
:
使用<dependency>
声明一个依赖后,Maven就会自动下载这个依赖包并把它放到classpath中。
依赖管理
Maven定义了几种依赖关系:
compile
:编译时需要用到该jar包(默认)test
:编译Test时需要用到该jar包runtime
:编译时不需要,但运行时需要用到provided
:编译时需要用到,但运行时由JDK或某个服务器提供
使用示例:
镜像管理
切换镜像
用户主目录下进入.m2
目录,创建一个settings.xml
配置文件,内容如下:
构建流程
Maven不但有标准化的项目结构,而且还有一套标准化的构建流程,可以自动化实现编译,打包,发布,等等。
- lifecycle相当于Java的package,它包含一个或多个phase;
- phase相当于Java的class,它包含一个或多个goal;
- goal相当于class的method,它其实才是真正干活的。
Lifecycle和Phase
Maven的生命周期(lifecycle)由一系列阶段(phase)构成
使用mvn
这个命令时,后面的参数是phase,Maven自动根据生命周期运行到指定的phase。
常用命令:
mvn clean
:清理所有生成的class和jarmvn clean compile
:先清理,再执行到compile
mvn clean test
:先清理,再执行到test
,因为执行test
前必须执行compile
,所以这里不必指定compile
mvn clean package
:先清理,再执行到package
生命周期default
它包含以下phase:
- validate
- initialize
- generate-sources
- process-sources
- generate-resources
- process-resources
- compile
- process-classes
- generate-test-sources
- process-test-sources
- generate-test-resources
- process-test-resources
- test-compile
- process-test-classes
- test
- prepare-package
- package
- pre-integration-test
- integration-test
- post-integration-test
- verify
- install
- deploy
运行mvn package
,Maven就会执行default
生命周期,它会从开始一直运行到package
这个phase为止:
- validate
- ...
- package
运行mvn compile
,Maven也会执行default
生命周期,但这次它只会运行到compile
,即以下几个phase:
- validate
- ...
- compile
生命周期clean
它会执行3个phase:
- pre-clean
- clean (注意这个clean不是lifecycle而是phase)
- post-clean
Goal
执行一个phase又会触发一个或多个goal
- compile:compiler:compile
test:
- compiler:testCompile
- surefire:test
goal的命名总是abc:xyz
这种形式
模块管理
一个Maven大项目:
拆分成3个模块:
每个模块下面都有独立的 pom 配置,可以抽取pom公共配置作为父级配置,模块下面的pom配置基础父级配置
根目录下的 pom.xml 负责统一编译:
父级 pom.xml 示例:
注:parent的<packaging>
是pom
而不是jar
,因为parent
本身不含任何Java代码
module-a 的 pom.xml 示例:
作者的布局谋篇匠心独运,让读者在阅读中享受到了思维的乐趣。
对趋势的预判具有战略参考价值。
故事线完整,伏笔巧妙,结局耐人寻味。
作者对主题的挖掘深入骨髓,展现了非凡的洞察力和理解力。
哈哈哈,写的太好了https://www.lawjida.com/
你的文章充满了创意,真是让人惊喜。 https://www.4006400989.com/qyvideo/87897.html
你的文章充满了智慧,让人敬佩。 http://www.55baobei.com/AruG4E0H3O.html
想想你的文章写的特别好www.jiwenlaw.com
不错不错,我喜欢看 https://www.ea55.com/
不错不错,我喜欢看 https://www.237fa.com/