1 初识 Maven
- Maven 是 Apache 基金会的开源项目,使用 Java 开发。是项目的自动化构建工具
- 构建环节: 清理、编译、测试、报告、打包、安装、部署
- 用途
- 项目的自动构建,帮助开发人员做项目的编译、测试、打包、安装、部署等工作
- 管理依赖(项目中使用的各种 jar 包)
- 依赖:项目中需要使用的其他资源, 常见的是 jar 包
- 例如:项目要使用 mysql 驱动。就说项目依赖 mysql 驱动
- 获取
- 地址: http://maven.apache.org/
- 从中下载 .zip 文件
- 安装:
- 确定 JAVA_HOME 指定 jdk 的安装目录
- 解压下载的 Maven.zip
- 目录的路径不要有中文, 不要有空格。
- 把 maven 安装目录中下的 bin 的路径添加到 path 中
- 测试 maven 安装是否成功
- 在命令行执行
mvn -v
- 出现如下命令则成功安装
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: D:\Maven\Maven3.3.9\bin\..
Java version: 1.8.0_281, vendor: Oracle Corporation
Java home: D:\java\jdk\jdk1.8.0\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "dos"
- maven 目录结构
- 使用方式:
- 独立使用:可以独立创建项目,编译代码,测试程序,打包,部署等等
- 大多数文件、文件夹自己创建或者导入
- 与 IDEA 一起使用:通过 IDEA 借助 maven,实现编码,测试,打包等等
2 Maven 核心概念
2.1 约定的目录结构
- 约定的目录结构:maven 项目使用的大多人遵循的目录结构
- 一个 maven 项目设置一个文件夹。 比如项目叫做 Hello World
main:主程序目录(完成项目功能的代码和配置文件)
main\java:存放源代码目录(包和相关的类定义)
main\resource:存放源代码配置文件目录
test:存放测试程序代码的目录(开发人员自己写的测试代码)
text\java:存放测试代码的单元测试(junit)目录
test\resource:存放测试程序需要的配置文件目录
pom.xml:maven的配置文件, 核心文件
2.2 POM 文件
- POM: Project Object Model 项目对象模型
- maven 把项目当做模型处理,操作这个模型就是操作项目。
- maven 通过 pom.xml 文件实现项目的构建和依赖的管理
- pom.xml 文件内容
<?xml version="1.0" encoding="UTF-8"?>
<!-- project 是根标签, 后面是约束文件 -->
<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">
<!-- pom 模型的版本, 就是4.0.0 -->
<modelVersion>4.0.0</modelVersion>
<!-- 坐标 -->
<groupId>com.bjpowernode</groupId>
<artifactId>ch01-maven</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
</project>
2.3 坐标
- 坐标概念来自数学,组成是 groupId, artifiactId, version
- 坐标作用:确定资源的,是资源的唯一标识
- 在 maven 中,每个资源都是坐标,坐标值是唯一的。简称为:gav
- 项目使用 gav :
- 每个 maven 项目,都需要有一个自己的 gav
- 管理依赖,需要使用其他的 jar ,也需要使用 gav 作为标识
- 搜索坐标的网址: https://mvnrepository.com/
- 例如:
<groupId>com.bjpowernode</groupId>
<artifactId>ch01-maven</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
groupId:指组织名称,公司,团体或者单位的标识
- 常使用的公司域名的倒写
- 如果项目规模比较大, 也可以是 域名倒写+大项目名称。
artifactId:指项目名称
- 如果 groupId 中有项目, 此时当前的值就是子项目名
- 项目名称是唯一的。
version:指版本、项目的版本号,推荐使用三位数字组成。例如主版本号.次版本号.小版本号
- 注意:版本号中有 -SNAPSHOT, 表示快照,不是稳定的版本
packaging:指项目打包的类型, 有 jar、war、ear、pom等等。默认是 jar
2.4 依赖
- 依赖(dependency):项目中要使用的其他资源(jar)
- 需要在 pom.xml 文件中,使用 dependencies 和 dependency 标签以及 gav 标签共同完成依赖的说明
- 使用 gav 作为标识,从互联网下载依赖的 jar,再由 maven 管理项目使用的这些 jar
- 格式:
<dependencies>
<dependency>
<groupId>XXXX</groupId>
<artifactId>XXXX</artifactId>
<version>XXXX</version>
</dependency>
</dependencies>
- 例如:
<dependencies>
<!-- 日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- mysql 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.16</version>
</dependency>
</dependencies>
- 判断 jar 是否能使用技巧:如果 仓库中的 jar 包以 .lastUpdated 结尾一定是使用不了的
- 例如:
2.5 仓库
maven 仓库存放:
- maven 工具自己的 jar 包
- 第三方的其他 jar, 比如项目中要使用 mysql 驱动
- 自己写的程序,可以打包为 jar 存放到仓库
仓库分为本地仓库和远程仓库
本地仓库(本机仓库): 位于自己的计算机, 是磁盘中的某个目录
本地仓库:默认路径:登录操作系统的账号的目录中的 /.m2/repository
C:\Users\Handsome Black\.m2\repository
修改本地仓库的位置:修改 maven 的配置文件 setting.xml
路径:maven 的安装路径\conf\setting.xml
步骤:
创建一个目录,作为仓库使用(存在就不用创建)
- 目录不要有中文和空格。 目录尽量不要太深
修改 setting.xml 文件(修改文件时先备份,养成好习惯),创建 localRepository 标签填上目录地址
例如:
<localRepository>D:/Maven/openrepository</localRepository>
远程仓库: 需要通过联网访问的
- 中央仓库: 一个 ftp 服务器, 存放了所有的资源
- 中央仓库的镜像: 就是中央仓库的拷贝。 在各大主要城市都有镜像
- 私服:在局域网中使用的。 私服就是自己的仓库服务器。 在公司内部使用的。
使用 maven 仓库:
- 当项目启动后, maven 自动使用仓库
- 执行了 maven 的命令, maven 会首先访问的是本地仓库, 从仓库中获取所需的 jar
- 如果本地仓库没有 ,需要访问私服或者中央仓库或者镜像下载
- 图示:
2.6 生命周期
maven 的生命周期:指项目构建的各个阶段。 包括清理、 编译、测试、报告、打包、安装、部署
- 在测试中会使用到单元测试(junit)
单元测试(junit):junit 是一个单元测试的工具, 在 java 中经常使用
单元:在 java 中指的是方法。一个方法就是一个单元, 方法是测试的最小单位
作用:使用 junit 去测试方法是否完成了要求(开发人员测试)
使用单元测试:
加入 junit 依赖(一些类和方法)
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>
在 项目/src/test/java 目录中创建测试类文件
单元测试使用的建议:
测试类的定义名称一般是 Test+要测试的类名称
测试类它的包名和要测试的类包名一样
在类中定义方法、需要的测试代码
- 方法的定义规则:使用 public 访问修饰符、没有返回值、方法名称自定义(建议 Test+测试的方法名称)、不定义参数
在测试类中的方法,可以单独执行。测试类也可以单独执行
在方法的上面加入 @Test,表示该方法是单元测试方法
2.7 命令
命令: 执行 maven 功能是由命令发出的
- 例如:mvn compile
常用命令(同时也是 Maven 程序生命周期演示):
mvn clean:清理命令, 作用删除以前生成的数据, 删除target 目录
- 使用插件:maven-clean-plugin 版本 2.5
mvn compile:编译命令,执行的代码编译, 把项目/src/main/java 目录中的所有 java 代码编译为 class 文件。同时将 class 文件拷贝到 target/classes 目录
- classes 是存放类文件的根目录(也叫做类路径,classpath)
- 使用插件:
- maven-compiler-plugin 版本 3.1:编译代码的插件
- maven-resources-plugin 版本 2.6:资源插件, 处理文件。作用是把 项目/src/main/resources 目录中的文件拷贝 target/classes 目录中
mvn test-compile:编译命令, 编译 项目/src/test/java 目录中的源文件, 把生成的 class 拷贝到 target/test-classes 目录。同时把 src/test/resources 目录中的文件拷贝到 test-clasess 目录
- 使用插件:
- maven-compiler-plugin 版本 3.1
- maven-resources-plugin 版本 2.6
mvn test:测试命令, 作用执行 test-classes 目录的程序, 测试 src/main/java 目录中的主程序代码是否符合要求
- 使用插件: maven-surefire-plugin 版本 2.12.4
mvn package:打包,作用将把项目中的资源 class 文件和配置文件都放到一个压缩文件中, 默认压缩文件是 jar 类型; web 应用是 war 类型, 扩展是 .jar,.war
使用插件:maven-jar-plugin 版本 2.4:执行打包处理。 生成一个 .jar 文件, 放在 target 目录下
打包的文件包含的是 src/main 目录中的所有的生成的class 和配置文件与 test 无关
打包后的文件名命名规则为 artifactId-version.packaging 的标签组合
例如:ch01-maven-1.0-SNAPSHOT.jar 的 gav 为
<groupId>com.bjpowernode</groupId> <artifactId>ch01-maven</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging>
mvn install : 把生成的打包的文件 ,安装到 maven 仓库方便其他成员使用
使用插件: maven-install-plugin 版本 2.4 :将生成的 jar文件安装到本地仓库
jar 包的路径如何生成的?
查看查看中的 jar 文件的 gav
<groupId>com.bjpowernode</groupId> <artifactId>ch01-maven</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging>
groupId 中的值, 如果有 "." 前和后都是独立的文件夹
artifactId 也是一个独立的文件夹
version 也是独立的文件夹
2.8 自定义配置插件
插件:指要完成构建项目的各个阶段,使用 maven 的命令, 执行命令的功能是通过插件完成的。插件就是 jar、一些类
自定义配置插件在 pom.xml 文件中,使用 build 标签设置设置构建项目相关的内容,plugin 设置插件(一个 plugin 一个插件)
<!-- 设置构建项目相关的内容 --> <build> <plugins> <!-- 设置插件 --> <plugin>XXXX</plugin> </plugins> </build>
build 标签与 dependencies 标签同级
例如:修改 org.apache.maven.plugins 的 jdk 版本
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <!-- 指定编译代码的jdk版本 --> <target>1.8</target> <!-- 运行java程序使用的jdk版本--> </configuration> </plugin> </plugins> </build>
source:编译的版本
target:运行的版本
3.1 IDEA 中集成 maven
IDEA 中有一个自带的maven,修改不方便,所有我们一般使用 自己的 Maven,也称为集成 Maven
使当前项目有效的设置步骤
- 进入 IDEA 的 Maven 设置界面
- 设置 VM Options 值为:
-DarchetypeCatalog=internal
- 使 Maven 创建项目时不下载 archetype-catalong.xml 文件(8 m 左右),加快创建 Maven 项目的速度
- 导入的 Maven 配置文件依然生效的设置
- 其他的设置方法同上
3.2 创建基于 maven 项目
- 普通的 Java 项目
- 演示的为创建项目(Project),也可以创建工程(Module)。项目、工程具体谁是谁意义不大,做区别使用
- 创建 web 项目
3.3 IDEA 工具窗口
- 图示:
- 用于代替命令控制 Maven,运行过项目的工具窗口还有依赖窗口
- 例如:
3.4 导入 module 到 idea
- 图示:
4.1 依赖管理
依赖范围:使用 scope 标签表示依赖的范围
... <scope>XXX</scope> ...
依赖范围表示这个依赖( jar 和里面类)在项目构建的那个阶段起作用
依赖范围常见值:
compile
test
provided
对主程序是否有效
Yes
No
Yes
对测试程序是否有效
Yes
Yes
Yes
是否参与打包
Yes
No
No
是否参与部署
Yes
No
No
compile:参与构建项目的所有阶段。默认采用
test:测试。例如执行 mvn test 会使用 junit。在测试阶段使用
provided:提供者。 项目在部署到服务器时,不需要提供这个依赖的 jar 包,而是由服务器这个依赖的 jar 包。明显的是 servlet 和 jsp 依赖
确定依赖值方法:
- 在 Maven 仓库存在依赖信息,如果没有就是默认
4.2 properties 标签设置
常用配置
<properties> <maven.compiler.source>1.8</maven.compiler.source> 源码编译 jdk 版本 <maven.compiler.target>1.8</maven.compiler.target> 运行代码的 jdk 版本 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 项目构建使用的编码,避免中文乱码 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 生成报告的编码 </properties>
全局变量
在 properties 标签中定义标签,这个标签就是一个变量, 标签的文本就是变量的值
用途:主要使用全局变量表示多个依赖使用的版本号
步骤:
在 properties 标签内,自定义一个标签,在内指定版本的值
<properties> ... <!--自定义变量--> <spring.version>5.2.5.RELEASE</spring.version> <junit.version>4.11</junit.version> </properties>
标签名称自定义,建议以"见名知意"为原则
使用全局变量, 语法格式:
${变量名}
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency>
4.3 指定资源位置
使用资源插件指定资源位置
资源插件用途:告诉 maven 将项目/src/main/java 目录中的指定扩展名的文件,拷贝到 target/classes 目录中
maven 默认处理配置文件的方式
- maven 会将项目/src/main/resources 目录中的文件, 拷贝到 target/classes 目录下
- maven 只处理 src/main/java 目录中的 .java文件,把这些java 文件编译为 class,拷贝到 target/classes 目录中。 不处理其他文件
修改设置方法:使用资源插件 resource,并在 build 标签内进行设置
使用步骤:
- 设置项目文件夹目录:directory 标签
- 设置扫描文件类型:includes 标签
- 设置是否启用过滤器(使用“上面”定义的文件也纳入处理范畴,处理后的文件也放入 .class 文件):filtering 标签
- 一般使用 false
<build>
<!--资源插件-->
<resources>
<resource>
<!--所在的目录-->
<directory>src/main/java</directory>
<!--扫描文件类型-->
<includes>
<!--包括目录下的.properties,.xml 文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<!-- filtering 选项 false 不启用过滤器-->
<filtering>false</filtering>
</resource>
</resources>
</build>