我是前言
在阅读了官方文档以及自己动手实践后,写下这篇笔记用以记录自己的学习过程。所有关于maven的操作都基于命令行。
安装
安装maven之前,需要先装Java环境。maven的安装文件是个压缩包,访问maven官网,点击左侧导航栏的download,选择files列表中的其中一种压缩包,我使用的是windows,故选择下载.zip文件。下载好之后解压缩,配置环境变量,将解压后的bin目录添加到系统Path中。打开cmd,输入mvn -version
,若显示maven的版本信息,说明安装成功。此过程比较简单。
使用maven创建简单Java项目
打开cmd,切换到某一目录,比如maven-learning,执行命令
mvn -B archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DgroupId=com.example.maven00 \
-DartifactId=maven00
注意,反斜杠只是为了说明此命令应写在一行,不应写出。
若首次执行此命令,则maven会下载所需插件,需要等待一段时间。命令执行之后,发现maven-learning目录下生成了一个maven00的目录,此maven00便是刚才命令行中指定的-DartifactId
参数。maven00的目录结构如下所示
maven00
|-- pom.xml
`-- src
|-- main
| `-- java
| `-- com
| `-- example
| `-- maven00
| `-- App.java
`-- test
`-- java
`-- com
`-- example
`-- maven00
`-- AppTest.java
该目录结构是maven自动生成的,或者说,要想让maven更好地管理项目,就应该按照这种结构布局,这是约定俗成的(convention)。
maven00目录下有一个pom.xml文件和src目录。maven使用pom(Project Object Model)描述、配置和管理项目,其生成的内容如下所示:
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example.maven00</groupId>
<artifactId>maven00</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>maven00</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
在groupId之前的内容大致是固定的写法,不用理会。
-
groupId 该内容由刚才生成项目命令中的
-DgroupId
参数指定。由两部分组成,组织或公司的唯一标识(一般是域名的反写)+项目名。 - artifactId 模块在项目中的唯一标识,一般是项目名+模块名;
- packaging 指打包后的文件格式,默认为JAR,也可以是WAR,EAR等;
- version 该项目的版本号。打包后的文件名称格式为项目名-版本号, 即artifactId-version,后缀就是packaging中所指定的格式。从上面的内容来看,打包后的文件为maven00-1.0-SNAPSHOT.jar。需要注意的是版本号中有个SNAPSHOT(快照),表示当前版本是开发版(development),若不写SNAPSHOT,而直接是1.0,说明该版本是发行版(release),若再次从1.0发行版进入开发版,则版本号应该写成1.1-SNAPSHOT,以此类推。
- name和url 该项目显示的名称以及url,用于生成文档。
- ** dependencies ** 该项目的依赖项,因为使用了junit进行测试,故添加junit依赖项。依赖项单独研究,这里先略过。
再来看src中的内容。src中包含两个目录,main和test,分别表示项目的主源代码目录和测试源代码目录。它们的目录结构大致一样,java文件所属的包也一致,所以只看main目录。
main目录下有一个java目录,java目录下是包结构,包里面是java文件。为什么要有一个java目录,而不直接是包结构?因为跟java目录同级的还可能有一个resources目录,代表项目的资源目录,在打包的时候也会包含在内。默认是没有资源目录的,需要时添加即可,但要注意resources的名称要写对,否则maven不能识别。
测试项目
在项目根目录下,运行命令mvn test
,即可编译和测试项目。注意cmd当前所在的目录一定要是根目录,即包含了pom.xml的目录。初次运行,同样会下载运行所需插件。控制台输出的提示信息,经过删减,大致如下所示:
[INFO] Scanning for projects...
[INFO] Building maven00 1.0-SNAPSHOT
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maven00 ---
[INFO] skip non existing resourceDirectory <dir>\maven-learning\maven00\src\ma
in\resources
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ maven00 ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to <dir>\maven-learning\maven00\target\classes
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ maven00 ---
[INFO] skip non existing resourceDirectory <dir>\maven-learning\maven00\src\te
st\resources
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ maven00 ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to E:\code\maven-learning\maven00\target\test-classes
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ maven00 ---
[INFO] Surefire report directory: <dir>\maven-learning\maven00\target\surefire
-reports
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.example.maven00.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
第一行的Scanning for projects...
应该就是在扫描pom.xml文件和项目结构了,所以mvn test
命令一定要在项目根目录下执行。可以看到,该过程大致分为五个步骤:default-resources
default-compile
default-testResources
default-testCompile
default-test
** default-resources ** 这是在处理主源程序中的资源文件,但由于main目录下没有resources目录,故跳过(skip)该过程。若只处理到这一步而不往后执行,则使用
mvn process-resources
命令即可。** default-compile ** 这是在编译主源程序中的代码,具体而言,是编译App.java文件。若只想进行到这一步,使用
mvn compile
命令即可。** default-testResources ** 处理测试源程序中的资源文件,与
default-resources
类似。若只想进行到这一步,则使用mvn process-test-resources
命令即可。** default-testCompile ** 编译测试代码,具体而言,是编译AppTest.java文件。若只想进行到这一步,则使用
mvn test-compile
命令即可。** default-test ** 最后这一步,是运行测试用例,后面就是测试运行报告了。
所有这些流程都顺利走完后,项目根目录会生成一个target目录,存放项目的输出文件。
项目打包并安装
使用mvn package
打包项目,打包后的文件名为maven00-1.0-SNAPSHOT.jar,存放在target目录下。使用mvn install
命令将包安装到本地仓库中。