Maven使用指南


 

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>
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值