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…
包的冲突命令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面试大全-找工作必备-一文完成复习找工作
Java 最常见的 200+ 面试题:面试必备
leetcode刷题必备-面试必备-GitHub 上 Star 最多的算法项目
一口气说出 9种 分布式ID生成方式,面试官有点懵了
java书单 juejin.cn/post/699248…
Redis系列-我用1W字总结了所有的点,确定不了解一下吗?
Python面试题大全 - 50道经典面试题
python常用库-python常用包大全
Arthas - Java 线上问题定位处理的终极利器
graphql入门必知必会-看完不用看其他了
maven命令分析+区别介绍-maven包冲突解决大全