【Maven常用总结】

Maven常用总结



前言

这是一个随手记录常用工具的使用的分类,以便后续用到时及时查找到资料并回顾。


一、scope的解释

这里只记录test的意思,后续遇到其他runntime(运行时范围),provided(已提供范围),system(系统范围)情况时再精细学习,记录。

首先默认就是compile,什么都不配置也就是意味着compile。compile表示被依赖项目需要参与当前项目的编译,当然后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去。

test(测试范围)
scope为test表示依赖项目仅仅参与测试相关的工作,包括测试代码的编译,执行。比较典型的如junit。

二、DepencyManagement

DepencyManagement:
dependencyManagement让子项目中引用一个依赖而不用显示的列出版本号。Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用在这个dependencyManagement元素中指定的版本号。 这样做的好处:统一管理项目的版本号,确保应用的各个项目的依赖和版本一致。

Dependency:
所有生命在dependencies里的依赖都会自动引入,并默认被所有的子项目继承。

两者区别:

  1. dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)

  2. dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。

三、使用import scope解决maven继承(单)问题

我们知道Maven的继承和Java的继承一样,是无法实现多重继承的,如果10个、20个甚至更多模块继承自同一个模块,那么按照我们之前的做法,这个父模块的dependencyManagement会包含大量的依赖。如果你想把这些依赖分类以更清晰的管理,那就不可能了,import scope依赖能解决这个问题。你可以把dependencyManagement放到单独的专门用来管理依赖的pom中,然后在需要使用依赖的模块中通过import scope依赖,就可以引入dependencyManagement。
demo:
用于依赖管理的pom

<project>
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.test.sample</groupId>
	<artifactId>base-parent1</artifactId>
	<packaging>pom</packaging>
	<version>1.0.0-SNAPSHOT</version>
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>junit</groupId>
				<artifactid>junit</artifactId>
				<version>4.8.2</version>
			</dependency>
			<dependency>
				<groupId>log4j</groupId>
				<artifactid>log4j</artifactId>
				<version>1.2.16</version>
			</dependency>
		</dependencies>
	</dependencyManagement>
</project>

通过非继承的方式来引入这段依赖管理配置:

<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>com.test.sample</groupId>
			<artifactid>base-parent1</artifactId>
			<version>1.0.0-SNAPSHOT</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>
 
<dependency>
	<groupId>junit</groupId>
	<artifactid>junit</artifactId>
</dependency>
<dependency>
	<groupId>log4j</groupId>
	<artifactid>log4j</artifactId>
</dependency>

注意:import scope只能用在dependencyManagement里面这样,父模块的pom就会非常干净,由专门的packaging为pom来管理依赖,也契合的面向对象设计中的单一职责原则。此外,将dependency分类,每一类建立单独的pom文件,以更细化的方式管理依赖。这种做法与面向对象设计中使用组合而非继承也有点相似的味道。

四、mvn dependency:tree 使用详解

在实际开发过程中,会经常碰到maven依赖冲突的问题,导致编译的时候报一些异常,这里提供一个查询包结构间的依赖关系的方法,来解决问题

指令:mvn dependency:tree -Dverbose>temp/tree.txt

高版本尝试:mvn dependency:tree -Doutput>./tree.txt

该命令是打印详细的maven tree 并放入当前目录下的temp目录下的tree.txt (需要自己新建temp目录),打印到txt中更加方便排查。

生成的txt文件中
最后写着compile的就是编译成功的
最后写着omitted for duplicate的就是有JAR包被重复依赖了,但是JAR包的版本是一样的
最后写着omitted for conflict with xx的,说明和别的JAR包版本冲突了,该行的JAR包不会被引入
通过在txt文件中检索上传关键字conflict可以找到冲突的jar包所在,从而去除掉。

去除方法:标签
例:

<exclusions>
     <exclusion>
          <groupId>net.minidev</groupId>
          <artifactId>json-smart</artifactId>
      </exclusion>
</exclusions>

去除掉这个依赖就ok啦。
查找maven依赖地址:https://mvnrepository.com/


总结

业精于勤荒于嬉,行成于思毁于随。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

31马赫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值