Maven 基础

设置

Maven 依靠项目根目录下的 pom.xml 来配置.

设置模版

<?xml version="1.0" encoding="UTF-8"?>
<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">

<groupId>组标识符</groupId>
<artifactId>制品标识符</artifactId>
<version>版本号</version>
<modelVersion>模型版本号</modelVersion>
<packaging>打包方式</packaging>


<dependencies>
<dependency>
<groupId>组标识符</groupId>
<artifactId>制品标识符</artifactId>
<version>版本号</version>
<scope>作用域</scope>
</dependency>
</dependencies>


<plugins>
<plugin>
<groupId>组标识符</groupId>
<artifactId>制品标识符</artifactId>
<version>版本号</version>
<release></release>
<configuration></configuration>
</plugin>
</plugins>

<properties>
<maven.compiler.source>爪哇版本号</maven.compiler.source>
<maven.compiler.target>爪哇版本号</maven.compiler.target>
<project.build.sourceEncoding>字符编码</project.build.sourceEncoding>
</properties>

<repositories>
<repository>
<id>标识符值</id>
<name>名字</name>
<url>仓库统定符</url>
<snaphots>是否为快照仓库</snapshots>
<releases>是否为发布仓库</releases>
</repository>
</repositories>

<pluginRepositories>
<pluginRepository>
<id>标识符值</id>
<name>名字</name>
<url>仓库统定符</url>
<snaphots>是否为快照仓库</snapshots>
<releases>是否为发布仓库</releases>
</pluginRepository>
</pluginRepositories>

<build>
<plugins>
<plugin>
<groupId>组标识符</groupId>
<artifactId>制品标识符</artifactId>
<version>版本号</version>
<configuration>
<source>爪哇版本号</source>
<target>爪哇版本号</target>
</configuration>
<executions>
<id></id> <phase></phase> <goals> <goal>
</executions>
</plugin>
</plugins>
</build>

</project>

下面解释一些重要条目的具体含义

version

SNAPSHOT 结尾时,每次编译时,maven 会把你的代码和仓库或者开发团队同步.

packaging

packaging 表示的是 maven 将应用打包成的应用格式, 最常见的选择是默认的 jar 格式.

plugin

TODO

scope

scope 表示的是这个插件或依赖在哪个阶段是可用的, 一些常用的取值如下:

  1. compile: 从开始到编译的各个阶段阶段都可用, 并打包进最终的包里面进行分发。是默认值.
  2. provided: 从开始到编译的各个阶段阶段都可用, 但是不会打包进最终的包里面。分发应用时, 需要用户系统上已经安装了这个依赖. 这个值常常被用在各种提供的应用编程接口依赖上,比如 servletxml .
  3. runtime: 只在应用运行时可用,可以看作与 provided 互补.
  4. test: 只在测试阶段可用.
  5. system: 依赖位于系统上的给定路径处.
  6. import: TODO

repository

repository 条目设置的是依赖仓库,而 pluginRepository 条目设置的是插件仓库, 两种仓库的配置完全一样.

snaphots 条目设置是否允许下载快照版本,releases 条目设置是否允许下载发布版本。实践中,不少开发团队不喜欢将快照, 发布版本还有其他种类的版本混杂在一起,那样容易让用户弄错想要下载的版本, 带来糟糕的体验和大量无意义的问题反馈. 同时也不利于开发人员快速确定版本类型进行有针对性的问题分析和开发规划.

构建生命周期 (Build Lifecycle)

虽然一个普通的 Java 文件可以很轻松的被随意分发, 但是大型应用程序往往结构和依赖非常复杂, 从源代码到用户机器上运行需要很多精细的工作.

比如,开启哪些构建开关,依赖哪些包的什么版本, 特殊的运行环境可能还需要做某些特殊的操作等等.

Maven 通过构建生命周期来完成应用的编译,构建,打包, 部署等操作,同时提供较高的可维护性和复用性.

内建的生命周期有三个:

  • 默认 (default): 这是主要的生命周期, 负责项目的部署.
  • 清理 (clean): 删除项目构建中生成的所有文件. 类似于 make clean.
  • 文档 (site): 创建项目的文档. (为什么要叫 site 呢, 因为这个文档是类似 javadoc 那样的组织形式, 可以直接放在文档站上的.)

每一个生命周期都是由不同的阶段构成的, 比如默认生命周期就由 23 个阶段构成。而清理生命周期则只有 3 个. 文档生命周期有 4 个.

阶段 (Phase)

Maven 里的每个阶段都会完成一个特定的任务. 我们在命令行里执行的 mvn 参数 中的 参数 就是各种阶段的名称. 注意啦,这时候执行的不只是指定的那个阶段, 还有按所在的生命周期排序在它之前的阶段. 比如执行 package 阶段就会在真正执行它之前・先执行 validate compile 等阶段,因为在默认生命周期里的执行顺序就是这样的.

默认生命周期里的最重要的阶段有:

  • validate
  • compile
  • test
  • package
  • integraion-test: 部署并运行集成测试.
  • verify: 运行各项检查,确认应用完整.
  • install
  • deploy

目标 (Goal)

目标由插件提供。每个阶段是靠执行一个或多个不同的目标来完成任务的. 但是目标不一定非要绑定到某个阶段上,也可以单独执行.

我们可以通过一下两种方式来单独执行一个目标

mvn 插件名:目标名
mvn 插件组名:插件制品名[:插件版本名]:目标名

通过 mvn help:describe -Dcmd=阶段名来获取这个阶段执行的所有目标以及提供哦这些目标的插件.

通过 mvn <插件名>:help 来获取插件的所有目标.

一些重要的目标

在全局 POM 中定义的默认目标有:

  • clean
  • compile
  • package
  • install: 这个是安装到本账号的.m2 下.
  • deploy: 这个是部署到其它机器上.

其它一些重要的目标和他们被绑定到的阶段:

  • compiler:compile: 绑定到 compile 阶段
  • compiler:testCompile: 绑定到 test-compile 阶段
  • surefire:test: 绑定到 test 阶段
  • install:install: 绑定到 install 阶段
  • jar:jar: 绑定到 package 阶段
  • war:war: 绑定到 package 阶段

引用

Maven Goals and Phases | Baeldung