Maven核心知识

上篇文章介绍了Maven的安装、配置及创建自己的第一个Maven项目的两种方式。在往后的开发中我们需要用到Maven对我们的项目进行管理以简化项目开发过程,具体就是当我们的项目需要导入哪个第三方jar包时直接在Maven为我们生成的的pom.xml文件中添加相关jar包依赖就行。接下来我想有必要总结一下学习Maven的相关核心知识,以方便大家对Maven有更好的了解。

1.maven常用构建命令(了解)

  • mvn -v:查看maven的版本。
  • mvn compile:编译项目。项目经过编译后会在根目录下生成一个target包(跟src包在同一目录下),里面保存的是编译项目时字节码文件和测试报告。
  • mvn test:测试。此命令在项目目录下
  • mvn package:打包我们的项目。
  • mvn clean:删除上述经过编译后生成的target包。
  • mvn install:将我们的项目打包到本地仓库中。例如将A项目用该命令打包到本地仓库后,就可以在B项目的pom.xml文件中配置A项目的坐标来让B项目引用A项目,见下文仓库的讲解。

只有第一个命令mvn -v是在根目录下执行,其他5个命令都是在我们的maven项目包下执行的。

上述知识只做了解,在实际开发中基本没有用到上述命令。

2.maven自动构件骨架

我在创建第一个Maven项目中就有介绍过,让maven自动为我们的项目生成一个标准的骨架有两种方式,一种是通过命令行输入:

1
mvn archetype:generate -DgroupId=cn.codingxiaxw.helloword -DartifactId=helloworld -Dpackage=cn.codingxiaxw.helloword -Dversion=1.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-quickstart

或者:

1
mvn archetype:generate -DgroupId=cn.codingxiaxw.helloword -DartifactId=helloworld -Dpackage=cn.codingxiaxw.helloword -Dversion=1.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-webapp

第二种方式是使用IDEA开发工具为我们生成,步骤之前讲过,大家可以点击上述链接看我在那篇文章中的介绍。这里只对上述命令进行解释,如下:

  • mvn:表示使用的是maven命令。
  • archetype:generate:表示使用generate这个插件为我们的maven项目自动生成一个maven骨架,即我们项目的工程结构(如下图)。后边跟的是该插件为我们创建工程结构所需要的一连串的参数。
  • -DgroupId:标识项目的坐标元素之一,与DartifactId,Dpackaging,Dversion组成我们maven项目的坐标,四者唯一确定一个项目。它的值为我们的项目包名,我这里的格式用的我的博客网站后缀+我的用户名+项目名组成。
  • -DartifactId:标识项目的坐标元素之一,它的值为我们的项目名。我这里指定我要生成的项目名为helloword。
  • -Dpackage:标识项目的坐标元素之一,这里值就跟DgroupId的值保持一致即可。此属性在命令行中可选。
  • -Dversion:指定版本号。此属性在命令行中可选
  • -DarchetypeArtifactId:表示我们生成的工程结构为哪一种,这里的属性值为maven-archetype-quickstart表示生成工程目录结构为quickstart的结构。其值还可以为maven-archetype-webapp表示生成的工程目录结构为webapp型的结构。

3.maven中的坐标和仓库

3.1坐标

在maven的世界中,maven以构件来组成基本的控制单元,而定义这个构件的标示,maven给定义为“坐标”。坐标是maven最基本的概念,它就像每个构件的身份证号码,有了它我们就可以在数以千万计的构件中定位任何一个我们感兴趣的构件。

例如我们在上篇文章中通过maven命令生成的maven项目中,其pom.xml中有这样一些配置:

1
2
3
4
<groupId>cn.codingxiaxw.helloword</groupId>
<artifactId>helloword</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>

上面这样四个xml元素即即组成了一个坐标,唯一标识我们创建的这个项目。

再如若我们要在自己的项目中引入junit测试jar包,只需在pom.xml中配置如下junit的坐标:

1
2
3
4
5
6
<dependency>  
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>

maven就会根据我们给出的junit的坐标在其中央仓库中为我们找到junit 的相关jar包,然后将其下载到自己的本地仓库中。这样我们便可以在自己的项目开发中运用junit类进行测试了。

3.2仓库

上述我们已经提到了仓库,其实当我们在自己的电脑上成功安装maven后,就已经已经生成了一个本地仓库,可以在下列地址中找到:

1
/Users/codingBoy/.m2/repository

打开后发现里面全是各种本地仓库中的各种引用开发jar包,这里也能发现我们在pom.xml中配置的junit,可以发现已经下载到本地仓库里面了,如下:

只要我们在pom.xml中配置了相关jar包的坐标,maven都会根据这个坐标自动将这些jar包下载在该目录(也就是maven的本地仓库)下供我们开发过程中的直接引用。

