Maven简单使用攻略

前言

最初使用maven是因为需要一个类似Python pip一样的包管理程序,网上一致推荐使用maven和gradle,所以这里来简单聊聊maven这个由 Apache 软件基金会主持的独立 Apache 项目。

安装

首先需要确保你的机器上面有1.5及以上版本的JDK,通过java -version查看。

同时推荐你已经设置了JAVA_HOME这个环境变量:

1
2
3
4
5
6
whereis java
// 然后通过挖掘不断找到最终真正的java命令所在地
// 然后去对应shell的rc文件中:
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64

source ~/.zshrc

下载解压

wget https://www-eu.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz

tar -xvf apache-maven-3.6.3-bin.tar.gz

sudo mv -f apache-maven-3.3.9 /usr/local/

环境变量

sudo vim /etc/profile

1
2
export MAVEN_HOME=/usr/local/apache-maven-3.6.3
export PATH=${PATH}:${MAVEN_HOME}/bin

验证

mvn -v

为maven更换源

进入到~/.m2,在对应的setting.xml文件中加入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>

如果发现自己家目录下面没有,可以cd ${MAVEN_HOME}/conf这个目录下复制一份。

创建一个项目

这里我打算按照官方的教程来,一开始接触的话可能会对下面的命令感到奇怪,没事先照着输入,然后之后你会一点一点了解的。

1
2
3
4
mvn -B archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DgroupId=com.mycompany.app \
-DartifactId=my-app

大概1分钟左右maven会帮你在当前的目录下创建一个叫my-app的目录,让我们来看看这个目录的结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.
├── pom.xml
└── src
├── main
│   └── java
│   └── com
│   └── mycompany
│   └── app
│   └── App.java
└── test
└── java
└── com
└── mycompany
└── app
└── AppTest.java

嗯,是一个非常的简单且典型的java项目。从这里我们也可以知道,上面那条命令的最后一个-DartifactId指定的是你的项目的文件夹名字,-DgroupId指定的项目的文件结构。

唯一没见过的就是这个叫pom.xml的东西了。POM(Project Object Model)直译过来就是项目对象模型。看一下这个xml文件的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<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.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>my-app</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>

POM文件对于maven来说是如此的重要,所以对这个文件里面的标签进行一下解释。

  • project,这个标签是项目的顶层标签。
  • modelVersion,很明显就是这个maven的模型用了哪个版本。一般来说是不会更改这个文件的,但是如果需要也是可以更改的。
  • groupId,这个标签的内容一般就是公司的名字,比如如果是腾讯的话应该是com.tencent.wechat这种的,总之这个标签的目的是用来唯一标识创建这个项目的组织或个人,而在java中我们一般使用域名的倒装。
  • artifactId,这个标签的内容就是你的项目名字。一个项目主要是为了生成jar文件,而使用maven生成的jar文件默认名字就是<artifactId>-<version>
  • packaging,这个标签指示了此项目的包类型。(此条没特别搞懂,存疑)
  • version,版本号,没什么好说的。
  • name、url、description(上面的xml文件中没有),这三个经常被用在文档的生成。

编译

由于按照之前的创建的话,maven生成的App.java就是一个默认的Hello World文件了,所以可以直接回到pom.xml文件所在的位置然后直接输入mvn compile,可以进行编译了。

按照官网的结果应该是成功的,但是我这边报了一个错误:Source option 5 is no longer supported. Use 6 or later.上网查找了一下,说的就是java版本太新了(我用的是11),而maven-compiler-plugin这个东西默认的是比较老的,两者就不兼容了,所以最好的方法是手动指定最新的插件版本,在pom.xml中加入:

1
2
3
4
5
6
7
8
<project>
[...]
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
[...]
</project>

再次编译就没有问题了。我后来在JDK8上面发现默认的就行,所以就是因为JDK版本太新了。

第一次编译的时候maven会去下载自己需要的东西,所以可能会有点慢,之后就会快很多了。编译完成之后会发现文件下面多一个叫target的文件夹,你编译生成的字节码文件就按照之前的顺序存放在这个文件夹中。

测试【可选】

由于maven刚刚生成的代码已经包含了测试代码,所以我们只需要输入mvn test就可以进行测试了。

又是一通下载,然后就会运行了,如果你只是想编译你的代码而不是去运行它,可以使用mvn test-compile命令。

直接执行

比如我在网上下了一个我感兴趣的项目,然后直接进行了compile编译,发现编译通过,那么就该执行了。如果换做在idea里面,只需要直接点击就可以执行了,但是在mvn中需要手动运行:mvn exec:java -Dexec.mainClass="com.domain.module.Main"

生成jar包并安装到本地仓库

只需要执行mvn package即可。还是会自动去下载一些插件,所以会有点慢。完成之后会在target目录下生成jar包,但是我去执行发现是执行不了的。为什么会是mvn package而不是类似mvn jar这种的呢?这主要是因为你在pom文件下声明了<packaging>jar</packaging>这一条的原因。

本地仓库默认是在~/.m2/repository,如果你现在打开一看发现已经有不少的文件夹在里面了。

然后继续执行mvn install就可以把你的jar包安装到你的本地仓库里了

按照约定,所有的名字中带Test的那些java文件,都会被框架测试。

值得注意的是,这里还有一个mvn的插件可以使用,直接输入mvn site即可生成一个站点。当时生成的时候会报错,因为没有在pom文件里写这个文件,所以需要先在pom文件里写入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</build>

然后就可以生成文件了。最后你还可以通过mvn clean来删除之前生成的东西。