maven学习手记
Maven——强力好用的Java项目管理工具
Maven在美国是一个口语化的词语,意思是专家,内行。也相当于汉语中的老炮儿,老师傅。正所谓老炮儿在手,管理无忧。
我们要学的Maven,实际上是一个项目管理工具,可以对项目进行构建、依赖管理。经过发展,Maven已经不仅仅可以管理Java项目,也可以对例如Ruby,Scala等语言编写的项目进行项目管理。
参考教程/文档:
Maven简介
Java项目管理工具的历史与发展
对于Java项目管理工具,主要有三个主要工具,Ant、Maven以及Gradle(按照出现时间)。最开始的Java项目管理工具是Ant,之后才出现了Maven,严格来说,Ant和Maven之间是兄弟关系,都是Apache基金会的项目。对于现行的Java企业开发来说,Ant已经销声匿迹,而新出现的Gradle发展迅速,大有取代Maven地位的趋势,不过就目前来讲,Maven仍是Java项目管理工具中的王者。
对于三个管理工具的简单接受和分析,百科及大量的博客已有介绍,我也不再赘述,这里推荐一下朋友Matty写的简单介绍。(学习使用Maven构建项目,1.2节)
Maven的组成
Maven是一个项目管理工具,它包含了:项目对象模型 (POM,Project Object Model),项目生命周期(Project Lifecycle),依赖管理系统(Dependency Management System)和各种插件。插件主要用来实现生命周期各个阶段(phase)的目标(goal)。Maven的组成如下所示:
不过,上述介绍对于完全没有 Maven 实践经验的人来说,看了等于没看,并没有用处。只有当读者通读本站内容之后,反过头再看,才能豁然开朗。(Maven教程网)
Maven的特性
依赖管理系统。Maven使用groupId,artifactId,version组成的“坐标”来标识依赖。当项目需要引入一个外部依赖时,只需在配置文件里添加几行代码;如果项目所依赖的Jar包需要升级时,只需要修改配置文件中的一行。
多模块构建。
在Maven中,可以为当前项目定义一个parent POM(实际上是一个pom.xml文件),该POM中可以使用modules配置来定义一组子模块。parent POM不会有实际构建的产出,但parent POM中的build配置以及dependencies配置都会自动继承给子模块。
一致的项目结构。Maven通过指定一套项目目录结构为标准的Java项目结构,解决了不同IDE带来的文件目录不一致的问题。
对于这个标准的项目目录结构,网上的讲解和图片非常多,另外这个目录一般都是Maven自动生成,我们只需要知道什么文件应该放在什么文件夹即可。
推荐阅读:Maven标准项目目录-Maven教程网
一致的构建模型和插件机制
准备工作
学习Maven的准备工作分为两个部分,官网下载zip包并解压,配置环境变量。这里的具体步骤参考Maven下载与安装
我自己在按照教程配置环境变量的时候,出现了以下的一个报错: could not create the JAVA virtual machine。经过搜索,发现这是由于MAVEN_OPTS设置异常导致。错误的地方非常好笑,就是变量配置少了一个空格。
还是那句话,要相信自己在配置过程中遇到的所有问题,都会有人遇到过,并且都能在网上找到解决方法。
在执行第一次Maven命令时,默认会在用户目录下的.m/respository中下载依赖,这个位置在Maven中称为仓库。如果需要修改,可以在Maven目录中的setting.xml文件中修改。(这里建议修改,方便文件管理)
Maven中的仓库
在Maven中的任何一个依赖,插件或者项目构建时的输出,都称为”构件“。对于这些构件,Maven仓库都可以帮助我们管理。此外,仓库是一个位置,在项目中引入的第三方库的位置,在Maven中就称为仓库。
仓库的原理
我们使用Maven的第一目的就是可以更好的管理我们的项目(主要是Java项目),管理项目其实就是管理依赖和第三方库(也即是Jar包)。仓库本质上就是一个用来放置Jar包的地方。在本地开发时,会查看仓库中是否有Jar包,有就直接用,没有就从远程仓库下载。所以项目,本地仓库以及远程仓库的依赖关系就是:项目依赖于本地仓库,本地仓库依赖于远程仓库。
三种Maven仓库类型
- 本地仓库(local):本机放置构件的地方,Maven从远程仓库下载的构件都存放在此处。需要注意的是,本地仓库只有在执行第一次Maven命令时才会生成,默认路径在用户目录下一个.m/respository中。如果需要修改,可以在Maven目录中的setting.xml文件中修改。
- 中央仓库(central):这是Maven社区提供的仓库,里面包含常用类库。不过由于Maven社区的服务器在海外,国内访问下载类库的速度偏慢,有时候甚至会断连,针对这个原因,我们同样可以在Maven目录中的setting文件中修改配置文件,将下载地址变更为国内阿里的镜像网址。
- 远程私服(remote):一般指公司内部使用的仓库。
Maven项目的目录结构
上面说过,Maven的一大特性之一就是规定了一致的项目目录结构,因此在不同的IDE中创建的Maven项目都是一致的,不存在目录不兼容的问题。
目录 | 存放 |
---|---|
${basedir} | pom.xml和所有子目录 |
${basedir}/src/main/java | 项目的Java源码 |
${basedir}/src/main/resources | 项目的资源文件,例如.property文件、图片等 |
${basedir}/src/test/java | 测试使用的Java源码 |
${basedir}src/test/resources | 测试使用的资源文件 |
${basedir}/target(自动生成) | 所有输出 |
${basedir}/target/classes(自动生成) | 编译后的class文件 |
- pom.xml是最核心的配置文件,记录Maven项目所需要的素有jar包的依赖以及所有插件的依赖
- 上面的目录命名和层次结构都是固定的,需要注意不要写错大小写和单复数
实操:使用IDEA创建Maven项目
在IDEA中选择新建项目,接着选择Maven,然后勾选从原型创建,在下面的原型中选择quickstart,之后进行下一步。
接下来就是为项目命名,此外,还可以在下方的工件坐标中修改三个基础标识。
第三步就是选择Maven的主路径,用户设置文件和本地仓库地址。在这里需要注意检查以下对应的路径是否正确。点击完成后IDEA便会开始初始化,并下载对应的依赖和插件等。
最后一步,quickstart原型中是不会有resources目录文件的,需要我们参考标准目录结构在main和test中分别创建对应的文件夹,并标记为资源根和测试资源根。
我这里截图中的文件夹名打错了,后面已经更改。
在初次构建Maven项目的时候,一般来说是会要出现意外的。例如我在创建的时候就出现了两个比较大的问题。
第一个是这个问题,这个报错原因是我下载的Maven版本是3.8.6,但是IDEA版本是2021。这两个版本之间不兼容。是的,就是不兼容,解决方法很简单,把Maven版本降低就好了,最好是3.6版本。这个坑是我第二次踩了,之前是使用eclipse创建web项目时发现自己的版本是社区版,并不支持Web项目,一番操作之后才得以解决,这次又是一番折腾。血的教训,下载任何东西记得先看看版本是否可用
这是第二个问题,在远程目录中找不到原型(比起上一个问题还行,这个只是一个警告)。导致原因也没太搞懂,因为我已经更换国内镜像源了,还是会出现此处错误。
此处贴一个解决方案: 解决方法:No archetype…
到这里,就算使用Maven构建了一个Java项目了,但是到这里还差最后一步,修改默认pom中的设置。
引用搬运自学习使用Maven构建项目
修改pom.xml (quickstart通用操作)
针对Java项目的pom.xml修改方案,是所有用quickstart模板创建的项目的通用操作。
必须把JDK版本从默认的1.7改成你正在使用的版本
可以删除多余的junit依赖
可以删除多余的
配置(可以把标签块折叠起来再删,避免误删)
为什么是多余的?
一般是用在父pom中的,有点Java抽象类的意思,只是一种声明,实际上Maven并不会为当前项目下载里面的那些插件。所以,如果你构建的不是多模块项目,或者虽然构建了多模块项目但是没有什么需要被子模块继承的插件声明,或者你压根不知道什么是多模块项目,那么这个配置对你来说就是多余的。 扩展资料:
Maven中plugins和pluginManagement的区别 - hxwang - 博客园
java - What is pluginManagement in Maven’s pom.xml? - Stack Overflow