系列文章目录
1.Maven 初学到跑路文章目录
1.POM
POM:Project Object Model 项目对象模型
pom.xml :对于Maven工程师核心配置文件,与构建过程相关的所有设置都在这个文件中进行配置。后面的学习都是围绕该配置文件。
2.坐标
对照着数学中的坐标,我们来学习Maven中的坐标文件
- 在数学中的坐标
平面中,使用 X , Y 两个向量可以表示平面中的一个点
空间中,使用 X , Y , Z 三个向量可以标识空间中的一个点 - 在Maven中的坐标groupid:
公司或组织域名倒序+项目名
<groupid> com.xiyou.maven</groupid>
artifactid:模块名
<artifactid>login</artifactid>
version:版本
<version>1.0.0</version>
3.仓库
- 仓库的分类
- 本地仓库:当前电脑上部署的仓库项目,为电脑上所有Maven工程服务
- 远程仓库:
1.私服:搭建在局域网环境中,为局域网范围内的所有Maven工程服务
2.中央仓库:假设在Internet上,为全世界所有Maven工程服务
3.中央仓库镜像:为了分担中央仓库的访问压力,提高用户体验性
- 仓库中保存的内容
Maven自身所需的插件
第三方框架或者工具的Jar包
我们自己开发的Maven工程
4.依赖
我们先要了解一下SNAPSHOT和RELEASEd 区别
SNAPSHOT : 不稳定版本 或者 快照版本,表示改项目还处于开发状态,随时都可能发生变化,所以它是不稳定版本。
RELEASE : 代表稳定版本或者发布版本,一般项目上线都会改为RELEASE版本。
案例:
- 创建一个与第一个Maven工程相同的目录结构
- 将第一个工程安装到Maven仓库中
3.编辑pom.xml,将第一个工程的依赖导入当前项目中
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xiyou</groupId>
<artifactId>HelloMaven1</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jmod-plugin</artifactId>
<version>3.0.0-alpha-1</version>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>com.xiyou.maven</groupId>
<artifactId>FirstMaven</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
4.编写测试案例
/**
* @author lp
* @version 1.0
*
*/public class HelloMavenAgain {
public String sayHelloAgain() {
HelloMaven helloMaven = new HelloMaven();
String result = helloMaven.sayHello("Maven");
return result + " again";
}
}
/**
* @author lp
* @version 1.0
*/
public class HelloTest {
@Test
public void testHello() {
HelloMavenAgain again = new HelloMavenAgain();
String result = again.sayHelloAgain();
assertEquals("Hello Maven again",result);
}
}
5.常见依赖范围对比
常见的依赖范围有三种:compile,test,provided
provided依赖就比如:Servlet的依赖是由tomcat提供的,我们开发的时候要导入该依赖,但是我们部署的时候,一颗由服务器提供,类似于这种依赖关系 我们会使用provided。
1.compile依赖范围
- 主程序:有效
- 测试程序:有效
- 打包:参与
- 部署:参与
2.test依赖范围
- 主程序:无效
- 测试程序:有效
- 打包:不参与
3.provided依赖范围
- 主程序:有效
- 测试程序:有效
- 打包:不参与
- 部署:不参与,原本的依赖由服务器提供
6.生命周期
Maven 抽象出了一个适合于所有项目的构建生命周期,并将它们统一规范。具体步骤包括清理、初始化、编译、测试、打包、集成测试、验证、部署和生成站点。这些步骤几乎适合所有的项目,也就是说,所有项目的管理构建过程都可以对应到这个生命周期上来。Maven 在项目的构建过程中,只是在方向和步骤上面起到了管理和协调的作用。
6.1Maven的三个生命周期
Maven中有三个相互独立的生命周期,分别是:
- Clean Lifecycle:在进行项目构建前进行的一些清理工作
- **Default Lifecycle:**构建的核心部分,如编译,测试,打包,安装,部署等。
- Site Lifecycle: 生成项目报告,发布站点等。
6.2Clean 生命周期
- pre-clean:执行一些需要在clrean之前完成的工作
- clean:删除上一次构建生产的文件
- post-clean:执行一些需要在clean之后完成的工作
6.3Default生命周期
- validate:验证,验证项目是否正确且所有必须信息是可用的
- compile:编译,源代码编译在此阶段完成
- Test:测试,使用适当的单元测试框架进行测试,例如JUnit。
- package:打包,创建jar包 或 war包
- verify:检查,对集成测试的结果进行检查,以保证质量达标
- install:安装,安装打包的项目到本地仓库,以供其他程序使用
- deploy:部署,拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程
6.4 Site Lifecycle生命周期
- pre-site:执行一些生成站点文档之前所要完成的工作
- site:生成项目的站点文档
- post-site:执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
- site-deploy:将生成的站点文档部署到特定的服务器上构建中生命周期的
特点:无论你从生命周期的哪一步执行,Maven都会从该生命周期的第一步开始执行
6.5 插件和插件目标:
- 生命周期的各个阶段仅仅定义了要执行的任务是什么。
- 各阶段和插件的目标是对应的
- 相似的目标由特定的插件来完成
- 插件目标也可以看作是调用插件的命令
生命周期 | 插件目标 | 插件 |
---|---|---|
compile | compile | maven-compile-plugin |
test-compile | testCompile | maven-compile-plugin |
7.IDEA中使用Maven
7.1配置Maven插件
idea–>file–>Settings–>Build,Execution,Deployment—>Build Tools–>Maven
Maven home directory: maven的安装目录
User settings file:Maven安装目录conf/settings.xml配置文件
Local repository: Maven本地仓库的目录位置
7.2配置Maven环境
VM Options:-DarchetypeCatalog=internal
-DarchetypeCatalog=internal,maven :Maven项目在创建时,会联网下载模板文件
-DarchetypeCatalog=internal :Maven项目创建时,不下载模板文件,创建速度会提高
JRE:选择JDK6以上版本
8.创建Maven工程
1.创建一个空项目
2.创建module
Create from archetype:是创建module使用模板的意思,勾选后可以选择你想创建的模板
- maven-archetype-quickstart : 普通的java项目
- maven-archetype-webapp : web工程
3.使用IDEA中使用Maven命令
4.IEDA创建普通的Java工程和Web工程
- 普通工程不使用模板创建即可
- web工程使用模板webapp(第二步已画出)
在main目录中添加约定结构(具体参照上一个博客 嘿嘿 )
5.导入已经存在的Maven工程
1.File–>Project from Existing Source
9.依赖关系
9.1依赖的传递性
通过快捷键:Alt + Ctrl +Shift + U 调出 Maven项目依赖关系,查看第一个 和 第二个Maven项目间的依赖关系
注意:非compile范围的依赖不能被传递
9.2依赖排除
在实际开发中,我们经常会遇到Maven依赖冲突的问题,导致编译时报一些异常,处理依赖冲突问题,我们可以解除依赖排除。这里我们提供两种方式,第一种是图形化界面操作,第二种是手动添加依赖排除
9.3依赖原则
当我们项目中引用了不同版本的jar包,那么传递依赖关系中,被传递的依赖关系如何确定?
1. 就近原则
如果依赖关系层数不同,则采取就近原则,那么"最上层"- FirstMaven 被传递的 log4j的版本应该是 1.4
2. 先到先得原则
如果依赖关系层数相同,则采取先到先得原则。如果在FirstMaven 的 pom.xml中,先声明对ThirdMaven的依赖,则"最上层" -FirstMaven 被传递的 log4j的版本应该是 1.7。
10.统一管理依赖关系
比如我们后面学习Spring框架时,Spring的各个jar的版本都是5.2.7
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.7.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
某天,我们需要对Spring进行升级,一个一个手动修改的话,可能会出现遗漏或者错误信息的情况。所以我们使用统一的依赖管理
1.使用properties标签,在其内部使用自定义标签统一声明版本号
2.在需要统一版本的位置,使用${自定义标签名}引用声明的版本号
<version>${xiyou.spring.version}</version>
11.聚合工程
聚合工程可以一键安装各个模块工程,我们只需要在总聚合工程中配置聚合的模块即可