首页 > 其他分享 >Maven常见问题与原理技巧

Maven常见问题与原理技巧

时间:2024-01-13 20:57:55浏览次数:24  
标签:maven 生命周期 技巧 jar Maven 常见问题 clean mvn

 

背景

目前项目中主流的都是使用maven等构建工具,当然在使用过程中也会遇到各种各样的疑惑或问题,比如:

  • maven生命周期到底有啥用
  • jar包下载不了怎么办
  • 不知道配置怎么配,下载jar包的顺序是什么
  • jar包冲突又是怎么解决

问的人多了,也就形成了大家的共性问题,这里基于这些问题,本文着重梳理下maven的基本原理,并对一些常见问题做一些总结。

Maven能干嘛?

maven并不是第一个做构建工具的,在它之前还有ant等其他的工具,再早之前就是纯手工自己写脚本进行打包,这种方式就非常的原始了。几种方式都有各自的弊端,这里我就不一一赘述了。这里先简单介绍下maven能干啥:

  • 依赖管理:定义了jar包各版本之间的依赖关系
  • 生命周期管理:规范化构建的各个阶段,也是为了便于插件的运行
  • 仓库管理:建设了jar包仓库,管理所有的开源jar,同时可自架设私有仓库
  • 约定大于配置:标准的目录结构(web)、默认的输出位置(target)、默认的命令执行流程、预定义的生命周期阶段
  • 项目信息管理:项目的说明、版本等信息

Tips:Maven虽然是java实现的,但并非java独有。它是一个项目管理工具,也可用于构建其他语言的项目,如C#、Ruby、Scala等

Maven生命周期有啥用?

Maven有三套相互独立的生命周期,分别是clean、default和site。每个生命周期包含一些阶段(phase),阶段是有顺序的,后面的阶段依赖于前面的阶段。

各个生命周期相互独立,但一个生命周期的阶段前后依赖。

Maven生命周期

例子:

  • mvn clean 调用clean生命周期的clean阶段,实际执行pre-clean和clean阶段
  • mvn test 调用default生命周期的test阶段,实际执行test以及之前所有阶段
  • mvn clean install 调用clean生命周期的clean阶段和default的install阶段,实际执行pre-clean和clean,install以及之前所有阶段

具体Maven生命周期有啥用?这是和Maven的命令以及Maven的插件机制有关。

Maven的命令格式

方式1:mvn compile:compile 【指名道姓】

  • mvn :[:]:
  • mvn ::执行 plugin-prefix 插件的 goal-name 目标(动作)

方式2:mvn compile 【绑定生命周期阶段】

将插件目标与生命周期阶段(lifecycle phase)绑定,这样用户在命令行只是输入生命周期阶段而已。

例如: Maven默认将maven-compiler-plugin的compile目标(goal)与生命周期的compile阶段绑定。 因此命令mvn compile实际上是先定位到compile这一生命周期阶段,然后再根据绑定关系调用maven-compiler-plugin的compile目标。

Tips:这套路和Ant的target是不是很像?

经常遇到的问题

1. 内网、外网的配置文件不一致

Maven中有一个特性profile,主要是可以根据不同环境激活不同的配置。这样我们就可以定义内网环境和正式环境,然后根据需要激活特定的配置

指定profile激活:mvn clean -P nw

Maven的profile

下面是几种激活的条件:

  <activation>
  <activeByDefault>true</activeByDefault>
  <jdk>!1.8</jdk>
  <os>
  <name>Window 10</name>
  </os>
  <file>
  <exists>src/main/resources/config.xml</exists>
  </file>
  </activation>

2. Maven中的属性是怎么定义的

Maven中属性都是从哪里来的?是哪里定义的?这里直接列了一个脑图给大家参考

Maven属性来源

3. 配置的优先级

原则:越靠近项目的,优先级越高

  • pom.xml
  • ${user}/.m2/settings.xml
  • ${maven_dir}/conf/settings.xml

推荐的做法:

  • 项目独有的配置,放在pom.xml里
  • 全局的配置,放在第2项。比如说本地仓库路径、远程仓库的密码、mirror镜像地址等等
  • 第3项可以少用,因为IDEA有内置的maven,如果配在第3项,则注意修改idea的配置

4. Maven是如何下载jar包的?

jar包存储相关的概念

  • 本地仓库(推荐配置到settings.xml中)
  • 远程仓库

Maven远程仓库

  • 仓库镜像:mirror(可在settings.xml中配置)

Maven仓库镜像

下载Jar包流程图

Maven下载jar包流程

5.jar包下载不到或不对

  • 配置是否配到正确的仓库上
  • 网络是否通畅,尤其是在连官方maven仓库的时候
  • 网络不通产生.lastUpdated文件

解决方案:

  • 删掉下载不了的jar,执行 mvn compile 重试
  • 检查仓库的地址和镜像的地址
  • 对于第3点,用脚本删除 .lastUpdated 文件。脚本下载:cleanLastUpdated.bat
  • IDEA显示红色但实际能运行:清除缓存重启 File/Invalidate Caches。

