maven命令分析+区别介绍-maven包冲突解决大全

1,325 阅读7分钟

maven命令区别分析

maven compile package install deploy区别:

package命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库

install命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程maven私服仓库

deploy命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库


mvn clean package依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)等7个阶段。

mvn clean install依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install等8个阶段。 mvn clean deploy依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install、deploy等9个阶段。

clean:

执行该命令会删除项目路径下的target文件,但是不会删除本地的maven仓库已经生成的jar文件

compile:

编译命令,只编译选定的目标,不管之前是否已经编译过,会在你的项目路径下生成一个target目录,在该目录中包含一个classes文件夹,里面全是生成的class文件及字节码文件。

package:

这个命令会在你的项目路径下一个target目录,并且拥有compile命令的功能进行编译,同时会在target目录下生成项目的jar/war文件。如果a项目依赖于b项目,打包b项目时,只会打包到b项目下target下,编译a项目时就会报错,因为找不到所依赖的b项目,说明a项目在本地仓库是没有找到它所依赖的b项目,这时就用到install命令了

install:

mvn clean install -Dmaven.test.skip=true

【这里遇到很多次了,用maven install 启动的应用总是有问题,而不是打包的问题,所以更多人用 命令来打包, 用IDE来启动。】

该命令包含了package命令功能,不但会在项目路径下生成class文件和jar包,同时会在你的本地maven仓库生成jar文件,供其他项目使用(如果没有设置过maven本地仓库,一般在用户/.m2目录下。如果a项目依赖于b项目,那么install b项目时,会在本地仓库同时生成pom文件和jar文件,解决了上面打包package出错的问题)
build:功能类似compile,只是只对整个项目进行编译

build和compile的区别

  • Compile:只编译选定的目标,不管之前是否已经编译过。
  • Build:是对整个工程进行彻底的重新编译,而不管是否已经编译过。Build过程往往会生成发布包,这个具体要看对IDE的配置了,Build在实际中应用很少,因为开发时候基本上不用,发布生产时候一般都用ANT等工具来发布。Build因为要全部编译,还要执行打包等额外工 作,因此时间较长

打包过程

  • 法一:clean,package(如果报错,很可能就是jar依赖的问题,一般此问题都出现在第一次打包的情况,就用法二)
  • 法二:clean,install

mac maven总结:maven配置和java_home mvn编译整个工程

export MAVEN_HOME=/Users/mah/Downloads/apache-maven-3.0.5 
export PATH=$PATH:$M2_HOME/bin

具体配置:在 ~/.bash_profile 

source ~/.bash_profile 修改默认文件的 java_home 


$mvn -v
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /Users/mah/Downloads/apache-maven-3.6.3
Java version: 11.0.2, vendor: Oracle Corporation, runtime: 
/Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home
#展示java所有安装版本:
(dev)> /usr/libexec/java_home -V
Matching Java Virtual Machines (2):
    17.0.2 (x86_64) "Oracle Corporation" - "Java SE 17.0.2" /Library/Java/JavaVirtualMachines/jdk-17.0.2.jdk/Contents/Home
    11.0.2 (x86_64) "Oracle Corporation" - "Java SE 11.0.2" /Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home

java安装目录
/Library/Java/JavaVirtualMachines/jdk-17.0.2.jdk/Contents/Home

选择java版本放入 java_home中 > 放在 ~/.bash_profile配置文件中
export JAVA_HOME=$(/usr/libexec/java_home -v1.8)
export JAVA_HOME=$(/usr/libexec/java_home -v14)
echo $JAVA_HOME

Jar包冲突排查:

链接:www.jianshu.com/p/516d8a536…

blog.csdn.net/Deschampszz…

包的冲突命令s10- mvn dependency:tree -Dverbose -Dincludes=commons-collections -Doutput=maven.txt

  • -Doutput=jar包依赖关系.txt 生成到文件中
  • mvn dependency:list -Dverbose #项目根目录pom所在执行命令
    列出项目依赖的所有jar包,-Dverbose参数会把被忽略的jar,即相同jar包的不同版本引入也列出来。
  • mvn dependency:purge-local-repository 【详见下面介绍】清理本地repository好命令
    • 首先解析整个项目依赖,从本地repository中清理依赖》然后在从远程仓库下载下来。
  • mvn dependency:list-repositories ---- 列出所有的远程repositories
[INFO] [dependency:tree]
[INFO] org.apache.maven.plugins:maven-dependency-plugin:maven-plugin:2.0-alpha-5-SNAPSHOT
[INFO] +- org.apache.maven.reporting:maven-reporting-impl:jar:2.0.4:compile
[INFO] |  - commons-validator:commons-validator:jar:1.2.0:compile
[INFO] |     - commons-digester:commons-digester:jar:1.6:compile
[INFO] |        - (commons-collections:commons-collections:jar:2.1:compile - omitted for conflict with 2.0)
[INFO] - org.apache.maven.doxia:doxia-site-renderer:jar:1.0-alpha-8:compile
[INFO]    - org.codehaus.plexus:plexus-velocity:jar:1.1.3:compile
[INFO]       - commons-collections:commons-collections:jar:2.0:compile

我们可以看到,2.1版本的jar被忽略掉了【 omitted for conflict 】,因为maven是根据路径最近原则来解析依赖,2.0版本路径更短,所以2.0版本被引入,2.1版本路径比2.0要长,所以被忽略。
使用这个命令可以轻松的查看包的引入路径,包的冲突情况。
此处一定不要省略-Dverbose参数,要不然是不会显示被忽略的包