既然有本地仓库,那么是不是还有个远程仓库的概念呢?答案是肯定的,这个远程仓库是个大仓库,叫做中央仓库,地址为:https://repo.maven.apache.org/maven2。感谢开源社区的贡献,在maven的中央仓库里几乎为我们下载了所有开发都需要的jar包,如下:

要是此时我们又创建了一个maven项目helloword2,而且需要在这个项目中引用helloword项目,只要将helloword项目打包到本地仓库,然后在helloword2项目的pom.xml文件中引入helloword的坐标即可。通过如下步骤:

1.在命令行中输入命令:

1
2
3
先cd helloword

然后mvn clean

通过上述步骤清除helloword经过编译后生成的target包。

2.输入:

1
mvn install

将helloword项目打包并发布到本地仓库中。

3.此时helloword2就可以根据坐标来引入helloword项目了,在helloword2的pom.xml文件中添加helloword的坐标:

1
2
3
4
5
6
<dependency>
<groupId>cn.codingxiaxw.helloword</groupId>
<artifactId>helloword</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
</dependency>

这样便完成了在一个项目中对另一个项目进行引用。

3.3坐标和仓库的关系

有了坐标,就知道在什么位置存储构件的内容,中央仓库也是一个样,上述例子中引用的junit的可以把它的坐标描述为:junit:junit:4.8.2,在中央仓库地址中打开对应的目录果然看到了Junit的jar包:

有了正确的坐标,Maven才能够在正确的位置找到依赖文件并使用,上述pom.xml中为junit坐标设置的<scope>标签中的test值是用来控制该依赖只在测试时可用,与坐标无关。

正因为坐标是Maven核心的核心,因此规划正确的坐标至关重要,如果你使用了模糊不清的坐标,那么你的用户就很难找到你的构件,或者即使找到了,也容易写错。错误的使用坐标,还会造成冲突,如果你也使用junit这样的groupId,那就悲剧了。

4.生命周期和插件

Maven定义了三套生命周期:clean、default、site,每个生命周期都包含了一些阶段(phase)。三套生命周期相互独立,但各个生命 周期中的phase却是有顺序的,且后面的phase依赖于前面的phase。执行某个phase时,其前面的phase会依顺序执行,但不会触发另外两 套生命周期中的任何phase。

  • clean,做些清理的工作。
  • default,最核心的周期,做初始化和构建的工作,里面分的阶段很多,主要是compllie,test, package, install等。
  • site,生成站点的周期,包括生成文档和发布等。

maven的生命周期是抽象的,实际需要插件来完成任务,这一过程是通过将插件的目标(goal)绑定到生命周期的具体阶段(phase)来完成的。这里就像设计模式中的模板模式,父类定义好了方法模板并规定对了执行顺序,而子类定义了每个模板方法具体要做的事情。这里的父类相当于maven,而子类就像是一个个的插件。

比如compile这个阶段,对应的是mvn complie这个命令,但是实际上是maven-compiler-plugin这个插件在起作用。

而install这个阶段,对应的mvn install命令,实际上是maven-install-plugin这个插件在起作用。

5.总结

在实际开发中,我们用到Maven对我们的项目进行管理的地方,就是通过在pom.xml文件中添加所需第三方jar包的坐标让maven在中央仓库中找到相应的jar包资源然后下载到本地仓库中为我们使用。有了maven以后,我们在用到第三方jar包时就不需要再去网上找相关的jar包进行下载及导入到path环境中,maven为我们的项目开发进行了很好的管理。

我后面会总结自己用maven+SSM框架进行一个秒杀系统开发的全过程,详情请点击用Maven+SSM框架写一个秒杀系统教程

2018.3.19更

欢迎加入我的Java交流1群:659957958。群里目前已有1800人,每天都非常活跃,但为了筛选掉那些不怀好意的朋友进来搞破坏,所以目前入群方式已改成了付费方式,你只需要支付9块钱,即可获取到群文件中的所有干货以及群里面各位前辈们的疑惑解答;为了鼓励良好风气的发展,让每个新人提出的问题都得到解决,所以我将得到的入群收费收入都以红包的形式发放到那些主动给新手们解决疑惑的朋友手中。在这里,我们除了谈技术,还谈生活、谈理想;在这里,我们为你的学习方向指明方向,为你以后的求职道路提供指路明灯;在这里,我们把所有好用的干货都与你分享。还在等什么,快加入我们吧!

2018.4.21更:如果群1已满或者无法加入,请加Java学习交流2群:305335626 。群2作为群1的附属群,除了日常的技术交流、资料分享、学习方向指明外,还会在每年互联网的秋春招时节在群内发布大量的互联网内推方式,话不多说,快上车吧!

6.联系

If you have some questions after you see this article,you can tell your doubts in the comments area or you can find some info by clicking these links.

坚持原创技术分享,您的支持将鼓励我继续创作!