目录
Maven 是一款为 Java 项目构建管理、依赖管理的工具软件
一、Maven运行报错 [ERROR] 不再支持源选项 5。请使用 7 或更高版本。
经过查阅资料原因:引发这个错误的主要原因是maven配置文件中默认的JDK已经不再使用了,所以导致了程序无法运行
Maven介绍
Maven 是一款为 Java 项目构建管理、依赖管理的工具软件
一、简介
1. 由于jar包不统一、jar包不兼容、系统的不同,工程升级维护过程操作繁琐。
2. Maven的本质是项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM、由java所开发)
3.Maven的作用
项目构建(提供标准的跨平台的自动化项目构建方式)、依赖管理(方便快捷的管理项目依赖的资源即jar包,避免版本冲突问题)、统一开发结构
二 、下载,安装
官网:Maven – Welcome to Apache Maven
下载地址:Maven – Download Apache Maven
a.Maven环境变量配置:
1.配置JAVA_HOME,由于其依赖Java
2.设置Maven自身的运行环境,配置MAVEN_HOME
方法如下
1.解压缩Maven压缩包,记住放置位置
2.打开环境变量,在系统变量中新建变量如图
3.在path变量中新建(与Java环境变量配置相似)
4.测试 键盘win+r 然后输入cmd 调试后在输入mvn回车测试,如图即安装完成
b.配置国内阿里镜像
<!--在mirrors节点(标签)下添加中央仓库镜像 160行附近--> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
c.配置jdk17版本项目构建
<!--在profiles节点(标签)下添加jdk编译版本 268行附近--> <profile> <id>jdk-17</id> <activation> <activeByDefault>true</activeByDefault> <jdk>17</jdk> </activation> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <maven.compiler.compilerVersion>17</maven.compiler.compilerVersion> </properties> </profile>
三、基础概念
一、仓库
二、坐标
仓库:Maven Repository: Search/Browse/Explore (mvnrepository.com)https://mvnrepository.com/
Maven中的坐标用于描述仓库中资源的位置。Maven 中的 GAVP 是指 GroupId、ArtifactId、Version、Packaging 等四个属性的缩写,其中前三个是必要的,而 Packaging 属性为可选项。这四个属性主要为每个项目在maven仓库总做一个标识,类似 人的《姓-名》。有了具体标识,方便maven软件对项目进行管理和互相引用!
组成1.组织ID、2.项目ID、3.版本号
方法二、使用插件(idea)maven-search
三、本地仓库配置
自己先建文件夹再输入路劲
四、远程仓库的配置
2.在setting文件中配置阿里云镜像仓库
<mirrors>
<!-- mirror
| Specifies a repository mirror site to use instead of a given repository. The repository that
| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
|
<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>
-->
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus-aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
3.全局setting和用户setting
四、Maven项目
一、手动制作
二、Maven项目构建命令
根文件输入代码(第一次运行会下载插件)
mvn compile 编译
mvn clean 清理
mvn test 测试
mvn package 打包
mvn install 安装到本地仓库
插件创建工程(模版式)
mvn archetype:generate
-DgroupId={project-packaging}
-DartifactId={project-name}
-DarchetypeArtifactId=maven-archetype-quickstart
-DinteractiveMode=false
创建java工程
mvn archetype:generate -DgroupId=com.itheima -DartifactId=java-project -
DarchetypeArtifactId=maven-archetype-quickstart -Dversion=0.0.1-snapshot -
DinteractiveMode=false
创建web工程
mvn archetype:generate -DgroupId=com.itheima -DartifactId=web-project -
DarchetypeArtifactId=maven-archetype-webapp -Dversion=0.0.1-snapshot -
DinteractiveMode=false
三、在idea中的Maven项目
java:org.apache.maven.archetypes:maven-archetype-quickstart
web:org.apache.maven.archetypes:maven-archetype-webapp
在适当的添加相关文件即可
2.使用插件JBLJavaToWeb
四、依赖管理(pom.xml文件)
<!--设置当前项目所有的依赖 jar-->
<dependencies>
<!—设置具体依赖 -->
<dependency>
<!— 依赖所属群体 id-->
<groupId>junit</groupId>
<!— 依赖所属项目id-->
<artifactId>junit</artifactId>
<!— 依赖版本号-->
<version>4.12</version>
<optional>true{对外不透明依赖},false{对外透明依赖}</optional>
<!— 排除依赖主动断开依赖的资源,被拍出的资源无需指定版本-->
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
<!—依赖范围 compile(主代码、测试代码、打包) test(测试代码) provide(主代码、测试代码) runtime (打包)-->
<scope>compile</scope>
</dependency>
</dependencies>
1.依赖具有传递性
2.依赖传递冲突问题
3.依赖范围
依赖范围的传递性
当发生重复依赖,传递会停止。但是
1. 自动选择原则
- 短路优先原则(第一原则)
A—>B—>C—>D—>E—>X(version 0.0.1)
A—>F—>X(version 0.0.2)
则A依赖于X(version 0.0.2)。
- 依赖路径长度相同情况下,则“先声明优先”(第二原则)
A—>E—>X(version 0.0.1)
A—>F—>X(version 0.0.2)
在<depencies></depencies>中,先声明的,路径相同,会优先选择!
前提: A 1.1 -> B 1.1 -> C 1.1
F 2.2 -> B 2.2
pom声明: F 2.2 A 1.1 B 2.2(只要发生冲突后续依赖不引入)
五、生命周期与插件
命令 | 描述 |
---|---|
mvn clean | 清理编译或打包后的项目结构,删除target文件夹 |
mvn compile | 编译项目,生成target文件 |
mvn test | 执行测试源码 (测试) |
mvn site | 生成一个项目依赖信息的展示页面 |
mvn package | 打包项目,生成war / jar 文件 |
mvn install | 打包后上传到maven本地仓库(本地部署) |
mvn deploy | 只打包,上传到maven私服仓库(私服部署) |
一、生命周期
-
- 清理周期:主要是对项目编译生成文件进行清理
包含命令:clean
- 默认周期:定义了真正构件时所需要执行的所有步骤,它是生命周期中最核心的部分包含命令:compile - test - package - install / deploy
- 报告周期包含命令:site
打包: mvn clean package 本地仓库: mvn clean install
2.default(默认)生命周期
每次从校验开始执行
二 、插件
<plugins></plugins>
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.2.1</version> <executions> <execution> <goals> <goal>jar</goal> </goals> <phase>generate-test-resources</phase> </execution> </executions> </plugin> <!-- jdk17 和 war包版本插件不匹配 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.2.2</version> </plugin> </plugins> </build>
五、Maven高级技术
1.分模块开发设计(继承)
在父工程中统一管理项目中的依赖信息,进行统一版本管理!
父工程不引入依赖,制作依赖版本的声明
背景:
- 对一个比较大型的项目进行了模块拆分。
- 一个 project 下面,创建了很多个 module。
- 每一个 module 都需要配置自己的依赖信息。
背后需求:
- 多个模块要使用同一个框架,它们应该是同一个版本,所以整个项目中使用的框架版本需要统一管理。
- 使用框架时所需要的 jar 包组合(或者说依赖信息组合)需要经过长期摸索和反复调试,最终确定一个可用组合。这个耗费很大精力总结出来的方案不应该在新的项目中重新摸索。
- 通过在父工程中为整个项目维护依赖信息的组合既保证了整个项目使用规范、准确的 jar 包;又能够将以往的经验沉淀下来,节约时间和精力。
2. 继承语法
在父工程的pom.xml文件使用<dependencyManagement></dependencyManagement>
子工程不用声明版本
父工程
<groupId>com.atguigu.maven</groupId>
<artifactId>pro03-maven-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 当前工程作为父工程,它要去管理子工程,所以打包方式必须是 pom -->
<packaging>pom</packaging>
子工程
<!-- 使用parent标签指定当前工程的父工程 -->
<parent>
<!-- 父工程的坐标 -->
<groupId>com.atguigu.maven</groupId>
<artifactId>pro03-maven-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<!-- 子工程的坐标 -->
<!-- 如果子工程坐标中的groupId和version与父工程一致,那么可以省略 -->
<!-- <groupId>com.atguigu.maven</groupId> -->
<artifactId>pro04-maven-module</artifactId>
<!-- <version>1.0-SNAPSHOT</version> -->
3. 父工程依赖统一管理
父工程声明版本
<!-- 使用dependencyManagement标签配置对依赖的管理 -->
<!-- 被管理的依赖并没有真正被引入到工程 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
子工程引用版本
<!-- 子工程引用父工程中的依赖信息时,可以把版本号去掉。 -->
<!-- 把版本号去掉就表示子工程中这个依赖的版本由父工程决定。 -->
<!-- 具体来说是由父工程的dependencyManagement来决定。 -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</dependency>
</dependencies>
4. 聚合
Maven 聚合是指将多个项目组织到一个父级项目中,通过触发父工程的构建,统一按顺序触发子工程构建的过程!!
1. 聚合作用
1. 统一管理子项目构建:通过聚合,可以将多个子项目组织在一起,方便管理和维护。
2. 优化构建顺序:通过聚合,可以对多个项目进行顺序控制,避免出现构建依赖混乱导致构建失败的情况。
2.聚合语法
父项目中包含的子项目列表。
<project>
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<packaging>pom</packaging>
<version>1.0.0</version>
<modules>
<module>child-project1</module>
<module>child-project2</module>
</modules>
</project>
遇见的bug
一、Maven运行报错 [ERROR] 不再支持源选项 5。请使用 7 或更高版本。
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] 不再支持源选项 5。请使用 7 或更高版本。
[ERROR] 不再支持目标选项 5。请使用 7 或更高版本。
经过查阅资料原因:引发这个错误的主要原因是maven配置文件中默认的JDK已经不再使用了,所以导致了程序无法运行
解决方案:将默认的JDK版本修改成我们电脑上目前有的JDK版本,在cmd中输入 "java -version"
如图:
方法一:修改pom.xml文件配置
这种方法需要修改当前运行工程项目的pom.xml配置文件中的内容,在其中添加如下代码。作用是告诉当前工程使用哪个版本的JDK运行。如我的JDK版本是10.0.1,所以版本就填10,但是这种方法使用之后只能对当前这个项目有效,对于其他使用默认JDK的工程就不管用了!
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<java.version>10</java.version>
<maven.compiler.source>10</maven.compiler.source>
<maven.compiler.target>10</maven.compiler.target>
</properties>
方法二:修改apache-maven中的配置
这种方法需要修改我们电脑上的apache-maven-3.2.2的配置,具体操作是:
1、找到apache-maven-3.2.2文件下的setting.xml文件,setting.xml一般存放在路径apache-maven-3.6.1\conf\settings.xml下
2、在setting.xml文件中添加jdk版本说明,
3、在settings.xml文件中找到如下标签并修改JDK版本为当前电脑上的版本
二、依赖导入失败场景和解决方案
在使用 Maven 构建项目时,可能会发生依赖项下载错误的情况,主要原因有以下几种:
1. 下载依赖时出现网络故障或仓库服务器宕机等原因,导致无法连接至 Maven 仓库,从而无法下载依赖。
2. 依赖项的版本号或配置文件中的版本号错误,或者依赖项没有正确定义,导致 Maven 下载的依赖项与实际需要的不一致,从而引发错误。
3. 本地 Maven 仓库或缓存被污染或损坏,导致 Maven 无法正确地使用现有的依赖项,并且也无法重新下载!
解决方案:
1. 检查网络连接和 Maven 仓库服务器状态。
2. 确保依赖项的版本号与项目对应的版本号匹配,并检查 POM 文件中的依赖项是否正确。
3. 清除本地 Maven 仓库缓存(lastUpdated 文件),因为只要存在lastupdated缓存文件,刷新也不会重新下载。本地仓库中,根据依赖的gav属性依次向下查找文件夹,最终删除内部的文件,刷新重新下载即可!
例如: pom.xml依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
文件:
脚本使用:
删除指定文件夹里的lastupdated文件
创建一个txt文本,将下列代码放入后,将后缀改为bat运行
@echo off rem 这里写你的仓库路径 set REPOSITORY_PATH=D:\maven rem 正在搜索... for /f "delims=" %%i in ('dir /b /s "%REPOSITORY_PATH%\*lastUpdated*"') do ( del /s /q %%i ) rem 搜索完毕 pause
使用记事本打开
set REPOSITORY_PATH=D:maven\repository 改成你本地仓库地址即可!
点击运行脚本,即可自动清理本地错误缓存文件!!