一、依赖管理
1、直接依赖和间接依赖
如果A依赖B,B依赖C,那么A→B和B→C都是直接依赖,而A→C是间接依赖。
2、依赖的范围
①compile
[1]main目录下的Java代码可以访问这个范围的依赖
[2]test目录下的Java代码可以访问这个范围的依赖
[3]部署到Tomcat服务器上运行时要放在WEB-INF的lib目录下
例如:对Hello的依赖。主程序、测试程序和服务器运行时都需要用到。
②test
[1]main目录下的Java代码不能访问这个范围的依赖
[2]test目录下的Java代码可以访问这个范围的依赖
[3]部署到Tomcat服务器上运行时不会放在WEB-INF的lib目录下
例如:对junit的依赖。仅仅是测试程序部分需要。
③provided
[1]main目录下的Java代码可以访问这个范围的依赖
[2]test目录下的Java代码可以访问这个范围的依赖
[3]部署到Tomcat服务器上运行时不会放在WEB-INF的lib目录下
例如:servlet-api在服务器上运行时,Servlet容器会提供相关API,所以部署的时候不需要。
3、依赖的传递性
A->B->C.C中compile对A可见,test和provided不可见
4、依赖的原则
1、路径最短者优先
项目A -> 项目B -> 项目C
| | |
log4j1.4 log4j1.4 log4j1.7
2、路径相同时先声明者优先(指的是dependency标签配置的先后顺序)
5、依赖的排除
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
<exclusions>
传递过来的包排除后,可以自己再定义另一个版本的依赖。如果不排除,自己直接配也会优先选用自己配的。
6、统一管理目标jar包的版本
<properties>
<spring.version>4.0.1.RELEASE</spring.version>
</properties>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
二、仓库
1、分类
[1]本地仓库:为当前本机电脑上的所有Maven工程服务。
[2]远程仓库
(1)私服:架设在当前局域网环境下,为当前局域网范围内的所有Maven工程服务。
(2)中央仓库:架设在Internet上,为全世界所有Maven工程服务。
(3)中央仓库的镜像:架设在各个大洲,为中央仓库分担流量。减轻中央仓库的压力,同时更快的响应用户请求。
2、本地仓库中的文件
[1]Maven的插件
[2]我们自己开发的项目的模块
[3]第三方框架或工具的jar包
※不管是什么样的jar包,在仓库中都是按照坐标生成目录结构,所以可以通过统一的方式查询或依赖。
三、生命周期
1、Clean生命周期一共包含了三个阶段:
①pre-clean 执行一些需要在clean之前完成的工作
②clean 移除所有上一次构建生成的文件
③post-clean 执行一些需要在clean之后立刻完成的工作
2、Site生命周期(mvn site)
①pre-site 执行一些需要在生成站点文档之前完成的工作
②site 生成项目的站点文档
③post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
④site-deploy 将生成的站点文档部署到特定的服务器上
这里经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这可是Maven相当强大的功能,Manager比较喜欢,文档及统计数据自动生成,很好看。
3、生命周期与自动化构建
运行任何一个阶段的时候,它前面的所有阶段都会被运行
四、插件和目标
每个插件都能实现多个功能,每个功能就是一个插件目标
五、导入项目
六、继承
父工程parent
<!-- 项目类型:pom用于声明父工程,jar用于声明java工程,war用于声明web工程 -->
<packaging>pom</packaging>
<!-- 依赖管理:父工程管理所有依赖,给子工程继承使用 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
子工程Hello
<!-- 继承父工程 -->
<parent>
<groupId>com.joker.maven</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
<dependencies>
<!-- 子工程继承父工程后需要声明一下依赖,不需要版本,只需声明一下用什么依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
七、聚合
模块很多,关系复杂,所以用到聚合
在父工程parent中的pom.xml设置:
<!-- 聚合:一键操作 -->
<modules>
<module>../Hello</module>
<module>../A</module>
<module>../B</module>
<module>../C</module>
<module>../D</module>
</modules>
之后只需对parent工程进行Maven Install,会自动进行编译运行。