mvn dependency:purge-local-repository -DactTransitively=false清理本地仓库好命令

  • 首先解析整个项目依赖,从本地repository中清理依赖》然后在从远程仓库下载
  • 直接依赖
    有一点要说清楚,这个命令默认的对所有的依赖项进行操作。所以它会在清除操作之前,下载某些缺失的依赖来收集完整的依赖树信息。为了避免这些预下载的操作,你可以设置参数-DactTransitively=false,仅对项目的直接依赖进行操作。
  • 指定/排除依赖
    你也可以有针对性的只操作某些包,需要添加参数-Dincludes,明确的声明包,这个是可以传多个值的,用英文逗号分隔,举例:dependency:purge-local-repository -Dincludes=org.slf4j:slf4j-api,org.slf4j:log4j-over-slf4j。-Dexcludes也是一样的道理,只不过是排除某些依赖。
  • 自定义清理
    如果你想清理不在本项目中的依赖。mvn dependency:purge-local-repository -DmanualIncludes=org.apache:apache,参数-DmanualInclude可以让你清理不在本项目中的依赖,但是不会重新解析依赖了,因为本项目不需要这些依赖。这个对清理parent pom,导入的pom,maven插件非常有用。

命令参数s10

常用maven命令:

compile:

package

install: 包含以上命令+打包jar 发布到本地仓库

deploy:包含install+ 打包jar到远程仓库

dependency:tree有几个比较重要的参数,

在命令后面按照 -D参数名=参数值格式增加参数

- appendOutput:是将输出追加到输出文件还是覆盖输出文件,默认值为:false。
 - excludes,includes:通过逗号分离,格式[groupId]:[artifactId]:[type]:[version],支持通配符*
 - outputFile:指定输出文件路径
 - outputType:指定输出文件格式,默认text,还支持dot,graphml,tgf
 - verbose:把artifact的每处依赖都详细显示出来,可用来查看冲突和重复的具体情况
  • includes
    • 说明:该参数可以列出指定要求的jar,其他的忽略
    • 示例:-Dincludes=velocity:velocity,只列出velocity的依赖关系
    • 参数值:[groupId]:[artifactId]:[type]:[version],参数格式就是这样的,没有的值可以留空,举例-Dincludes=:spring-aop,-Dincludes=:::5.0.6.RELEASE,-Dincludes=org.springframework
    • 通配符:在参数中可以使用通配符,例如org.apache., :::-SNAPSHOT
    • 多个参数值:参数后面可以跟多个参数值,以英文逗号分隔,举例-Dincludes=org.apache.maven*,org.codehaus.plexus
  • excludes
    • 说明:该参数的用法跟includes是一样的,不过这个参数的作用是排除指定的jar

dependency:analyze-only命令可以分析整个项目,并且找出项目中依赖有如下情况的:

  • 声明了并且使用了的依赖
  • 没有声明但是使用了的依赖
  • 声明了但是没有使用的依赖

maven home配置 和java多版本选择

mac maven总结:maven配置和java_home mvn编译整个工程

export MAVEN_HOME=/Users/mah/Downloads/apache-maven-3.0.5 
export PATH=$PATH:$M2_HOME/bin

具体配置:在 ~/.bash_profile 
source ~/.bash_profile 修改默认文件的 java_home 

$mvn -v
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /Users/mah/Downloads/apache-maven-3.6.3
Java version: 11.0.2, vendor: Oracle Corporation, runtime: 
/Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home
#展示java所有安装版本:
(dev)> /usr/libexec/java_home -V
Matching Java Virtual Machines (2):
    17.0.2 (x86_64) "Oracle Corporation" - "Java SE 17.0.2" /Library/Java/JavaVirtualMachines/jdk-17.0.2.jdk/Contents/Home
    11.0.2 (x86_64) "Oracle Corporation" - "Java SE 11.0.2" /Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home

java安装目录
/Library/Java/JavaVirtualMachines/jdk-17.0.2.jdk/Contents/Home

选择java版本放入 java_home中 > 放在 ~/.bash_profile配置文件中
export JAVA_HOME=$(/usr/libexec/java_home -v1.8)
export JAVA_HOME=$(/usr/libexec/java_home -v14)
echo $JAVA_HOME

推荐阅读

java面试大全-找工作必备-一文完成复习找工作

juejin.cn/post/699477…

Java 最常见的 200+ 面试题:面试必备

juejin.cn/post/684490…

leetcode刷题必备-面试必备-GitHub 上 Star 最多的算法项目

juejin.cn/post/707498…

一口气说出 9种 分布式ID生成方式,面试官有点懵了

juejin.cn/post/684490…

java书单 juejin.cn/post/699248…

Redis系列-我用1W字总结了所有的点,确定不了解一下吗?

juejin.cn/post/699108…

Python面试题大全 - 50道经典面试题

juejin.cn/spost/72581…

python常用库-python常用包大全

juejin.cn/post/723262…

Arthas - Java 线上问题定位处理的终极利器

juejin.cn/post/699501…

graphql入门必知必会-看完不用看其他了

juejin.cn/post/725028…

maven命令分析+区别介绍-maven包冲突解决大全

juejin.cn/post/725289…

大厂面试真经