
一、了解Maven1.简介Maven是是 Java 生态里最主流的项目构建 依赖管理工具他可以定义项目结构、项目依赖并使用统一的方式进行自动化构建是java项目不可缺的工具2.为什么要学习Maven提供了一套标准化的项目结构其规范了项目结构方便开发人员开发提供了一套标准化的构建流程一个 Java 项目从代码到可运行程序要经过「编译 → 测试 → 打包 → 部署」等很多步骤。 Maven 把这些步骤做成了标准的生命周期我们只需要配置远程部署地址提供了一套依赖管理机制管理项目的所有jar包maven利用本地仓库统一管理所有jar包传输文件时只需要传输调用代码同时解决了版本冲突问题二、实践1.配置环境虽然不配置maven环境也可以使用ide内置的maven但是无法通过cmd识别命令所以最好还是配置一下首先到官网Download Apache Maven – Maven下载最新压缩包解压后打开C:\Users\Nebula\Desktop\apache-maven-3.9.16-bin\apache-maven-3.9.16\conf中的setting文件在里面修改自己的依赖存储地址然后向下找到镜像源mirror修改为国内镜像源刚开始本地仓库并不是存有所有jar包当jar包不存在时会从maven官方去拉取由于maven官方地址在国外所以拉取速度会很慢这里我们改为国内镜像源就会好很多我添加的是阿里云和华为云的当一方找不到时会向下继续查找mirror idaliyunmaven/id mirrorOfcentral/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/public/url /mirror mirror idhuaweicloud/id mirrorOfcentral/mirrorOf name华为云公共镜像仓库/name urlhttps://repo.huaweicloud.com/repository/maven//url /mirror接下来配置环境变量首先在系统环境变量中添加下图所示变量路径为上面下载压缩包解压后的地址然后在path变量内部添加当前文件中的bin文件最后打开cmd输入下面代码验证mvn -v如果显示版本号代表配置成功IDE中的配置过程略太简单了在设置里自己找就好三、创建Maven型项目1.使用命令行在文件夹中打开cdm执行下列语句mvn archetype:generate2.使用IDE1架构解析约定在这个项目中maven就类似一个脚手架帮你写好了基础架构pom文件是这个项目中最重要的文件之一没有他这个项目就不是一个maven项目它是一个配置文件main文件夹中存放的是项目主体文件。其中的Java包存放的是用java语言编写的主程序内部的org...0806是通过groupid生成的用cmd创建时会有一步让你自定义而resources存放的是除了Java以外项目内所有需要用到的文件如xmlpropertiesyml这样的配置文件、.html.css.js.image这样的静态资源文件不需要Java编译或者jsp等模板页test文件夹中则是用于单元测试的文件Junit最后打包的时候不会保存里面也可以创建resourcestarget文件夹存放的是编译后的文件运行主函数后会自动编译只有按照其指定的方式存放相应类型的文件才能够自动化构建这也就是所谓的约定大于配置我们学习maven主要学习的就是pom.xml的编写划重点2pom文件解析首先这一行代码可以无视他的意思大概为maven版本相关的内容modelVersion4.0.0/modelVersion重点关注的是后面groupIdartifactId和version这三条语句他们共同组成的是坐标信息本项目工程的坐标信息别的项目引用需要通过他们是每个项目唯一的groupIdorg.example/groupId!-- 域名反过来 -- artifactIdProject060806/artifactId!-- 项目名 -- version0.0.1-SNAPSHOT/version!-- 意义是注释为还没上线的快照版 -- nameProject060806/name descriptionProject060806/description url/!-- 官方地址标注可有可无相当于注释 --那么我们如何通过坐标信息去引用别的jar包呢这里边需要使用到dependencies依赖 语句称为添加依赖一个依赖可以包含多个jar包当需要坐标信息时可以去中央仓库https://mvnrepository.com/寻找注意依赖内部有一个语句叫做scope限定的是依赖的范围如果规定了范围那么只有在对应的类里面可以创建对象调用该依赖里面的一些方法--依赖范围 有哪些范围 编译main/java 测试main/test 运行/打包包内 provided 编译√ 测试√ 打包× sevlet test 编译× 测试√ 打包× junit compile 编译√ 测试√ 打包√ 默认 runtime 编译× 测试√ 打包√ 反射数据库驱动jar包——class.forName() system provided 不会依赖仓库中的jar包二十引用本地物理路径的jar包systemPath/systemPath一般不使用system 注意依赖范围只是一个建议即使所有的都默认也不会影响功能的正常运行而且一般从中央仓库获取的代码自带scope自动补全也可以使用但事实上90%都是默认即可 --接着我们来编写属性变量这里的语句是properties通常内部设置的是依赖的版本方便统一管理修改以servlet为例用法如下properties java.version17/java.version javax.sevlet.version3.1.0/javax.sevlet.version /properties dependency groupIdjavax.servlet/groupId artifactIdjavax.servlet-api/artifactId version${javax.sevlet.version}/version scopeprovided/scope /dependency除此之外还有一个语句叫做packaging作用为设置打包方式不写的话默认为jar包由于jar 包本身不带 Servlet 容器你想让普通maven项目能跑起来需要自己手动做 Spring Boot 帮你做好的所有事所以一般改为war包输出更改以后需要去文件-项目结构中更改对应文件根指向文件夹注意由于war包运行需要借助外部工具Tomcat所以需要配置Tomcat首先先去Tomcat官网去下载Apache Tomcat®——欢迎Java17推荐使用Tomcat 10.1.x版本下载完毕后去设置内添加服务器设置完成后需要运行时便可以在编辑配置选项中添加Tomcat运行接着在部署选项内添加需要运行的程序即可这样便可以运行一个war包程序了补充知识1——依赖传递传递性我们假设B内置了mysql依赖而A需要同时调用B和mysql此时是否需要重新导入B和mysql的jar包呢答案是不需要但具体情况仍需讨论注意war包不可以被别的包引用如果B中的mysql依赖作用范围不包含jar包install那么这里就不会导入B的mysql或者dependency中还有一个内置标签optional默认是false代表会传递,改成true则不会传递optionalfalse/optional补充知识2——依赖排除上面两种阻止依赖传递的方法仅限于我们拥有修改B的权限时可以使用当B不归我们管时我们又该怎么办呢有没有什么办法可以手动排除呢有的这里需要用到dependency中的另一个标签exclusion在这个标签内部可以填写需要排除的依赖的groupId和artifactId由于仅存在一个版本所以不需要填写版本号exclusion groupIdxxxxx/groupId artifactIdxxxxxx/artifactId /exclusion或者我们也可以单独添加一个全新的MySQL依赖不同于之前B版本的即可会顶替掉原来的依赖虽然传过来了但不会用上面的方法压根就没传过来即当我们在自己的工程内添加一个系统的依赖时不同的版本会以我们自己的工程依赖优先跟前后引入顺序无关4聚合工程很多时候我们一个实际工程需要由多个模块小项目聚合而成如果每个项目都是分离开的话一个一个窗口去切换修改的时候未免有些太繁琐麻烦那么我们有没有什么办法能够把不同的多个有一定联系的项目聚合到一个窗口内呢当然有方法虽然官方没有对应的功能模块但是我们可以自己手动操作一下首先创建一个全新的项目然后按照下列步骤执行删除src文件夹聚合项目本身只用于管理项目子工程并不需要运行什么代码修改install配置将pom中的packaging输出格式修改为pom表示当前不是一个具体的包创建模块在项目大包右键创建模块parent设置为none配置模块在聚合项目pom文件中添加modules标签用来管理模块modules module模块名/module module模块名/module /modules注意这里当我们再在任一模块中添加依赖后不需要再安装到本地仓库同聚合项目内的其他依赖了本模块的项目便可自动感知到配置中新添加的依赖说明此时处于同一根目录下可以直接读取对应配置而不是获取jar包后读取当我们执行聚合项目的生命周期时所有子模块会同时执行对应maven操作5Maven的继承还是以上面MySQL依赖需求为例假设这里我们公司要求A和B统一MySQL版本有没有什么办法可以让A和B同一聚合项目中的两个模块获取到公司统一的MySQL依赖呢有的只需要在聚合项目的配置文件pom中添加要求版本的依赖然后再在需要用到的子模块配置文件pom中添加标签parent把聚合项目的版本号填进去即可但是这样做的话会有一个问题就是所有子工程都会加载这个依赖有的子工程可能压根用不到这个依赖怎么解决这个问题呢我们可以使用dependencyManagement标签在总项目配置文件中添加这个标签后在其内部引入非必须的依赖然后子工程在导入依赖时虽然还需要写groupId和artifactId但是无需写版本号相当于统一了版本号dependencyManagement dependencies dependency -- 这里填写对应依赖 -- /dependency /dependencies /dependencyManagement其实添加parent这一步在创建项目时可以选择自动创建但这里为了演示原理上面创建的时候勾选的是none至此基本的用法便讲完了后面有一些补充会更新在这里