Maven的宏观作用:
|--通过pom文件配合坐标的形式管理依赖之间的关系以及各个依赖的版本(这里的依赖指jar包、jar包所依赖的jar包等)
|--帮助我们编译java程序,生成对应的class文件
|--帮助我们测试代码的正确性
|--帮助我们打包项目,生成jar文件或者war文件
|--帮助我们部署项目
Maven的具体作用:
|--清理:删除之前项目编译的东西
|--编译:批量将java文件编译为class文件
|--测试:批量对功能进行测试
|--报告:将测试的结果生成报告文档
|--打包:将java程序打成jar包,将web应用打成war包
|--安装:将生成的jar、war包存入仓库
Maven配置注意事项:
|--Maven必须放在全英文层级的目录下
|--配置环境变量时必须依赖JAVA_HOME变量(故意味着不能用绝对路径的形式配置java环境)
|--配置自己的仓库:新建一个全英文路径下的仓库文件夹,将其路劲拷贝到Maven-set.xml文件的LocalRepository标签内(注意改斜杠且移出注释区)
|--Maven仓库的下载流程:本地-->私服(可有可无)-->镜像服务器-->中央服务器
Maven目录结构:
|--项目根目录
|--src文件夹
|--main文件夹
|--java文件夹(里面就是正常的包类结构)
|--resources文件夹(用于放各种配置文件)
|--test文件夹(结构同main文件夹)
|--pom.xml
pom文件结构:
|--坐标:groupId(公司域名的倒叙)+artifactId(项目名称)+version(当前项目版本号),可以理解为groupId+artifactId为java中的包名
|--在Maven中添加依赖(即jar包)是靠坐标进行定位的,同理我们自己写的项目也有自定义坐标,打成包之后别人也可以通过坐标进行定位
|--packaging:用来确定打包成哪种类型的文件,不写的话默认是jar包
|--依赖:dependencies和dependency组合使用,在dependency中加入需要的坐标,Maven则会自动去仓库中进行寻找(相当于没有Maven时候的导包)
|--properties:用来配置Maven的一些属性,例如关联的java版本、编码格式等
|--build:用来配置Maven的相关插件(配合plugins和plugin一起使用)
Maven的生命周期:
|--清理、编译、测试、报告、打包、安装、部署(各个功能都是靠Maven的插件实现的)
Maven常用命令:
|--mvn clean:清理项目之前执行mvn指令生成的文件
|--mvn compile:编译main/java路径下的所有java文件,生成target结果文件,同时也会把main/resources中的文件拷贝到结果文件中
|--注意要先严格创建好maven约束的目录结构,然后在项目层级下才可以运行编译指令
|--compile编译踩坑:如果当前使用的jdk版本与使用的maven版本不是匹配的,需要在pom文件中进行特别指定(如下)
|-- <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<java.version>11</java.version>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
|--mvn test-compile:编译test/java路径下的所有java文件,生成target结果文件,同时也会把test/resources中的文件拷贝到结果文件中
|--注意test-compile和compile用的是同一个target文件夹,如果已经存在,则会直接往里面存
|--mvn test:运行test-compile编译好的测试类的class文件
|--注意junit测试中常会使用其提供的Assert.assertEquals(期望值,实际值)方法做测试
|--mvn package:对项目进行打包,默认生成jar文件存于target结果文件夹中
|--注意只对main路径下的文件进行打包
|--mvn install:将生成的jar文件存入Maven仓库中,这样以后别人引用这个仓库通过坐标就可以使用了
|--mvn deploy:部署项目,使用的少,知道即可
idea中配置Maven:
|--对当前项目进行Maven配置:
|--file ==> setting ==> build,excution,deployment ==> Maven ==> Build Tools
|--修改Maven源(directory)、配置文件引用(file)、仓库(repository)引用为自己准备好的
|--file ==> setting ==> build,excution,deployment ==> Build Tools ==> Maven ==> Runner
|--修改VM Options的值为-DarchetypeCatalog=internal(避免创建Maven工程时下载模板文件,提高创建速度)
|--
|--file ==> setting ==> build,excution,deployment ==> Build Tools ==> Maven ==> Runner
|--修改JRE为自己所使用的JDK版本
|--对新建项目进行Maven配置:
|--file ==> other setting ==>后续操作同对单一项目配置Maven时的操作
|--对新建项目进行Maven配置后以后创建的Maven项目都会自动适应配置,减少重复配置
idea中创建Maven项目:
|--file ==> new ==> project ==> Maven ==> 选择JDK版本、勾选创建模板 ==> 设置项目名及创建路径 ==> 设置项目坐标
|--如果需要创建resources文件夹记得将其设置为资源文件夹格式(可以右键设置也可以在项目结构中设置)
|--常用模板:
|--maven-archetype-quickstart:针对普通SE项目
|--maven-archetype-webapp:针对web项目(但这个模板文件结构缺少较多,需要自己补充)
idea中Maven窗口了解:
|--LifeCycle:生命周期文件夹,里面包含了Maven每一个生命周期的执行工具,双击即可执行
|--Plugins:插件管理文件夹,包含了项目中涉及到的Maven插件
|--Dependencies:依赖管理文件夹,里面包含了项目中所用到的各种jar包及其之间的关系
|--注意窗口左上角有刷新图标,常在因网络不好导致依赖下载不全时使用,令其重新检索下载依赖
依赖的三种范围:
|--compile:说明该jar包在maven项目的每一个环节都可以使用(默认是compile)
|--test:说明该jar包只在maven的测试环节使用,其他环节无法使用
|--provided:说明该jar包可以在编译、测试、报告(即打包之前的环节)中使用
|--可以理解为provided范围适用于一些jar包客户端或服务端会提供,所以我们只需要在编写项目中临时用一下即可
|--依赖范围通过scope标签属性进行设置
pom文件中自定义全局变量:
|--先在properties属性标签中自定义一个标签属性:<自定义标签名>自定义标签值</自定义标签名>
|--在需要用到自定义全局变量的地方通过${自定义变量名}进行调用
|--自定义全局变量常用于多个依赖属于同一个版本的情况,减少代码冗余
资源扫描插件:
|--pom文件的build属性标签中添加如下代码:
|--<resources>
<resource>
<directory>文件目录(一般为src/main/java)</directory>
<includes>
<include>**/*.文件类型(一般为properties和xml)</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
|--作用:maven构建项目时会有自己检索资源的一套规则,故有些位置的文件不会进行检索,配置了资源插件后可以自定义添加maven构建项目时需要扫描的路径及文件
Maven多模块管理注意事项:
|--父工程pom文件中的package标签属性值必须设置为pom且删除src文件夹(注意只要是父工程就需要遵守这两个原则)
|--父工程的pom文件可以被所有子工程所继承使用
|--子工程创建时记得需要指定它的Parent父工程
|--由于父工程中的一些依赖可能子工程并非都能用到,通常在父工程中通过dependencyMangement标签属性来加强管理
|--加强管理后子工程必须要声明依赖的groupId和artifactId,才可以获取到父工程指定的version
|--可以理解为加强管理后父工程变成只是对依赖的版本进行管理,所以父工程的pom文件中常采用自定义全局变量的方式来集中控制版本
|--加强管理后若子工程需要其他依赖或者其他版本的依赖仍可以在子工程pom中进行手动添加,会以子工程的pom为主
|--手动将一个已经存在的工程变成子工程只需在pom文件中加上parent属性标签即可
|--parent属性标签内写父工程的坐标,注意视情况看是否需要写relativePath标签属性