Maven是专门位java项目打造的管理和构建工具。它
提供了一套标准化的项目结构;
提供了一套标准化的构建流程(编译,测试,打包,发布……);
提供了一套依赖管理机制。
项目的根目录a-maven-project是项目名,它有一个项目描述文件pom.xml,存放Java源码的目录是src/main/java,存放资源文件的目录是src/main/resources,存放测试源码的目录是src/test/java,存放测试资源的目录是src/test/resources,最后,所有编译、打包生成的文件都放在target目录里。这些就是一个Maven项目的标准目录结构。
pom.xml文件
当我们在使用第三方库时,通过三个变量确定,使用dependency声明一个依赖后,maven会自动下载这个依赖包并将它放到classpath中。
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
Maven的依赖管理
如项目依赖于a包,而a包有依赖于b包,但使用maven我们只需要导入a包
Maven中央仓库
Maven维护了一个中央仓库(repo1.maven.org),所有第三方库将自身的jar以及相关信息上传至中央仓库,Maven就可以从中央仓库把所需依赖下载到本地。Maven并不会每次都从中央仓库下载jar包。一个jar包一旦被下载过,就会被Maven自动缓存在本地目录(用户主目录的.m2目录)
Maven镜像
中国区用户可以使用阿里云提供的Maven镜像仓库。使用Maven镜像仓库需要一个配置,在用户主目录下进入.m2目录,创建一个settings.xml配置文件,内容如下:
<settings>
<mirrors>
<mirror>
<id>aliyun</id>
<name>aliyun</name>
<mirrorOf>central</mirrorOf>
<!-- 国内推荐阿里云的Maven镜像 -->
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
</mirrors>
</settings>
搜索第三方组件
在search.maven.org搜索关键字然后复制
命令行编译
在命令中,进入pom.xml所在目录,输入
Mvn clean package
Maven项目构建流程
Maven通过lifecycle、phase和goal来提供标准的构建流程。
最常用的构建命令是指定phase,然后让Maven执行到指定的phase:
mvn clean
mvn clean compile
mvn clean test
mvn clean package
通常情况,我们总是执行phase默认绑定的goal,因此不必指定goal
Maven的生命周期由一系列阶段(phase)构成,以内置的生命周期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
Maven另一个常用的生命周期是clean,它会执行3个phase:
pre-clean
clean (注意这个clean不是lifecycle而是phase)
post-clean
执行一个phase会触发一个或多个goal
执行的Phase
对应执行的Goal
compile
compiler:compile
test
compiler:testCompile
surefire:test
Goal的命名总是abc:xyz这种形式。
Maven插件
实际上,执行每个phase,都是通过某个插件(plugin)来执行的,Maven本身其实并不知道如何执行compile,它只是负责找到对应的compiler插件,然后执行默认的compiler:compile这个goal来完成编译。
Maven已经内置了一些常用的标准插件
如果标准插件无法满足需求,我们还可以使用自定义插件。使用自定义插件的时候,需要声明。例如,使用maven-shade-plugin可以创建一个可执行的jar,要使用这个插件,需要在pom.xml中声明它:
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
...
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
自定义插件往往需要一些配置,例如,maven-shade-plugin需要指定Java程序的入口,它的配置是:
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.itranswarp.learnjava.Main</mainClass>
</transformer>
</transformers>
</configuration>
maven自带的标准插件是无需声明的
Maven模块拆分
模块拆分指将大项目拆分为小项目,降低复杂度。maven中pox.xml可以拆分
mvnw(maven wrappe)
简单地说,Maven Wrapper就是给一个项目提供一个独立的,指定版本的Maven给它使用。需安装
发布自己的库需按照规定格式