【Maven】005-基于 IDEA 进行 Maven 依赖管理
文章目录
- 【Maven】005-基于 IDEA 进行 Maven 依赖管理
- 一、Maven 依赖管理
- 二、`GAVP` 再说明
- 三、Maven 工程依赖管理配置
- 1、依赖配置
- 2、版本统一声明和使用
- 3、依赖范围说明
- 4、Maven工程依赖下载失败错误解决(重点)
- 可能原因
- 解决方案
- 四、Maven 工程 Build 构建配置
- 1、指定打包命名
- 2、指定打包文件
- 3、配置依赖插件
一、Maven 依赖管理
自动解析依赖关系 + 自动下载和管理依赖!
Maven 依赖管理是 Maven 软件中最关键的功能之一。通过定义项目对象模型(POM)文件,Maven 能够自动解析项目的依赖关系,实现自动下载和管理这些依赖项。这一过程在 Maven 仓库的支持下进行,避免了开发人员手动下载和管理依赖的繁琐工作,并减少了版本冲突和依赖缺失的风险。
Maven 仓库扮演着关键的角色,为开发人员提供了一个集中存储和管理软件包的地方。通过 Maven 仓库,开发人员可以访问各种开源项目、第三方库和框架,并将它们集成到自己的应用程序或模块中。这种自动化的依赖解析和管理机制使得软件开发过程更加高效和可靠。
二、GAVP
再说明
<!-- 模型版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.companyname.project-group,maven会将该项目打成的jar包放本地路径:/com/companyname/project-group -->
<groupId>com.companyname.project-group</groupId>
<!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
<artifactId>project</artifactId>
<!-- 版本号 -->
<version>1.0.0</version><!--打包方式默认:jarjar 指的是普通的 java 项目打包方式! 项目打成jar包!war 指的是 web 项目打包方式!项目打成war包!pom 不会讲项目打包!这个项目作为`父工程`,被其他工程聚合或者继承!
-->
<packaging>jar/pom/war</packaging>
三、Maven 工程依赖管理配置
1、依赖配置
<!-- 通过编写依赖 jar 包的 gav 必要属性,引入第三方依赖!scope 属性是可选的,可以指定依赖生效范围!依赖信息查询方式:1. maven 仓库信息官网 https://mvnrepository.com/2. maven search 插件搜索-->
<dependencies><!-- 引入具体的依赖包 --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version><!-- 依赖范围 --><scope>runtime</scope></dependency></dependencies>
2、版本统一声明和使用
<!--声明版本-->
<properties><!--命名随便,内部制定版本号即可!--><junit.version>4.12</junit.version><!-- 也可以通过 maven 规定的固定的 key,配置 maven 的参数!如下配置编码格式!--><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><!--引用 properties 声明版本 --><version>${junit.version}</version></dependency>
</dependencies>
3、依赖范围说明
通过设置坐标的依赖范围(scope),可以设置 对应 jar 包的作用范围:编译环境、测试环境、运行环境。
依赖范围 | 描述 |
---|---|
compile | 编译依赖范围,scope 元素的缺省值。使用此依赖范围的 Maven 依赖,对于三种 classpath 均有效,即该 Maven 依赖在上述三种 classpath 均会被引入。例如,log4j 在编译、测试、运行过程都是必须的。 |
test | 测试依赖范围。使用此依赖范围的 Maven 依赖,只对测试 classpath 有效。例如,Junit 依赖只有在测试阶段才需要。 |
provided | 已提供依赖范围。使用此依赖范围的 Maven 依赖,只对编译 classpath 和测试 classpath 有效。例如,servlet-api 依赖对于编译、测试阶段而言是需要的,但是运行阶段,由于外部容器已经提供,故不需要 Maven 重复引入该依赖。 |
runtime | 运行时依赖范围。使用此依赖范围的 Maven 依赖,只对测试 classpath、运行 classpath 有效。例如,JDBC 驱动实现依赖,其在编译时只需 JDK 提供的 JDBC 接口即可,只有测试、运行阶段才需要实现了 JDBC 接口的驱动。 |
system | 系统依赖范围,其效果与 provided 的依赖范围一致。其用于添加非 Maven 仓库的本地依赖,通过依赖元素 dependency 中的 systemPath 元素指定本地依赖的路径。鉴于使用其会导致项目的可移植性降低,一般不推荐使用。 |
import | 导入依赖范围,该依赖范围只能与 dependencyManagement 元素配合使用,其功能是将目标 pom.xml 文件中 dependencyManagement 的配置导入合并到当前 pom.xml 的 dependencyManagement 中。 |
4、Maven工程依赖下载失败错误解决(重点)
可能原因
在使用 Maven 构建项目时,可能会发生依赖项下载错误的情况,主要原因有以下几种:
- 下载依赖时出现网络故障或仓库服务器宕机等原因,导致无法连接至 Maven 仓库,从而无法下载依赖。
- 依赖项的版本号或配置文件中的版本号错误,或者依赖项没有正确定义,导致 Maven 下载的依赖项与实际需要的不一致,从而引发错误。
- 本地 Maven 仓库或缓存被污染或损坏,导致 Maven 无法正确地使用现有的依赖项。
解决方案
-
检查网络连接和 Maven 仓库服务器状态。
-
确保依赖项的版本号与项目对应的版本号匹配,并检查 POM 文件中的依赖项是否正确。
-
清除本地 Maven 仓库缓存(lastUpdated 文件),因为只要存在 lastupdated 缓存文件,刷新也不会重新下载。本地仓库中,根据依赖的 gav 属性依次向下查找文件夹,最终删除内部的文件,刷新重新下载即可!
例如: pom.xml依赖
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version> </dependency>
本地 Maven 仓库文件查找方式:
-
或者可以将清除 lastUpdated文件 的操作写在一个脚本文件中,手动创建文件"clearLastUpdated.bat",名字任意,但是后缀必须是 bat,将以下内容复制到文件中
cls @ECHO OFF SET CLEAR_PATH=D: SET CLEAR_DIR=D:\MySoft\Environment\Maven\repository(本地仓库路径,改成自己的!) color 0a TITLE ClearLastUpdated For Windows GOTO MENU :MENU CLS ECHO. ECHO. * * * * ClearLastUpdated For Windows * * * * ECHO. * * ECHO. * 1 清理*.lastUpdated * ECHO. * * ECHO. * 2 查看*.lastUpdated * ECHO. * * ECHO. * 3 退 出 * ECHO. * * ECHO. * * * * * * * * * * * * * * * * * * * * * * * * ECHO. ECHO.请输入选择项目的序号: set /p ID= IF "%id%"=="1" GOTO cmd1 IF "%id%"=="2" GOTO cmd2 IF "%id%"=="3" EXIT PAUSE :cmd1 ECHO. 开始清理 %CLEAR_PATH% cd %CLEAR_DIR% for /r %%i in (*.lastUpdated) do del %%i ECHO.OK PAUSE GOTO MENU :cmd2 ECHO. 查看*.lastUpdated文件 %CLEAR_PATH% cd %CLEAR_DIR% for /r %%i in (*.lastUpdated) do echo %%i ECHO.OK PAUSE GOTO MENU
另外一个参考脚本(一键清理maven仓库的缓存文件):
@echo off setlocal set REPO_DIR=D:\MySoft\Environment\Maven\repository:menu cls echo Maven Repository Cache Management echo ---------------------------------- echo [1] View Cache Files echo [2] Clear Cache Files echo [3] Exit echo ---------------------------------- set /p choice="Enter your choice (1-3): " if "%choice%"=="1" goto viewCache if "%choice%"=="2" goto clearCache if "%choice%"=="3" goto end echo Invalid choice, please choose again. pause goto menu:viewCache echo Viewing cache files... for /r "%REPO_DIR%" %%i in (*.lastUpdated) do echo %%i pause goto menu:clearCache echo Clearing cache files... for /r "%REPO_DIR%" %%i in (*.lastUpdated) do (echo Deleting: %%idel "%%i" ) pause goto menu:end endlocal
四、Maven 工程 Build 构建配置
默认情况下,构建不需要额外配置,都有对应的缺省配置。
当然了,我们也可以在pom.xml定制一些配置,来修改默认构建的行为和产物!
例如:
- 指定构建打包文件的名称,非默认名称
- 制定构建打包时,指定包含文件格式和排除文件
- 打包插件版本过低,配置更高版本插件
构建配置是在pom.xml / build标签中指定!
1、指定打包命名
<!-- 默认的打包名称:artifactid+verson.打包方式 -->
<build><finalName>定义打包名称</finalName>
</build>
2、指定打包文件
如果在 java 文件夹中添加 java 类,会自动打包编译到 classes 文件夹下!
但是在 java 文件夹中添加 xml 文件,默认不会被打包!
默认情况下,按照 maven 工程结构放置的文件会默认被编译和打包!
除此之外、我们可以使用 resources 标签,指定要打包资源的文件夹要把哪些静态资源打包到 classes 根目录下!
应用场景:MyBatis 中有时会将用于编写 SQL 语句的映射文件和 mapper 接口都写在 src/main/java 下的某个包中,此时映射文件就不会被打包,如何解决
<build><!--设置要打包的资源位置--><resources><resource><!--设置资源所在目录--><directory>src/main/java</directory><includes><!--设置包含的资源类型--><include>**/*.xml</include></includes></resource></resources>
</build>
3、配置依赖插件
dependencies 标签下引入开发需要的jar包!我们可以在 build/plugins/plugin 标签引入插件!
常用的插件:修改 jdk 版本、tomcat 插件、mybatis 分页插件、mybatis 逆向工程插件等等!
<build><plugins><!-- java编译插件,配jdk的编译版本 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><!-- tomcat插件 --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><port>8090</port><path>/</path><uriEncoding>UTF-8</uriEncoding><server>tomcat7</server></configuration></plugin></plugins>
</build>