省略下载安装过程
配置
maven 默认目录在${user.home}/.m2/
settings.xml
配置文件为 maven 的全局配置
镜像
maven 默认中央仓库访问速度较慢,可通过配置阿里云的镜像加速访问。当需要禁止访问中央仓库时,也可通过配置镜像将中央仓库指定为远程仓库
阿里云镜像地址:
http://maven.aliyun.com/nexus/content/groups/public/
在${user.home}/.m2/settings.xml
中新增如下配置
1 | <settings> |
<mirrorOf>central</mirrorOf>
里是要替代的仓库的 id。<mirrorOf>*</mirrorOf>
匹配所有仓库<mirrorOf>external:*</mirrorOf>
匹配所有远程仓库,使用localhost
的除外,使用file://
协议的除外。也就是说,匹配所有不在本机上的远程仓库。<mirrorOf>repo1,repo2</mirrorOf>
匹配仓库 repo1 和 repo2,使用逗号分隔多个远程仓库。<mirrorOf>*,!repo1</miiroOf>
匹配所有远程仓库,repo1 除外,使用感叹号将仓库从匹配中排除。
POM
pom 是最基础的组件,是 maven 用来构建项目的基础配置文件,其中包括许多默认属性。
Super POM
所有的 pom 文件都继承自Super POM
,除非你设置了不继承。
下面是 Maven 3.5.4 版本的Super POM
摘要
1 | <project> |
配置 mvn 的 jdk 版本
可统一在settings.xml
中新增如下配置
1 |
|
也在项目 pom 中增加配置
1 |
|
属性
内置属性
${basedir}
表示项目根目录,即包含pom.xml
文件的目录;${version}
表示项目版本。${project.basedir}
同${basedir}
;
pom 属性
使用 pom 属性可以引用到 pom.xml 文件对应元素的值,继承自Super POM
${project.build.sourceDirectory}
:项目的主源码目录,默认为src/main/java/
${project.build.testSourceDirectory}
:项目的测试源码目录,默认为/src/test/java/
${project.build.directory}
:项目构建输出目录,默认为target/
${project.outputDirectory}
:项目主代码编译输出目录,默认为target/classes/
${project.testOutputDirectory}
:项目测试代码编译输出目录,默认为target/testclasses/
${project.groupId}
:项目的groupId
${project.artifactId}
:项目的artifactId
${project.version}
:项目的version
,于${version}
等价${project.build.finalName}
:项目打包输出文件的名称,默认 为${project.artifactId}${project.version}
自定义属性
在pom.xml
文件的<properties>
标签下定义的 Maven 属性,在其他地方使用${property}
使用该属性值。
文件属性
与 pom 属性同理,用户使用以settings
开头的属性引用settings.xml
文件中的 XML 元素值${settings.localRepository}
表示本地仓库的地址;
Java 系统属性
所有的 Java 系统属性都可以使用 Maven 属性引用,使用mvn help:system
命令可查看所有的 Java 系统属性;System.getProperties()
可得到所有的 Java 属性;${user.home}
表示用户目录;
环境变量属性
所有的环境变量都可以用以env.
开头的 Maven 属性引用使用mvn help:system
命令可查看所有环境变量;${env.JAVA_HOME}表示 JAVA_HOME 环境变量的值;
手动指定变量
我们可以在打包时使用-D
指定变量,例如mvn package -Denv=uat
编译资源文件
1 | <project xmlns="http://maven.apache.org/POM/4.0.0" |
targetPath
编译目录,默认位置为classes
目录directory
项目资源目录
生命周期和阶段
maven 通过指定的生命周期部署和发布项目。每个生命周期都包含一系列 phase,当执行指定 phase 时,所有前置的 phase 都会被执行。
主要有下述三个生命周期
Clean Lifecycle 主要用来清理 target
Phase Description pre-clean execute processes needed prior to the actual project cleaning clean remove all files generated by the previous build post-clean execute processes needed to finalize the project cleaning Default Lifecycle 默认的生命周期,用于进行编译,打包,发布等 | Phase | Description | | :-| :--------------------------------------------------------------------------------------------------------------------------------------------------------------- | | validate | validate the project is correct and all necessary information is available. | | initialize | initialize build state, e.g. set properties or create directories. | | generate-sources| generate any source code for inclusion in compilation. | | process-sources | process the source code, for example to filter any values. | | generate-resources| generate resources for inclusion in the package. | | process-resources| copy and process the resources into the destination directory, ready for packaging. | | compile | compile the source code of the project. | | process-classes| post-process the generated files from compilation, for example to do bytecode enhancement on Java classes. | | generate-test-sources| generate any test source code for inclusion in compilation. | | process-test-sources| process the test source code, for example to filter any values. | | generate-test-resources| create resources for testing. | | process-test-resources| copy and process the resources into the test destination directory. | | test-compile| compile the test source code into the test destination directory | | process-test-classes| post-process the generated files from test compilation, for example to do bytecode enhancement on Java classes. | | test | run tests using a suitable unit testing framework. These tests should not require the code be packaged or deployed. | | prepare-package| perform any operations necessary to prepare a package before the actual packaging. This often results in an unpacked, processed version of the package. | | package | take the compiled code and package it in its distributable format, such as a JAR. | | pre-integration-test| perform actions required before integration tests are executed. This may involve things such as setting up the required environment. | | integration-test| process and deploy the package if necessary into an environment where integration tests can be run. | | post-integration-test| perform actions required after integration tests have been executed. This may including cleaning up the environment. | | verify | run any checks to verify the package is valid and meets quality criteria. | | install | install the package into the local repository, for use as a dependency in other projects locally. | | deploy | done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects. |
Site Lifecycle 用于生成相关的文档 | Phase | Description | | :---------- | :------------------------------------------------------------------------------------------- | | pre-site | execute processes needed prior to the actual project site generation | | site | generate the project's site documentation | | post-site | execute processes needed to finalize the site generation, and to prepare for site deployment | | site-deploy | deploy the generated site documentation to the specified web server |
phase
执行指定阶段及该阶段的所有前置阶段的插件。
goal
每个 phase 都包含一系列 goal,每个 goal 执行指定的任务,当执行 phase 时,绑定在该 phase 的 goal 都会被执行
我们可以使用命令来查看绑定在 phase 上的 goal
1 | mvn help:describe -Dcmd=compile |
maven 插件是一个 goal 的组合,这写 goals 可以指定到不同的 phase 上。
我们可以通过命令查看 plugin 支持的 goal
1 | <build> |
上述表示执行integration-test
和verify
这两个 goal,
1 | 我们可以通过命令查看插件支持的 goal |
goal
可只运行指定goal
的插件,而不会调用前置
调试默认
mvn compile -X
可以查看compile
插件的所有细节,包括默认配置,比如日志如下
插件介绍
插件的pom
会指定默认phase
,goal
:插件的官方文档
clean
1 | <build> |
clean 插件主要清理编译生成的文件,默认的编译目录配置在以下属性中
project.build.directory
>project.build.outputDirectory
>project.build.testOutputDirectory
>project.reporting.outputDirectory
compiler
1 | <plugin> |
compilerArgs
javac 参数
source
源码 jdk 版本
target
编译 jdk 版本
其他详细参数介绍请查看 :compiler:compile 参数介绍
通过 debug 模式运行 compile,可以看到 compile 编译的源目录以及目标目录
1 | <buildDirectory default-value="${project.build.directory}"/> |
${project.build.directory}
在Super POM
中有定义,默认值为${project.basedir}/target
${project.compileSourceRoots}
默认值为${project.basedir}/${project.build.sourceDirectory}
通过查看 maven 源码:
1 | package org.apache.maven.project; |
1 | package org.apache.maven.project; |
1 | package org.apache.maven.project; |
1 | package org.apache.maven.model.interpolation; |
resources
编译时拷贝资源文件,不需要显式的调用插件
1 | <build> |
targetPath
编译后目录,默认是以${project.build.outputDirectory}
为前缀的
directory
源资源目录,默认是以${basedir}
为前缀的
finalName
打包后的项目名,默认为${project.artifactId}-${project.version}
dependency
解决打包依赖的 jar 包
1 | <plugin> |
outputDirectory
表示依赖 jar 默认输出目录,默认是${basedir}
goal
:copy-dependencies
相关配置详细
antrun
执行脚本
1 | <plugin> |
tasks
具体语法参考 ant 官方文档
依赖冲突
Maven 采用“最近获胜策略(nearest wins strategy)”的方式处理依赖冲突,即如果一个项目最终依赖于相同 artifact 的多个版本,在依赖树中离项目最近的那个版本将被使用
1.当前模块直接引入合适版本的依赖
2.使用 dependency:tree -Dverbose"
查看是否有冲突的依赖,根据输出的依赖关系图查看是否包含conflict
,然后根据需要排除不需要引入的版本 通过依赖排除
1 | <dependency> |
dependencyManagement
示例说明,
在父模块中:
1 | <dependencyManagement> |
那么在子模块中只需要<groupId>
和<artifactId>
即可,如:
1 | <dependencies> |
说明: 使用 dependencyManagement 可以统一管理项目的版本号,确保应用的各个项目的依赖和版本一致,不用每个模块项目都弄一个版本号,不利于管理,当需要变更版本号的时候只需要在父类容器里更新,不需要任何一个子项目的修改;如果某个子项目需要另外一个特殊的版本号时,只需要在自己的模块 dependencies 中声明一个版本号即可。子类就会使用子类声明的版本号,不继承于父类版本号。 dependencyManagement 不会引入包,仅控制版本
与 dependencies 区别
- Dependencies 相对于 dependencyManagement,所有生命在 dependencies 里的依赖都会自动引入,并默认被所有的子项目继承。
- dependencyManagement 里只是声明依赖,并不自动实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且 version 和 scope 都读取自父 pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的 jar 版本。
模块
maven 的模块是在父类 pom 中定义聚合关系,其本质仅仅是一次性批量按顺序执行所有子模块的 mvn 命令而已 我们已一个简单的示例来说明
1 |
|
1 |
|
1 |
|
当我们在父类 pom 中执行打包命令mvn install
时,其实就是依次在maven-parent
,maven-child1
,maven-child2
上执行mvn install
的过程
SpringBoot
打包
SpringBoot
打包会生成两个文件
MyApplication-0.0.1-SNAPSHOT.war (可运行行文件) MyApplication-0.0.1-SNAPSHOT.war.original(不可运行文件,用以发布在容器下)
强制刷新本地缓存
mvn dependency:purge-local-repository
打包源码
1 | <plugin> |
执行 mvn install,maven 会自动将 source install 到 repository 。 执行 mvn deploy,maven 会自动将 source deploy 到 remote-repository 。 执行 mvn source:jar,单独打包源码。
profiles
1 |
|
我们在执行命令时使用
1 | 默认uat profile |
profile 支持激活的方式
1 | <!--配置默认激活--> |