6.jar包冲突

1. 现象

  • MAVEN项目运行中如果报如下错误,十有八九是jar包冲突导致的:
  • Caused by: java.lang.NoSuchMethodError
  • Caused by: java.lang.ClassNotFoundException

2. 产生原因

  • Maven的依赖传递:
  • A->B->C1(log 15.0)
  • D->C2(log 16.0)

假设C2再C1的基础上增加或删除了方法,那A、D包进行调用的时候,就会抛错:NoSuchMethodError,这就是jar包冲突

3. 如何查看冲突?

  • mvn dependency:tree
  • eclipse:Maven Helper插件
  • IDEA:ctrl+shift+alt+U查看maven的依赖图或者用插件进行排查

4. 如何解决包冲突

一个概念:选择一个jar包使用

1. Maven的默认策略

  • 最短路径优先 E->F->D2 比 A->B->C->D1 路径短 1 位
  • 最先申明优先 A->B->C1, E->F->C2,路径一样,则C1先定义就用C1

2. 手动处理

  • 手动排除,配置exclusion

--- END ---

 

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: /archives/maven-mechanism

 

https://yeas.fun/archives/maven-mechanism

 

标签:maven,生命周期,技巧,jar,Maven,常见问题,clean,mvn
From: https://www.cnblogs.com/softidea/p/17962907

相关文章

  • Hive常见问题
    Hive常见问题1、hive创建数据库在使用hive指令创建数据库时,指定创建位置createdatabasebigdata_demo1location'/bigdata_29';在shell脚本中显示创建返回结果但是在hdfs中并未找到该数据库;这里可能是bug,于是我们通过第二种方法,即在location中将该数据库也加入到路径中......
  • GitHub常用搜索技巧
    普通关键词搜索搜索关键词为javascript的所有项目,可以搜索到数量为2百万的项目,数量庞大,不利于筛选。高级搜索(添加限定词)搜索写法含义in:nameXXX按照项目(仓库)名称搜索in:descriptionXXX按照项目(仓库)描述搜索in:readmeXXX按照README文件搜索languag......
  • 无涯教程-Maven - 快照
    SNAPSHOT是一个特殊版本,指示当前的开发副本,与常规版本不同,Maven为每个构建都在远程存储库中检查新的SNAPSHOT版本。现在,数据服务团队将每次将SNAPSHOT更新的代码发布到存储库中,例如数据服务:1.0-SNAPSHOT,将替换旧的SNAPSHOTjar。快照与版本对于Version,如果Maven一旦下载了提......
  • 无涯教程-Maven - 构建和测试项目
    无涯教程在"CreateingProject"创建项目一章中学到的是如何使用Maven创建Java应用程序。现在将看到如何构建和测试应用程序。转到创建Java应用程序的C:/MVN目录。打开consumerBanking文件夹。您将看到POM.xml文件,其中包含以下内容。<projectxmlns="http://maven.apache.......
  • 无涯教程-Maven - 存储库(Repositories)
    用Maven术语来说,存储库是一个目录,所有项目jar,库jar,插件或任何其他项目特定的工件都存储在该目录中,并且Maven可以轻松使用它们。Maven存储库有三种类型。下图说明了这三种类型。localcentralremote本地存储库Maven本地存储库是计算机上的文件夹位置。首次运行任何maven命令......
  • 认识Maven标签
    <?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/......
  • 无涯教程-Maven - 环境设置
    Maven是一个基于Java的工具,因此最首要的要求是在您的计算机上安装JDK。第1步-验证Java安装打开控制台并执行以下java命令。OSTaskCommandWindowsOpenCommandConsolec:\>java-versionLinuxOpenCommandTerminal$java-versionMacOpenTerminalmachine:~jo......
  • 铺先生:转店人需要掌握什么技巧?这三点比较有效
    转店人需要掌握什么技巧?作为一个经营者,遇到了无法解决的事情的时候,都会选择将店铺转让出去以此减少损失。但是如今转店失败的人不计其数,大部分原因都是在技巧上出了问题。下面小编就来跟大家说三个技巧吧。1. 端正态度你作为转店人,其实算得上是有求于人了,而在转店的过程中,对接手方......
  • 无涯教程-Maven - 配置文件
    构建配置文件是一组配置值,可用于设置或覆盖Maven构建的默认值。文件类型构建配置文件主要分为三种类型。Type定义的地方PerProject在项目POM文件pom.xml中定义PerUser在Maven设置xml文件(%USER_HOME%/.m2/settings.xml)中定义Global在Maven全局设置xml文件(%M2_HOME%/co......
  • UCB Data100:数据科学的原理和技巧:第十一章到第十五章
    十一、恒定模型、损失和转换原文:ConstantModel,Loss,andTransformations译者:飞龙协议:CCBY-NC-SA4.0学习成果推导出在MSE和MAE成本函数下恒定模型的最佳模型参数。评估MSE和MAE风险之间的差异。理解变量线性化的必要性,并应用图基-莫斯特勒凸图进行转......