maven有啥用
1.jar包难找
没有maven之前没有统一的管理工具,想引入一个包得到处搜索下载。
2.jar包依赖
一般来说一个包很有可能依赖了其他好几个包,我们想使用一个包的时候就得将这个包及其依赖的其他包都下载回来进行管理。
3.jar包冲突
通常我们一个项目会引用多个包来实现功能,但是我们引用进来的这些包依赖的子包,可能有重复但是版本不同的。这样我们要手动解决冲突还是很繁琐的事情。
4.jar包管理
jar包自己放在本地进行使用的话,如果团队来了新成员的话,又得将一堆jar包copy给新同事。而且要是开发新功能引入新依赖或变更了依赖的版本,整个团队又要把jar包导来导去的。
5.java项目结构多样
没有统一的项目结构,上手慢。时间浪费在适应项目结构
6.生命周期管控不科学
有些通用的周期工具,测试、编译打包的小工具。会被重复开发,浪费时间。
依赖管理
因为这个应该是maven最重要的功能啦,maven通过项目中的pom文件,来设置管理依赖的数据包。maven解决以上痛点的方式主要引入了以下几个概念:
1.约定大于配置 (maven通过提倡一个通用的工程结构,来使得maven进行编译、打包变得更加方便。大家如果都遵守这一标准,也使得上手理解新的工程项目会变得非常简单易上手)。
2.maven坐标 通过坐标配置的方式绑定唯一软件包。和身份证号码确定唯一一个公民一样,maven引入了一套maven坐标来确定唯一的一个软件包。maven坐标包含了以下内容。
groupId(必须项):构件组名如org.apache.flink(flink下有很多包)
artifactId(必须项):构建组中的构件编号如flink-java
version(必须项):当前构件的版本号。如flink-java 就存在1.10.0、1.11.1、1.11.2这么多flink版本
package (默认为jar):构件的打包方式。(可选项有:jar、war、ear、pom、maven-plugin)
3.通过maven坐标来导入依赖关系
项目中经常需要使用到其他实用的开源工具jar,在pom中要申明好需要的jar包(主要是确定jar包的maven坐标)
所有的依赖项目都在dependencies标签下,dependency标签下对应了需要引用的jar包的信息,可以包含的元素有:
groupId
artifactId
version
type(默认jar包)
scope!
why
一个工程的代码在不同阶段中可能有不同的需要情况。例如:
1.测试代码在正式环境中就用不到了
2.开发一个flink job 有一些 flinkjob 的jar包只在本地的开发调试阶段会用到, 发送到flink集群上运行的时候,实际上会使用flink集群中自带的jar包。并且flink job 打包冗余的jar包会使上传的数据量变大。
3.jdbc的驱动 一般只在运行的时候会使用到,编译时使用不到。
为了在项目不同阶段对jar包使用不同的支持,引入了scope配置来帮助我们进行管理:
compile -> 默认配置项 jar包 在编译源码、编译测试代码、测试、运行四中环境下均生效
test -> 测试依赖范围 只在编译测试、运行测试阶段生效
provide -> 在编译源码、编译测试、运行三种环境下进行生效
runtime -> 在编译测试、运行测试、运行三种情况下进行生效
option!
why
maven会对数据进行依赖传递,例如A->B, B->C。则会自动传递依赖A->C。
设置为true的话, 则表名依赖关系只在本项目内传递, 而不会被父项目所继承。
如果不想使用自动依赖传递的话,B->C 的时候 则可以将这个值设置为 true, 这样只存在B->C, 不会有A->B->C的传导链了。 则上述例子中就不会出现 A -> C自动依赖传递的情况了。
exclusions!
why
依赖排除项,指定排除子包中的依赖项目。当遇到项目与子包中的依赖项(多个)中的个别依赖冲突的时候使用(老版本存在漏洞、jdk版本冲突的情况)。可以主动解除对指定的项目中的包的依赖。
demo
例如让项目解除对A包中依赖的A1、A2包的依赖。
<dependency>
<groupId>com.testproject</groupId>
<artifactId>A</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>com.testproject</groupId>
<artifactId>A1</artifactId>
</exclusion>
<exclusion>
<groupId>com.testproject</groupId>
<artifactId>A2</artifactId>
</exclusion>
</exclusions>
</dependency>