目录
- 配置maven的环境变量
- 配置仓库地址
- IDEA中使用Maven
- 依赖坐标
- 依赖的作用域
- 快照版、发行版的区别
- jar包冲突
- maven常用命令
- 项目目录
- 多模块开发
- 常见问题
- 版本号显示为红色
- 配置了阿里镜像后仍从中央仓库下载依赖
- 本地仓库中有相关jar包,但依然从远程仓库中搜索该jar包(jar包下载导入失败)
- Maven项目默认使用jdk1.5或者IDEA设置中编译的目标jdk版本自动变为1.5
- 2020版本IDEA中,Maven不能自动导入的问题
- 编译Maven项目时报错:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile
- package打包时自动跑单元测试
- 无法导入json-lib.jar
- 编译报错 Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project xxx: Compilation failure
- 操作时报错,但没有提示具体的错误信息
- 不能拉取私服中快照版的依赖
maven是一个跨平台的依赖管理工具,可统一管理依赖、自动构建项目。
配置maven的环境变量
如果要在命令行使用maven命令,就需要配置maven的环境变量。
maven依赖jdk,没有配置jdk环境变量的需要先配置jdk。
1、新建环境变量 MAVEN_OPTS
-Xms256m -Xmx512m -Duser.language=zh -Dfile.encoding=UTF-8
2、在Path中添加maven的bin目录
也可以新建环境变量 MAVEN_HOME,值是maven主目录,然后在Path中添加 %MAVEN_HOME%\bin
配置仓库地址
本地仓库
<localRepository>F:/maven/repository</localRepository>
阿里云镜像
https://help.aliyun.com/document_detail/102512.html
聚合仓库里的依赖多,一般使用聚合仓库(group)。
可点击右上角的使用指南,把maven的配置粘到maven配置文件中即可,给的配置默认就是聚合仓库的。
常用配置
<!-- <mirrors>中添加子节点 -->
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
IDEA中使用Maven
可以使用IDEA自带的maven,也可以使用自己下载的。
需要在IDEA没有打开项目的情况下配置,如果打开了项目,则maven配置只对该项目生效。
1、配置路径
2、配置参数
默认直接到远程仓库下载依赖,配置为:先在本地仓库中找,有就直接使用,没有才去远程仓库下载
-DarchetypeCatalog=internal
依赖坐标
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
- groupId 公司、组织
- artifactId 项目
- version 版本号
以上3部分组成依赖的坐标,唯一标识一个依赖。
依赖的作用域
scope可选,指定依赖作用域(作用时机)
- compile:默认值,可缺省,编译、测试、运行时都有效
- provided:只作用于编译时
- test:只作用于测试时
- runtime:只作用于运行时
- system:显式指定jar包路径
- import
快照版、发行版的区别
maven仓库有两种类型
- snapshot 快照仓库:用于保存尚处于开发中的不稳定版本
- release 发行仓库、正式仓库:用于保存稳定的发行版本
maven会根据项目版本号(pom.xml中设置的version)中是否带有 -SNAPSHOT来判断版本类型,快照版在 mvn deploy 时会自动推送到快照仓库中,发行版在 mvn deploy 时会自动推送到发行仓库中。
使用maven打包时,如果项目是快照版,即使未修改依赖的版本号,maven每次都会从远程快照仓库中拉取最新的(快照)依赖进行构建;如果项目时发行版,则对于本地仓库中已有的依赖,maven会使用直接使用,不会再从远程仓库中获取。所以公共类库每次发行正式版时,一定要区分版本号,不要重复使用历史版本号。
jar包冲突
导入了同一个依赖的多个jar包时
- 先声明者优先:先引入的优先级更高
- 路径近者优先:A->B->C,A->C 以A->C导入的为准。可以借助maven helper等插件,exclusions排除不使用的jar包。
maven常用命令
mvn -v或version #查看maven版本
mvn clean #清理,删除target文件夹(之前编译、打包产生的文件)
mvn compile #编译
mvn test #测试
mvn package #打包为jar或war(取决于pom.xml中的打包配置)
mvn install #安装,把jar包放到本地仓库中
mvn deploy #部署
项目目录
- .idea IDEA对项目的一些配置,留着
- .mvn 打包用的,基本用不到,删掉
- src main放源码,test放测试代码。java下放java代码,resources下放资源文件。
- .gitignore 指定上传到git仓库时哪些类型的文件被忽略、不上传
- HLEP.md 说明、帮助,没啥用,删掉
- .iml IDEA的一些配置,留着
- mvnw、mvnw.cmd 这2个是IDEA自带的maven命令,可以删掉
- pom.xml
总结:将.mvn、HLEP.md、mvnw、mvnw.cmd删掉,只保留.idea、src、.gitignore、.iml、pom.xml,看起来清爽一些
多模块开发
经常要把一个项目拆分为多个模块进行开发,比如微服务。2种方式
- 新建空项目,里面新建子模块
- 父子工程(聚合工程):新建maven项目,type选择maven pom,删除不需要的东西;新建子模块,在子模块的pom.xml中继承父项目的依赖,用父项目的pom.xml统一管理项目的依赖版本。注意:并不是所有依赖都会继承,子模块不继承scope是provided、test的依赖。推荐。
<groupId>com.chy</groupId>
<artifactId>mall</artifactId>
<version>1.0.0</version>
<description>Demo project for Spring Boot</description>
<!--pom-->
<packaging>pom</packaging>
<!--指定子模块,非必需-->
<modules>
<module>eureka-server</module>
<module>api-gateway</module>
<module>user-server</module>
<module>order-server</module>
</modules>
<!-- 公共配置、依赖版本 -->
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<!-- 打包时跳过单元测试 -->
<skipTests>true</skipTests>
</properties>
常见问题
版本号显示为红色
原因是jar包版本太高,远程仓库中还没有,改低一点即可
配置了阿里镜像后仍从中央仓库下载依赖
这个问题常见于拉取别人的项目,在pom.xml中手动添加maven仓库配置即可
<repositories>
<repository>
<id>nexus-aliyun</id>
<name>nexus-aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
如果还是不行,新建了一个maven项目,看是否从阿里的镜像仓库下载依赖、是否连接到阿里的仓库。
本地仓库中有相关jar包,但依然从远程仓库中搜索该jar包(jar包下载导入失败)
这种情况常见于引入mvn install安装到本地的jar包,可以从以下方面考虑
- IDEA的Maven配置 -> Runner -> VM Options -> 是否设置了 -DarchetypeCatalog=internal 指定优先从本地仓库中找
- pom.xml中是否显式指定了远程仓库
- 删除maven仓库中的 .lastUpdated 文件
- 将pom.xml中相关依赖注释掉,重新导入,取消注释,再重新导入
.lastUpdated文件是从远程maven仓库下载jar包失败生成的,可以用everything搜索 .lastUpdated ,然后全选删除,也可以运行下面的脚本删除
cleanLastUpdated.bat(win版)
@echo off
rem 此处设置maven仓库的路径
set REPOSITORY_PATH=D:\maven-repository
for /f "delims=" %%i in ('dir /b /s "%REPOSITORY_PATH%\*lastUpdated*"') do (
echo %%i
del /s /q "%%i"
)
pause
rem是注释语句
cleanLastUpdated.sh(linux版)
# 此处设置maven仓库的路径
REPOSITORY_PATH=/usr/local/maven/repository
echo 清理中...
find $REPOSITORY_PATH -name "*lastUpdated*" | xargs rm -fr
echo 清理完毕
Maven项目默认使用jdk1.5或者IDEA设置中编译的目标jdk版本自动变为1.5
解决方式:在pom.xml中添加以下任一种配置即可,一般都要在pom.xml中显式指定jdk版本的
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
在IDEA的项目结构、设置中修改也可以,但治标不治本
2020版本IDEA中,Maven不能自动导入的问题
有人说 IDEA 2020版取消了maven的自动导入,修改pom.xml后,只能手动Reimport,这种说法不对。
IDEA 2020版只是默认禁用了Maven的自动导入,点击右上角的Maven,勾选自动导入即可
编译Maven项目时报错:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile
原因:项目实际使用的jdk版本和配置的jdk版本不一致
解决方式:检查以下各处配置的jdk版本是否一致
- pom.xml
- 项目结构中的Project、Moudles、SDKs
- 设置 -> Build,Execution,Deployment -> Complier -> Java Compiler -> 目标版本设置
package打包时自动跑单元测试
跳过单元测试有4种方式
方式一
pom.xml,配置maven
<properties>
<maven.test.skip>true</maven.test.skip>
</properties>
方式二
pom.xml,添加插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
方式三
命令打包设置参数
mvn clean install -Dmaven.test.skip=true
方式四
点击maven的闪电图标,切换到跳过单元测试模式
无法导入json-lib.jar
原因是没有指定json-lib要使用的jdk版本,使用<classifier>指定即可。
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<!-- 需要指定jdk版本,可用13、15,没有8 -->
<classifier>jdk13</classifier>
<scope>compile</scope>
</dependency>
编译报错 Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project xxx: Compilation failure
原因是配置的jdk版本和实际使用的不一致,检查pom.xml、IDEA中配置的jdk版本
操作时报错,但没有提示具体的错误信息
可以在命令行终端执行命令,会打印出具体的错误信息(info级别的执行日志);
如果还不好排查问题,可以在命令末尾加参数 -X,会打印出debug级别的执行日志。
不能拉取私服中快照版的依赖
在pom.xml的根目录<project>中添加如下配置
<repositories>
<repository>
<id>xxx</id>
<url>http://xxx/repository/public</url>
<releases>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</releases>
<!--允许拉取快照版依赖-->
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>