Maven是一个项目管理和构建自动化的工具。对于程序员来说,最关心的是他的项目构建功能。如果说Spring是必须要学习的框架,那么Maven就是Java必须要掌握的工具。
Maven提供了一个命令行工具可以把工程打包成Java支持的格式(比如jar),并且支持部署到中央仓库里,这样使用者只需要通过工具就可以很快捷的运用其他人写的代码,只需要添加依赖即可。
Maven系统架构:
从这个架构里可以看到,借助于中央仓库可以实现代码共享,对于团队协作至关重要。
Maven使用惯例优于配置的原则。它要求在没有定制之前,所有的项目都有如下的结构(其实Java工程目录都是遵循了这个结构规范) :
目录 | 目的 |
---|---|
${basedir} | 存放pom.xml以及所有子目录 |
${basedir}/pom.xml | Maven项目的配置文件 |
${basedir}/src/main/java | 项目java源代码 |
${basedir}/src/main/resources | 项目的资源,比如property文件 |
${basedir}/src/test/java | 项目的测试类 |
${basedir}/src/test/recources | 测试类使用的资源 |
${basedir}是Java工程的根路径,一个Maven项目编译后会产生一个jar(java的一种压缩格式),存放在 ${basedir}/target,编译后的classes存放在 ${basedir}/target/classes。
1、Maven命令
想要使用Maven这个工具,是要在命令行(终端软件)里输入指令的方式来执行的,注意命令要在工程的根目录下执行
mvn clean compile
编译命令,Maven 会自动扫描src/main/java下的代码并完成编译工作,执行完,会在根目录下生成target/classes目录(存放所有的class)。mvn clean package
在compile的基础上,把所有java文件和资源打包成一个jarmvn clean install
在compile和package的基础上,把jar包安装到本地Maven仓库目录里,这个目录是 ${user_home}/.m2。
${user_home}是当前电脑登录用户的目录 。mvn compile exec:java -Dexec.mainClass=${main}
compile + 执行,具体执行入口就是 ${main} (从java文件夹下的第一个包开始)。
这五个核心概念都会运用在Maven配置文件中,Maven配置文件是一个强约定的XML格式文件,它的文件名一定是pom.xml
2、POM(Project Object Model)
- maven坐标
- maven工程属性
- maven依赖
- maven插件
2.1、Maven坐标
<groupId>com.youkeda.course</groupId>
<artifactId>app</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
这四个标签组成了Maven的坐标,所谓坐标就是一种位置信息,Maven的坐标决定了这个Maven工程部署后存在Maven仓库的文件位置,所以这个坐标信息是必须要指定的。
groupId
groupld就像一一个文件夹一样,它的命名和Java的包比较一致,这里一般只用小写的英文字母和字符。比如这里的com.youkeda.course一般来说一个公司会设置自己的groupld,避免和其他公司重合,个人开发者也一样。
artifactId
artifactld有点像文件名一样,在一个groupld内,它应该是唯一的,不能使用 中文或者特殊字符,从规范上来说只能使用小写的英文字母、"."、"-" 、"_"。比如: app、 member .shared这些都可以。
packing
Maven工程执行完后会把整个工程打包成packaging指定的文件格式,默认情况下packaging的值是jar ,所以如果pom.xml文件中没有声明这个标签,那就是jar。还可以是war、ear、pom
version
它基本遵循了软件工程中对版本号的约定。在Maven的世界里,会把一个工程分为两个状态,这也是软件工程里最最常用的规范:
-
SNAPSHOT
这个单词翻译过来的意思是快照,实际上代表了当前程序还处于不稳定的阶段,随时可以再修改,所以在我们开发的时候我们会在版本号后面加上SNAPSHOT关键字 -
RELEASE
RELEASE和SNAPSHOT是对立面的,所以它代表的就是稳定,一般我们正式发布的时候,都会把version改为RELEASE。当然你可以不用特意的加上
RELEASE,因为只要不是SNAPSHOT那就是RELEASE
了解了工程状态之后,我们再来看版本号的约定,在软件工程里,我们一般会用三位数字来表示版本号,所以大概是x.x.x这样的格式,比如说iPhone 11搭配的操作系统的版本是ios 13.1.2 ,正如你所想的这是一个RELEASE版本.
- 第一位代表主版号
- 第二位代表新增功能
- 第三位代表bugfix后的版本
有时候可能只有两位(没有主版号),大家约定好就行,编程过程中约定大于一切
最后还有一个约定,那就是执行mvn clean package 和 install命今生成的jar文件名格式 [artifactId]-[version].jar 比如:app-1.0.0-SNAPSHOT.jar文件
2.2、Maven属性配置
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.target>${java.version}</maven.compiler.target>
</properties>
- java.version
- maven.compiler.source
指定Maven编译时源代码的JDK版本 - project.build.sourceEncoding
指定文件编码格式,一般上utf-8 - maven.compiler.target
指定用哪个JDK编译
2.3、dependencies
一旦我们在pom.xml里声明了dependency信息,会先去本地用户目录下的.m2 文件夹内查找对应的文件,如果没有找到,那么就会触发从中央仓库下载行为,下载完会存在本地的.m2文件夹内。
一般把别人写的代码称为第三方库,自己和团队写的称为第二方库。
中央仓库
前面提到过Maven会把所有的jar都存放在中央仓库里,我们可以通https://search.maven.org/这个网站来搜索jar。可惜的是这个网站部署在国外,在国内访问不到,我们可以访问阿里云的镜像服务器
https://maven.aliyun.com/mvn/search