Appearance
快速开始
安装
前提条件
- 安装 JDK 8 或以上版本。
- 设置
JAVA_HOME
环境变量指向你的 JDK 安装路径,或者确保java
可执行文件已添加到PATH
中。
首先,从官网下载 Maven。然后,解压安装包,并将 bin
目录(其中包含 mvn
命令)添加到 PATH
环境变量中即可完成安装。
之后,在终端或命令提示符中输入以下内容:
sh
mvn --version
输出结果应类似于:
tex
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: D:\apache-maven-3.6.3\apache-maven\bin\..
Java version: 1.8.0_232, vendor: AdoptOpenJDK, runtime: C:\Program Files\AdoptOpenJDK\jdk-8.0.232.09-hotspot\jre
Default locale: en_US, platform encoding: Cp1250
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
项目创建
你需要为项目准备一个存放位置。
先在某个位置创建一个目录,并在该目录下打开终端。然后,在命令行中执行以下 Maven 命令:
sh
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.5 -DinteractiveMode=false
如果你刚安装了 Maven,第一次运行可能会花费一些时间。
命令执行成功后,你会发现 generate
目标创建了一个与 artifactId
相同名称的目录。进入该目录。
sh
cd my-app
在这个目录下,你会看到以下标准的项目结构。
tex
my-app
|-- pom.xml
`-- src
|-- main
| `-- java
| `-- com
| `-- mycompany
| `-- app
| `-- App.java
`-- test
`-- java
`-- com
`-- mycompany
`-- app
`-- AppTest.java
src/main/java
目录包含项目的源代码,src/test/java
目录包含项目的测试代码,pom.xml
文件是项目的 项目对象模型(POM)。
项目对象模型 POM
pom.xml
文件是 Maven 项目配置的核心。它是一个单一的配置文件,包含了构建项目所需的大部分信息,能够以你希望的方式构建项目。虽然 POM 文件非常庞大,且其复杂性可能让人望而生畏,但要有效使用它,并不需要立即理解所有的细节。
这个项目的 POM 文件应该是这样的:
POM 文件
xml
<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.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<name>my-app</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.release>17</maven.compiler.release>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>5.11.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<scope>test</scope>
</dependency>
<!-- Optionally: parameterized tests support -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
... lots of helpful plugins
</pluginManagement>
</build>
</project>
你刚刚做了什么?
你执行了 Maven 的目标 archetype:generate
,并为该目标传递了各种参数。
前缀 archetype
是提供该目标的插件。这个 archetype:generate
目标基于 maven-archetype-quickstart
原型创建了一个简单的项目。
插件,暂时可以简单理解为一组具有共同目的的目标的集合。
构建项目
sh
mvn package
命令行将打印出各种操作,并以以下内容结束:
txt
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.953 s
[INFO] Finished at: 2019-11-24T13:05:10+01:00
[INFO] ------------------------------------------------------------------------
与第一次执行的命令(archetype:generate
)不同,第二个命令只是一个单独的词——package
。与目标(goal)不同,package
是一个 阶段(phase)。阶段是构建生命周期中的一个步骤,生命周期是一个有序的阶段序列。当指定一个阶段时,Maven 会执行该阶段之前的所有阶段,并包括指定的阶段。例如,如果你执行 compile
阶段,实际上执行的阶段是:
- validate
- generate-sources
- process-sources
- generate-resources
- process-resources
- compile
你可以使用以下命令来测试刚刚编译和打包好的 JAR 文件:
sh
java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App
这将打印出最经典的内容:
txt
Hello World!
运行 Maven 工具
Maven 阶段
虽然这不是一个完整的列表,但下面这些是最常执行的默认生命周期阶段:
- validate:验证项目是否正确,所有必要的信息是否可用。
- compile:编译项目的源代码。
- test:使用合适的单元测试框架测试编译后的源代码。这些测试不需要代码被打包或部署。
- package:将编译后的代码打包成可分发格式,如 JAR 文件。
- integration-test:如果需要,处理并将包部署到可以运行集成测试的环境中。
- verify:运行任何检查以验证包的有效性并确保其符合质量标准。
- install:将包安装到本地仓库中,以便在其他本地项目中作为依赖使用。
- deploy:在集成或发布环境中执行,将最终包复制到远程仓库,与其他开发人员和项目共享。
除了上面提到的默认生命周期外,还有两个值得注意的 Maven 生命周期,它们是:
- clean:清理之前构建生成的产物
- site:为项目生成站点文档
阶段实际上是映射到底层的目标(goals)。每个阶段执行的具体目标取决于项目的打包类型。例如,如果项目类型是 JAR,package
阶段会执行 jar:jar
目标;如果项目类型是 WAR,package
阶段则会执行 war:war
目标。
一个有趣的事情是,阶段和目标可以按顺序执行。
sh
mvn clean dependency:copy-dependencies package
该命令将清理项目、复制依赖并打包项目(当然,也会执行直到 package
阶段的所有其他阶段)。