Maven基础
问题
不再支持源选项 5。请使用 8 或更高版本
解决方法:更新plugin(在pom文件中添加配置,并重新加载配置文件)
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version> <!-- 使用最新版本 -->
<configuration>
<source>8</source> <!-- 设置源代码版本为 Java 8 -->
<target>8</target> <!-- 设置目标代码版本为 Java 8 -->
</configuration>
</plugin>
<!-- 其他插件 -->
</plugins>
</build>
简介
资料格式
- 配置文件(绿色)
- java代码文件(蓝色)
- 示例(粉红色)
- Windows指令 命令(黑色)
概念
问题
jar包不统一,jar包不兼容
工程升级维护操作繁琐
解决办法
Maven
本质(由java写成,思想为面向对象) 其中红色字体的和为maven,上面为我们操作部分
maven本质是一个项目管理工具,将项目开发和管理过程抽象成一个对象管理模型(POM)
POM:项目对象模型
中央仓库<---私服(私服仓库)<---本地(仓库)<---依赖管理(Dependency) <---> 项目对象模型(POM)--->pom.xml
实现原理
构建生命周期(Build lifecycle &phases)<----> 插件(多个)---->jar包或源代码或帮助文档或war包或xml
Maven作用
- 项目构建:提供标准的、跨平台的自动化项目构建方式
- 依赖管理:方便快捷地管理项目依赖的资源(jar包),避免资源间的版本冲突问题
- 统一开发结构:提供标准的、统一的项目结构
Maven的下载与安装
下载
官网:Maven – Welcome to Apache Maven
下载地址:Maven – Download Apache Maven
解压
里面的文件说明
bin:核心运行文件
boot:类加载器
conf:核心配置
lib:依赖的jar包
配置环境
- 依赖java,需要配置JAVA_HOME
- 配置MAVEN自身的运行环境,需要配置MAVEN_HOME
配置MAVEN
- 在系统变量中新建一个MAVEN_HOME的变量,值为解压之后的Maven文件夹路径地址
- 在系统变量中的path中新建一个%MAVEN_HOME%\bin的环境
- 在cmd测试有无配置成功,在cmd中输入mvn即可,如下图(不是“不是内部或外部指令,也不是可运行的程序”即可)
基本概念
仓库(用于存储资源,包含各种jar包)
本地仓库
下载之后,放于本地的仓库,为本地仓库(如果本地仓库没有需要用到的jar包,就会去中央仓库或私服仓库获取)
远程仓库
中央仓库
在云端的计算机保存,对应存储jar包的服务器叫做中央仓库,Maven团队,包含99%
私服仓库(速度快)
本地连接私服,私服连接中央仓库
私服仓库的作用:1.中央仓库存放的为开放的开源的资料,不开源的资料上面没有,自己的产品可以放私服中
坐标(对每个资源进行定位)
坐标的概念
Maven中坐标用于描述仓库中资源的位置
坐标的组成
groupId:定义当前Maven项目隶属组织名称(通常是域名反写,例如:org.mybatis)
artifactId:定义当前Maven项目的名称(通常是模块名称,例如:CRM、SMS)
version:定义当前项目的版本号
packaging:定义该项目的打包方式(不属于Maven坐标,但会使用)
书写方式直接在:https://mvnrepository.com/网站搜索后,复制即可
如:
1.打开网站,搜索想要的jar包
2.点击想要的jar包
3.复制下图中Maven中的代码,即为坐标
Maven坐标的作用
使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交由机器完成
本地仓库配置
寻找本地目录
打开命令行,输入mvn回车,会生成一个空的文件夹目录
配置本地目录
- 在想要放置本地仓库的位置创建repository文件夹作为本地仓库
- 返回Maven的安装目录,打开conf文件夹,里面有一个文件为setting.xml为Maven的设置文件
- 打开后,找寻到 标签 localReposity 将其中默认的<localRepository>/path/to/local/repo</localRepository>改为<localRepository>创建的本地仓库的路径</localRepository>
远程仓库的配置
在Maven中lib文件夹随便使用winRAR打开一个jar包,上点一层,回到根下,点击查找文件名为pom*.*
寻找文件pom-4.0.0.xml,选中,点击定位,目录就切至pom-4.0.0.xml所在目录中,打开文件,寻找repositories
URL为真正的来源,国外的服务器,比较慢,可以更改,阿里云有一个镜像仓库,我们可以更改上方的setting.xml,将里面的mirrors里面的改为以下即可
<mirror>
<!-- 此镜像的唯一标识,用来区分不同的mirror元素 -->
<id>aliyunmaven</id>
<!-- 对哪种仓库进行镜像,简单地说就是替代哪一个仓库 -->
<mirrorOf>central</mirrorOf>
<!-- 镜像名称 -->
<name>阿里云公共仓库</name>
<!-- 镜像URL https://maven.aliyun.com/repository/public 或 https://maven.aliyun.com/nexus/content/groups/public-->
<url>https://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
或
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>aliyun</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
全局setting与用户setting区别
全局setting定义了当前计算器中Maven的公共配置
用户setting定义了当前用户的配置
做法:
将setting.xml文件复制到repository目录下进行二次配置为用户setting,可以覆盖全局setting
生成Maven项目
手工制作(目录如下 test为写测试程序,java为写java源代码,resource为写配置文件)
test中可以使用Assert.assertEquals(预计值,真实值);测试程序是否正确,包为:
org.junit.Test
org.junit.Assert
最后配置pom.xml 文件即可
Maven命令(命令行形式,可执行多个命令,用空格隔开即可)
命令 | 说明 |
mvn compile | #编译 |
mvn clean | #清理 |
mvn test | #测试 |
mvn package | #打包 |
mvn install | #安装到本地仓库 |
测试完成后,surefire-reports文件夹中有测试结果
打包指令执行顺序:编译+测试+打包(保障项目的准确性)
插件创建工程
mvn archetype:generate
idea创建工程
配置Maven
依赖管理
依赖配置(项目所需要的jar包,通过依赖引进项目)
格式
<dependencies>
<dependency>
<--群组id-->
<groupId>junit</groupId>
<--项目id-->
<artifactId>junit</artifactId>
<--版本号-->
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
依赖传递(依赖具有传递性)
将一个项目配置到另一个项目,将项目的坐标复制,添加依赖进去即可,添加后,也可以使用添加项目的依赖,称为依赖传递
直接配置的为直接依赖
间接依赖,被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源
依赖传递中的冲突问题
路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越潜,优先级越高
声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的
特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的
可选依赖(对外隐藏当前所依赖的资源)
在单个依赖中加
<optional>ture</optional>
排除依赖(主动断开依赖的资源,被排除的资源无须指定版本号)
<dependency>
<groupId>被依赖的项目的坐标</groupId>
<artifactId>被依赖的项目的名</artifactId>
<version>被依赖的项目版本号</version>
<exclusions>
<exclusion>
<groupId>需要排除的依赖坐标</groupId>
<artifactId>需要排除的依赖名</artifactId>
</exclusion>
</exclusions>
</dependency>
依赖范围
<scope>范围值</scope>
范围值 | 说明 |
test | 测试程序范围有效(test文件夹范围内) |
provided | 主程序和测试程序范围有效,如servlet-api,网站有一个,有的不支持本地的打包上去就崩了,已提供依赖范围。使用此依赖范围的maven依赖对于编译和测试classpath有效,在运行时无效。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行的时候容器已经提供,就不需要重复引入了 |
compile | 默认(都参与) |
runtime | 只参与打包(如:com.musql.jdbc,在程序中只写了驱动类名)运行时依赖范围。使用此依赖范围的maven依赖对于测试和运行classpath有效,但在编译主代码时无效。典型的例子是JDBC的驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动 |
system | 系统依赖范围。该范围与三种classpath的关系和provider依赖范围完全一致。但是使用system范围的依赖时必须通过systemPath元素显示地指定依赖文件的路径。由于此依赖不是通过maven仓库解析而且与本机系统绑定,可能造成构建的不可移植因此应该谨慎使用。systemPath元素可以引用环境变量 |
依赖范围(scope) | 对于编译classpath有效 | 对于测试classpath有效 | 对于运行时classpath有效 | 例子 |
compile | Y | Y | Y | spring-core |
test | - | Y | - | JUnit |
provided | Y | Y | - | servlet-api |
runtime | - | Y | Y | JDBC实现 |
system | Y | Y | - | 本地的,maven仓库之外的类库文件 |
依赖范围的传递性
生命周期与插件
compile--->test-compile--->test--->package--->install--->
三个阶段
clear(清理工作)
default(核心工作,例如:编译、测试、打包、部署等)
site(产生报告,发布站点等)
插件
- 插件与生命周期进行绑定,在执行到对应的生命周期时执行对应的插件功能
- 默认Maven在各个生命周期都绑定有预设的功能
- 通过插件可以自定义其他功能
配置插件
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>目标</artifactId>
<version>版本号</version>
<executions>
<execution>
<goals>
<goal>jar</goal>
</goals>
<phase>停止时期</phase>
</execution>
</executions>
</plugin>
</plugins>
Maven高级
分模块开发与设计
工程模块与模块划分(接口通信)
聚合(多模块构建维护)快速构建项目
方法
创建一个新工程,管理其他工程(防止某个工程更新后,其他工程没有及时更新,会产生错误等)
该新工程只需要pom.xml文件即可,不需要src等
pom.xml中设计
<!--添加定义该工程用于进行构建管理-->
<packaging>pom</packaging><!--packaging 中默认为jar,pom为聚合工程,war为web工程-->
<!--管理的工程列表-->
<modules>
<!--具体的工程名称-->
<module>../要管理的工程名</module>
<module>../要管理的工程名</module>
<module>../要管理的工程名</module>
<module>../要管理的工程名</module>
</modules>
可以在聚合工程中一起编译操作等(编译的顺序与写入顺序无关,与依赖关系有关,底层依赖先编译)
继承(模块依赖关系维护)简化配置
步骤
- 在聚合工程中的pom.xml文件中定义所有要使用的依赖
<!--声明此处进行依赖管理-->
<dependencyManagement>
<!--所有的依赖-->
<dependencies>
<!--具体的依赖-->
<dependency></dependency>
<dependency></dependency>
<dependency></dependency>
<dependency></dependency>
</dependencies>
</dependencyManagement>
- 在其他工程中继承(把子工程的版本号全部删除即可)
<!--定义该工程的父工程-->
<parent>
<!--父工程的坐标(如果组织Id相同,子工程可以不写),名称及版本号(版本号尽量与父工程改为一致)-->
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<!--相对路径 直接指向父工程中的pom.xml文件即可-->
<relativePath>../父工程坐标/pom.xml</relativePath>
</parent>
同理,插件管理、项目版本号管理也是一样的,可继承的资源如下:
属性
- 自定义属性
<properties>
<!--名称可以随意,一般定义为技术名称+version 定义版本号-->
<!--然后在对应版本号中填入${属性名}即可-->
<junit.version>3.8.1</junit.version>
</properties>
<dependencies>
<!--具体依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
- 内置属性(使用maven内置属性快速配置,调用格式${属性名})
- setting属性(用于动态配置,调用格式${setting.属性名})
- java系统属性(作用:读取Java系统属性,调用格式:${属性名} 系统属性查询方式:mvn help:system)
- 环境变量属性(动态配置,调用格式为:${env.属性名},查询方式:mvn help:system)
版本管理
工程版本
SNAPSHOT(快照版本)
- 项目开发过程中,为了方便团队成员合作,解决模块间相互依赖和时间更新问题,开发者对每一个模块进行构建的时候,输出的临时性版本叫做快照版本
- 快照版本会随着开发的进展不断更新
RELEASE(发布版本)
- 项目开发到进入阶段里程碑后,向团队外部发送较为稳定的版本,这种版本所对应的构建文件是稳定的,即使进行功能的后续开发,也不会改变当前发布版本的内容,这种版本称为发布版本
约定规范(<主版本>.<次版本>.<增量版本>.<里程碑版本>)
- 主版本:表示项目重大架构的变更,如:spring5相较于spring4的迭代。
- 次版本:表示有较大的功能增加和变化,或者全面系统的修复漏洞。
- 增量版本:表示有重大漏洞的修复。
- 里程碑版本:表明一个版本的里程碑(版本内部)
资源配置(pom.xml中设置的属性需要在其他资源文件中使用)
- 在build中定义资源文件参与这种形式的使用(如果test中也需要,那么可以复制一份,将resources改为testResources,将resource改为testResource,再将对应的路径更改即可)
<!--配置资源文件对应的信息-->
<resources>
<resource>
<directory>文件对应的目录(相对路径)或者${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
多环境开发配置
- 定义多环境
<!--创建多环境-->
<profiles>
<!--定义具体环境-->
<profile>
<!--定义环境的唯一名称-->
<id>produce_env</id>
<!--定义环境中专用的属性值-->
<properties>
<!--写入环境-->
</properties>
</profile>
<!--定义开发环境-->
<profile>
<!--定义环境的唯一名称-->
<id>develop_env</id>
<properties>
<!--写入环境-->
</properties>
<!--设置默认启动-->
<activation>
<activeByDefault>true<!--是否默认启动--></activeByDefault>
</activation>
</profile>
</profiles>
- 使用(可以创建新的Maven配置,在运行的位置加-p 加环境id即可,即:mvn 指令 -p 环境定义id)
在调用install时,更改即可
跳过测试(提高开发效率)
应用场景
- 整体模块功能未开发
- 模块中某个功能未开发完毕
- 单个功能更新调试导致其他功能失败
- 快速打包
- ···
方法
- 关闭测试功能,直接在Maven管理中跳过
- 使用命令-D skipTests
- 配置跳过测试的文件
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
跳过测试扩展(跳过某几个测试或只测试某几个 其中包和文件支持通配符,如以Test结尾的java文件可以写为 *Test.java)
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<!--包含指定的用例-->
<includes>
<include>包/文件(如果任意包可以改为**/文件)</include>
</includes>
<!--排除指定的用例-->
<excludes>
<exclude>包/文件(如果任意包可以改为**/文件)</exclude>
</excludes>
</configuration>
</plugin>
私服
私服nexus服务器的安装
说明
nexus是Sonatype公司的一款Maven私服产品
下载
启动服务器
输入命令: nuxus /run nexus
访问地址为:http://localhost:8081
更改配置
修改端口号在文件夹etc 中 nexus-default.properties
修改服务器相关配置在bin文件夹中的nuxus.vmoptions
仓库分类
- 宿主仓库hosted
-
- 保存无法从中央仓库获取的资源
-
-
- 自主研发
- 第三方非开源项目
-
- 代理仓库proxy
-
- 代理远程仓库,通过nexus访问其他公共仓库,例如中央仓库
- 仓库组group
-
- 将若干个仓库组成一个群组,简化配置
- 仓库组不能保存资源,属于设计型仓库
资源获取
直接从私服获取即可
资源上传
上传时提供对应的信息
- 保存的位置(宿主仓库)
- 资源文件
- 对应坐标
资源上传与下载
- 访问私服的用户名和密码
- 找到setting文件,配置本地仓库访问私服,进去后寻找servers标签,在serves中配置server,指定用户名和密码(servers只能有一个)
<!-- 配置访问服务器的权限,用户名和密码 -->
<servers>
<server>
<!--名称可以自定义,但是可以在私服中统一定义,防止出错-->
<id>suimeng-releases</id>
<!--私服的用户名-->
<username>suimeng</username>
<!--私服的密码-->
<password>suimeng</password>
</server>
<server>
<!--名称可以自定义,但是可以在私服中统一定义,防止出错-->
<id>suimeng-anapshots</id>
<!--私服的用户名-->
<username>suimeng</username>
<!--私服的密码-->
<password>suimeng</password>
</server>
</servers>
- 配置私服镜像
<!--配置私服镜像,将其他私服屏蔽-->
<mirror>
<id>nexus-suimeng</id>
<mirrorOf>*</mirrorOf>
<url>私服访问地址(在私服中URL可以复制)</url>
</mirror>
更改idea中pom文件的设置
<!--发布的配置管理-->
<distributionManagement>
<!--配置发布版的上传-->
<repository>
<id>与setting中保持一致</id>
<url>发布版的URL</url>
</repository>
<!--配置测试版的上传-->
<snapshotRepository>
<id>与setting中保持一致</id>
<url>测试版的URL</url>
</snapshotRepository>
</distributionManagement>
其中id要与setting中保持一致的原因是:上传时直接访问URL,根据id到本地仓库的setting中寻找用户名和密码(使用deploy上传)