Maven使用指南

目录

      • 配置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
Maven使用指南_第1张图片
聚合仓库里的依赖多,一般使用聚合仓库(group)。
可点击右上角的使用指南,把maven的配置粘到maven配置文件中即可,给的配置默认就是聚合仓库的。
 

常用配置


<mirror>
  <id>aliyunmavenid>
  <mirrorOf>*mirrorOf>
  <name>阿里云公共仓库name>
  <url>https://maven.aliyun.com/repository/publicurl>
mirror>

 

IDEA中使用Maven

可以使用IDEA自带的maven,也可以使用自己下载的。

需要在IDEA没有打开项目的情况下配置,如果打开了项目,则maven配置只对该项目生效。
 
1、配置路径
Maven使用指南_第2张图片

2、配置参数
默认直接到远程仓库下载依赖,配置为:先在本地仓库中找,有就直接使用,没有才去远程仓库下载
Maven使用指南_第3张图片

-DarchetypeCatalog=internal

 

依赖坐标

<dependency>
    <groupId>junitgroupId>
    <artifactId>junitartifactId>
    <version>4.11version>
    <scope>testscope>
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.chygroupId>
<artifactId>mallartifactId>
<version>1.0.0version>
<description>Demo project for Spring Bootdescription>

<packaging>pompackaging>
<modules>
    <module>eureka-servermodule>
    <module>api-gatewaymodule>
    <module>user-servermodule>
    <module>order-servermodule>
modules>
<properties>
	<java.version>1.8java.version>
	<maven.compiler.source>1.8maven.compiler.source>
	<maven.compiler.target>1.8maven.compiler.target>
properties>

 

常见问题

版本号显示为红色

Maven使用指南_第4张图片
原因是jar包版本太高,远程仓库中还没有,改低一点即可

 

配置了阿里镜像后仍从中央仓库下载依赖

这个问题常见于拉取别人的项目,在pom.xml中手动添加maven仓库配置即可

<repositories>
    <repository>
        <id>nexus-aliyunid>
        <name>nexus-aliyunname>
        <url>http://maven.aliyun.com/nexus/content/groups/public/url>
        <releases>
            <enabled>trueenabled>
        releases>
        <snapshots>
            <enabled>falseenabled>
        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.8maven.compiler.source>
    <maven.compiler.target>1.8maven.compiler.target>
properties>
<build>
    <plugins>
    
        <plugin>
            <groupId>org.apache.maven.pluginsgroupId>
            <artifactId>maven-compiler-pluginartifactId>
            <version>3.8.1version>
            <configuration>
                <source>1.8source>
                <target>1.8target>
        configuration>
        plugin>
        
    plugins>
build>

在IDEA的项目结构、设置中修改也可以,但治标不治本

 

2020版本IDEA中,Maven不能自动导入的问题

有人说 IDEA 2020版取消了maven的自动导入,修改pom.xml后,只能手动Reimport,这种说法不对。
Maven使用指南_第5张图片
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>truemaven.test.skip>
properties>

 

方式二
pom.xml,添加插件

<plugin>
     <groupId>org.apache.maven.pluginsgroupId>
     <artifactId>maven-surefire-pluginartifactId>
     <configuration>
         <skipTests>trueskipTests>
     configuration>
 plugin> 

 

方式三
命令打包设置参数

mvn clean install -Dmaven.test.skip=true

 

方式四
Maven使用指南_第6张图片
点击maven的闪电图标,切换到跳过单元测试模式

 

无法导入json-lib.jar

原因是没有指定json-lib要使用的jdk版本,使用指定即可。

 <dependency>
    <groupId>net.sf.json-libgroupId>
    <artifactId>json-libartifactId>
    <version>2.4version>
    
    <classifier>jdk13classifier>
    <scope>compilescope>
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的根目录中添加如下配置

<repositories>
    <repository>
        <id>xxxid>
        <url>http://xxx/repository/publicurl>
        <releases>
            <enabled>trueenabled>
            <updatePolicy>alwaysupdatePolicy>
        releases>
        
        <snapshots>
            <enabled>trueenabled>
            <updatePolicy>alwaysupdatePolicy>
        snapshots>
    repository>
repositories>

你可能感兴趣的:(Maven,maven,intellij,idea)