前言
最初使用maven是因为需要一个类似Python pip一样的包管理程序,网上一致推荐使用maven和gradle,所以这里来简单聊聊maven这个由 Apache 软件基金会主持的独立 Apache 项目。
安装
首先需要确保你的机器上面有1.5及以上版本的JDK,通过java -version查看。
同时推荐你已经设置了JAVA_HOME这个环境变量:
1 | whereis java |
下载解压
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 | export MAVEN_HOME=/usr/local/apache-maven-3.6.3 |
验证
mvn -v
为maven更换源
进入到~/.m2,在对应的setting.xml文件中加入:
1 | <mirrors> |
如果发现自己家目录下面没有,可以cd ${MAVEN_HOME}/conf这个目录下复制一份。
创建一个项目
这里我打算按照官方的教程来,一开始接触的话可能会对下面的命令感到奇怪,没事先照着输入,然后之后你会一点一点了解的。
1 | mvn -B archetype:generate \ |
大概1分钟左右maven会帮你在当前的目录下创建一个叫my-app的目录,让我们来看看这个目录的结构:
1 | . |
嗯,是一个非常的简单且典型的java项目。从这里我们也可以知道,上面那条命令的最后一个-DartifactId指定的是你的项目的文件夹名字,-DgroupId指定的项目的文件结构。
唯一没见过的就是这个叫pom.xml的东西了。POM(Project Object Model)直译过来就是项目对象模型。看一下这个xml文件的内容:
1 | <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
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 | <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 | <build> |
然后就可以生成文件了。最后你还可以通过mvn clean来删除之前生成的东西。