写作背景
初次接触到Maven已经是N年前,最开始写项目时还是采用将jar放到项目lib文件夹中的方式去使用,后来公司采用了Maven,也就开始学习了,不过对Maven的印象仅仅是停留在使用Maven去下载jar以及对项目结构的管理。这次来到新公司第一个项目就是转换release小项目,一开始想要做成Maven插件的方式,但是我不会,所以就降低了难度。再后来第二个项目中应用了各种maven插件,也不知道他们的用法,于是打算从头把maven学习一下
什么是maven
maven是一个意第绪语单词,含义大致为知识的累加,最开始是作为简化Jakarta Turbine项目所做的尝试。这些项目每一个都有自己的Ant构建文件,但是却只有很小的区别,但却要每个项目都写一次。于是开发人员就想要创造出一个构建项目的标准方式、一个关于项目构成的清晰定义,一个发布项目信息的简单方式以及一个能够在多个项目中共享JAR的方式。
发展的结果就是一个能够用来构建和管理任何Java项目,并能够减轻Java开发者的工作的一个工具,这就是maven。
在平时开发中我们使用到最多的就是Maven对于jar的管理以及对于项目结构的管理
快速入门
安装与配置
下载
以windows平台为例,首先进入Maven下载地址
选择适合自己系统的版本,笔者这里为选择apache-maven-3.8.1-bin.zip
,之后解压到自定义目录
这里为``
配置环境变量
- 进入环境变量配置窗口
类似与配置JDK
,我们需要配置Maven
的环境变量
桌面右键此电脑
,选择属性
,点击右侧高级系统设置
,弹出的窗口中点击环境变量
- 创建MAVEN环境变量
点击下方系统变量中的新建按钮,变量名填写M2_HOME
(一般Maven 2.0之后都用M2_HOME而不是MAVEN_HOME),变量值填写Maven的路径,点击确定
- 添加M2_HOME至PATH
- 测试是否生效
打开命令行,输入
mvn --version
如果可以输出版本信息,则证明配置成功
设置本地仓库
-
创建本地仓库文件夹
Maven会负责对我们平时用到的jar进行管理,默认会在${user.home}\.m2\repository
中进行保存,这里我们不想再C盘保存而是使用自定义路径保存,此时需要创建一个文件夹来存放jar,如:E:\tools\maven\repository
-
修改Maven配置文件的本地仓库路径
进入M2_HOME/conf
文件夹,可以看到Maven的配置文件setting.xml
,编辑该文件,可以看到根标签<settings>
后的被注释的<localRepository>
标签,此标签作用为配置本地仓库。我们需要编写如下配置
<localRepository>E:\tools\maven\repository</localRepository>
至此,Maven简单配置就到此完毕
Maven项目基本结构
在自定义目录创建一个学习文件夹,如我这里为E:\workspace\maven-study
使用命令行或类似工具进入该文件夹
执行命令如下命令
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
该命令是使用archetype
插件中generate
的goal
去生成项目,后边是一些参数,等待命令完毕之后会看到创建了一个maven项目,它的结构为
这是Maven
项目的标准结构:
src/main/java
目录存放的是工程的的源代码src/test/java
目录存放的是单元测试源代码pom.xml
是Maven
中最重要最核心的配置文件,全称为Project Object Model
,即项目对象模型,里边描述了模块之间的关系、jar
的依赖,插件的依赖等
其中还有几个路径也需要我们记住
src/main/resources
目录存放了工程的资源文件,如.properties
、.yaml
、.xml
等文件,也就是非.java
文件src/test/resources
目录存放了单元测试用的资源文件- ``
使用IDEA
创建一个Maven
项目
点击IDEA
菜单栏中的File
->New
->Project...
,弹出的窗口中选择Maven
,右侧勾选Create from archetype
,下方往下滑,选择org.apache.maven.archetypes:maven-archetype-quickstart
,点击Next
按钮
下一个Maven基本设置窗口中修改项目名称,这里为maven-demo
,点击Next
下一个窗口要对Maven
进行设置
Maven home directory
填写Maven
的安装路径,也可以使用默认的IDEA
自带的mavenUser Setting file
选择Maven
的配置文件,即M2_HOME/conf/setting.xml
Local Repository
填写本地仓库的路径
点击Finish
,等待程序创建完毕
多模块Maven项目
有时候一个项目比较复杂,可能需要多个可单独开发/部署的模块,以便每个模块都可以打包成jar
/war
供其他程序应用,或能够单独部署,那么这时候就可以考虑多模块Maven
项目。比如我现在想要开发一款音乐软件,需要有一款免费版的,提供基础的功能,需要单独部署。还需要提供一款高级VIP版,除了基础功能以外,还需要提供一些诸如去广告、支持自定义头像、提供个性化菜单等功能,也需要单独部署。两个模块都隶属于一个应用,而且部分基础功能都相同,那么我们就可以按照如下结构定义该项目。
music-parent
:一个总项目,也可以称为父模块,用来组织子模块。music-core
:核心模块,包含通用的方法以及配置等music-standard
:用来提供一个可用的基础免费版music-advanced
:用来提供一个可用的高级收费版
创建父模块
首先创建music-parent
项目,点击菜单栏File
->New
->Project
,弹出的窗口中选择Maven
,右侧勾选Create from archetype
,下方选择org.apache.maven.archetypes:maven-archetype-quickstart
,点击Next
在第二个窗口中填写项目信息,可以根据自己的情况填写,其中GroupId
、ArtifactId
、Version
先不用理解什么意思,将ArtifactId
和Name
填写为music-parent
,之后点击next
确认好Maven
配置信息后直接点Finish
等待Maven
创建项目完毕,至此父模块就创建完毕了
创建子模块
接下来我们来创建music-core
模块。
点击菜单栏File
->New
->Module...
像创建父模块一样,选择Maven
->org.apache.maven.archetypes:maven-archetype-quickstart
,点击Next
在第二个窗口中确认parent
为music-parent
,然后接下来修改模块信息,如下图所示
最后第三个窗口直接点击Finish
,等待Maven
执行结束,至此第一个子模块就创建好了
接下来仿照该模块的创建方式,创建其他的两个模块music-standard
和music-advanced
初步的项目结构如下图所示
但是到这里并没有配置结束,我们先将项目放一下,学习一些其他知识再来优化配置项。
POM
观察我们创建的项目就可以发现,无论是父模块还是子模块,都包含一个pom.xml
配置文件,接下来我们将要学习POM
的相关知识。
项目对象模型(Project Object Model)也成为POM
,是Maven
项目的基本单位
POM
是以.xml
配置文件的形式存在于项目中的,它包含了项目信息以及构建项目的配置详情。当项目去执行一个任务或目标时,Maven
会在当前目录寻找POM
并且读取信息以及配置,最后去执行相应的功能。
POM
可以指定配置信息,如项目的依赖,插件等,也可以制定项目的信息,如版本、描述,开发人员等
最小POM
配置项
POM
至少应该包含如下内容
project
: 根标签modelVersion
:模型版本,现在都是4.0.0
groupId
:项目所属组的ID,可以理解为项目所属的公司、机构、个人的名称/网站倒叙 + 项目所属租名,如org.springframework.boot
,com.google.guava
。
其中spring
的网站为http://springframework.org
,与现在的http://spring.io
通用,倒过来就是org.springframework
,项目为spring boot
所属组名为boot
,所以完整的groupId
为org.springframework.boot
。guava
也同理artifactId
:artifact
意为制品,可以理解为这个项目的名称,表明这个项目的核心功能。如spring-core
、spring-context
、spring-bean
等version
:该group
的artifact
的版本
其中groupId
、artifactId
以及version
这三个值组合在一起就构成了项目的全限定名,采用<groupId>:<artifactId>:<version>
比如我们刚才创建的简单Maven
demo中自动创建的POM
如下
我们将不需要的配置删掉,只留下最低配置
这个POM
描述了该项目的信息
首先是一个根标签<project>
;接下来值是固定4.0.0
的<modelVersion>
标签;<groupId>
表明该项目所属的机构/个人以及group
为org.example;<artifactId>
标签说明了该项目的名称;<version>
表明了该项目的版本。artifact
的全限定名为org.example:maven-demo:1.0-SNAPSHOT
修改多模块配置
远程仓库
生命周期
名词
GOAL
:目标
artifact
:可以理解为项目或者制品,为了防止翻译或者理解有偏差,文章将直接使用artifact
而不是中文翻译后的单词。
dependency
:依赖,表明该项目/模块除了自己的源代码之外,还需要哪些第三方jar或该项目的其他模块