maven
坐标
Maven坐标是什么
坐标用于描述仓库中资源的位置。
-
Maven 坐标的组成
groupld:定义当前Maven项目隶属的组织名(通常是域名反写)
artifactld:定义当前Maven项目的名称(通常是模块名称)
version:定义当前项目版本号
packaging:定义该项目的打包方式 -
Maven坐标的作用
使用唯一的标识,唯一性定位资源位置,通过该标识可以将资源的下载与识别交由机器完成。
总结: 坐标的作用主要就是将 资源的下载简化了,交由机器完成,减少工作量,便于管理。
仓库
用于存放jar包以及资源
仓库的分类
- 本地仓库:自己电脑上存储资源的仓库
- 远程仓库: 非自己电脑上的仓库,用于存储资源,为本地仓库提供资源。
- 中央仓库:由Maven组织维护,资源全面,当时地址在国外下载缓慢。
- 私服: 个人组织范围内存放资源的仓库
私服的作用: 私服的速度快,范围共享不对外公开,存放具有版权的资源。
依赖管理
依赖
- 直接依赖
- 间接依赖
直接依赖和间接依赖不是绝对的,取决于参照对象。
依赖传递
在配置依赖是,所配置依赖的依赖同样会生效。
依赖传递的问题
由于配置依赖时其他依赖同样会生效所以就会产生矛盾,当出现矛盾时有三种优先级。
- 路径优先:层级越低的优先级越高
- 声明优先:当资源在同级中被依赖时先配置的生效
- 特殊邮箱:在同一层级配置了不同资源的版本,后配置的生效。
特殊优先对应的是在同一层级(同一pom.xml文件中配置多个不同版本资源)这种情况,后配置的生效。
声明优先则是多个属于相同层级(非同一pom.xml文件)的依赖由上一层级的配置先后顺序决定。
可选依赖
将使用的依赖资源对外不公开,设为不透明。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
<optional>false</optional>
</dependency>
通过关键字 设置当前的依赖是否透明,不能进行传递。
排除依赖
排除依赖先比于可选依赖的不同在于,排除依赖是主动的,当依赖中出现了不需要的依赖时可以通过排除以来的方法,将该依赖删除。
<groupId>org.example</groupId>
<artifactId>maven01</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
通过关键字可以删除配置依赖中不需要的依赖。
依赖范围
- 主程序范围有效(mian文件夹范围)
- 测试程序范围有效(test文件夹范围)
- 是否参与打包(package指令范围之内)
scop | 主代码 | 测试代码 | 打包 | 示例 |
---|---|---|---|---|
compile(默认) | Y | Y | Y | log4j |
test | Y | junit | ||
provided | Y | Y | servlet-api | |
runtime | Y | jdbc |
生命周期以及插件
**生命周期:**在Maven运行时的阶段,每个阶段对应着默认的插件。
**插件:**通过插件来实现每个生命周期的要求。
- 通过插件的绑定,可以在执行到对应生命周期时进行操作,可添加插件。
- 默认Mavne在每个生命周期上都绑定的有预设功能
模板:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<!--操作执行-->
<executions>
<!--执行位置-->
<execution>
<!--执行操作-->
<goals>
<goal>jar</goal>
</goals>
<!--执行阶段-->
<phase>generate-resources</phase>
</execution>
</executions>
</plugin>
注意事项
Test后没有测试报告生成
在Test的过程中,可能会出现没有测试报告,以及在测试过程中成功,当时不显示测试信息的情况,这种情况出现的原因是因为 Test 的命名出现了问题。Maven 测试不会进行JUnit4的测试,Test 类 必须是以 Test打头或者以Test结尾。
servlet-api 不能打包
将servlet打包后可能会与服务器的servlet产生版本冲度导致错误.