Maven学习笔记
1.Maven概念
Maven 是目前最流行的自动化构建工具,Maven是一款在大型项目开发过程中不可或缺的重要工具。
- maven可以管理jar文件
- 自动下载jar和他的文档,源代码
- 管理jar直接的依赖, a.jar需要b.jar , maven会自动下载b.jar
- 管理你需要的jar版本
- 帮你编译程序,把java编译为class
- 帮你测试你的代码是否正确。
- 帮你打包文件,形成jar文件,或者war文件
- 帮你部署项目
其中5.6.7.8属于Maven项目构建的过程,所以Maven不仅可以完成jar包的管理,还能完成项目的构建。
2.Maven项目构建
项目构建是面向过程的,就是一些步骤,完成项目代码的编译,测试,运行,打包,部署等等。maven支持的构建包括有:
- 清理:把之前项目编译的东西删除,为新的编译代码做准备。
- 编译: 把java文件编译为class文件,Maven的编译功能是批量的,可以同时把成千上万的文件编译为class。与命令javac不同,javac一次编译一个文件。
- 测试:maven可以执行测试程序代码,验证你的功能是否正确。同时也是批量操作,即maven可以同时执行多个测试代码,同时测试很多功能。
- 报告:生成测试结果的文件, 通过报告查看测试是否通过。
- 打包:如果测试通过,就可以对项目进行打包。打包的含义就是 把你的项目中所有的class文件,配置文件等所有资源放到一个压缩文件中。通常java程序,压缩文件是jar扩展名的。对于web应用,压缩文件扩展名是.war。
- 安装:在Maven环境下把“打包”生成的jar、war文件安装到本地仓库。
- 部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行
部署一般采用手动完成,前6个步骤都是通过Maven进行实现。
3.Maven的核心概念
-
POM:Maven的核心,它是一个文件,名称通常为pom.xml,开发人员通过管理pom.xml可以完成控制maven构建项目的过程以及jar包依赖的管理。
-
约定的目录结构 : maven项目的目录和文件的位置都是规定的。
-
坐标 : 是一个唯一的字符串,用来表示资源的。
-
依赖管理 : 管理项目中可以使用的jar文件。
-
仓库管理(了解) :资源存放的具体位置。
-
生命周期 (了解) : maven工具构建项目的过程,就是生命周期。即Maven项目构建的7个步骤就代表Maven的生命周期。
-
插件和目标(了解):执行maven构建的时候用的工具是插件
-
继承(后期讲解)
-
聚合(后期讲解)
可以使用maven的命令完成相关操作,同时也可以在idea中直接使用maven,代替命令。
Maven的构建直接看视频即可。
4.Maven的核心概念详述
4.1 Maven工程约定的目录结构
mvn compile
:编译src/main/java
下的所有java
文件,生成class文件,正确执行mvn compile
命令的结果是在项目的根目录(Hello)下生成target目录,maven对java文件进行编译,将编译完成的class文件放在target/classes
中
4.2 pom文件
pom在maven中是一个pom.xml文件,该文件是maven的灵魂,maven的项目构建以及管理依赖的功能都是通过编写该文件实现的。
4.2.1 pom.xml文件的组成
(1) 坐标
唯一值, 在互联网中唯一标识一个项目的。坐标由三部分构成
<groupId>公司域名的倒写</groupId>
<artifactId>自定义项目名称</artifactId>
<version>自定版本号</version>
(2) packaging
打包后压缩文件的扩展名,默认是jar ,web应用是war
(3) 依赖
dependencies
和dependency
,相当于是 java代码中import
你的项目中要使用的各种资源说明, 比我的项目要使用mysql驱动
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
</dependencies>
先在本地仓库中找mysql文件夹(groupId对应的文件夹),找到后在mysql文件夹中找mysql-connector-java文件夹(artifactId对应的文件夹),最后在mysql-connector-java文件夹中找5.1.9版本对应的文件夹(version对应的文件夹),然后把对应的jar包引入我们的项目中,如果有任意一步没找到对应文件夹,则从中央仓库拉取。
Maven的一个重要作用就是管理jar包,为了一个项目可以构建或运行,项目中不可避免的,会依赖很多其他的jar包,在Maven中,这些jar就被称为依赖,使用标签dependency来配置。而这种依赖的配置正是通过坐标来定位的,由此我们也不难看出,maven把所有的 jar 包也都视为项目存在了。
(4) properties
properties 是用来定义一些配置属性的 , 例 如 project.build.sourceEncoding(项目构建源码编码方式),可以设置为 UTF-8,防止中文乱码。同时也可以设置项目的运行的Java版本。
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
(5) build
build表示与构建相关的配置,例如设置编译插件的 jdk 版本
<build>
配置插件
<plugins>
配置具体的插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
插件的名称
<artifactId>maven-compiler-plugin</artifactId>
插件的版本
<version>3.8.1</version>
配置插件的具体信息
<configuration>
告诉Maven 我们写的代码需要在jdk1.8下编译
<source>1.8</source>
告诉Maven 我们写的代码需要在jdk1.8下运行
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
(6) parent
在 Maven 中,如果多个模块都需要声明相同的配置,例如:groupId、 version、有相同的依赖、或者相同的组件配置等,也有类似 Java 的继承机 制,用 parent 声明要继承的父工程的 pom 配置。
(7) modules
在 Maven 的多模块开发中,为了统一构建整个项目的所有模块,可以提供一 个额外的模块,该模块打包方式为 pom,并且在其中使用 modules 聚合的 其它模块,这样通过本模块就可以一键自动识别模块间的依赖关系来构建所有 模块,叫 Maven 的聚合。
4.3 Maven的生命周期和插件
-
Maven的生命周期指的就是maven构建项目的过程,包括清理、编译、测试、报告、打包、安装、部署这几个阶段。这几个阶段都可以通过Maven相对应的命令进行完成。
-
Maven的插件:在Maven执行命令的过程中,真正完成命令对应功能的就是这些插件。这些插件就是一些jar文件。
4.4 Maven单元测试
(1)加入依赖,在pom.xml加入单元测试依赖
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
(2)在maven项目中的src/test/java
目录下,创建测试程序。
推荐的创建类和方法:
1.测试类的名称:Test + 你要测试的类名(注意类名Test必须大写,否则报错)
2.测试的方法名称:Test + 方法名称
例如你要测试Hello类中的add方法,则创建测试类TestHello
@Test
public void Testadd(){
测试HelloMaven的add方法是否正确
}
其中testAdd叫做测试方法,它的定义规则
1.方法是public的,必须的
2.方法没有返回值, 必须的
3.方法名称是自定义的,推荐是Test + 方法名称
4.在方法的上面加入 @Test
具体实例如下:
//该测试用例表示测试Myapp类中的add()方法。
public class TestMyapp {
@Test
public void Testadd(){
int ans = myapp.add(10,20);
//Assert.assertEquals(期望值,实际值),当两者不一样的时候将会抛出异常。
Assert.assertEquals(30,ans);
}
}
4.5 Maven常用命令
Maven可以独立使用,通过以下的命令就可以单独完成maven的生命周期的执行
- mvn clean:清理(会删除原来编译和测试的目录,即 target 目录,但是已经 install 到仓库里的包不会删除) ,该命令由maven-clean-plugin插件实现。
- mvn compile:编译主程序(会在当前目录下生成一个 target,里边存放编译主程序之后生成的字节码文件,并同时把main\resources下的配置文件复制一份至target\classes中) ,该命令由maven-compiler-plugin插件实现。
- mvn test-compile:编译测试程序(会在当前目录下生成一个 target,里边存放编译测试程序之后生成的字节码文件)
- mvn test:测试(会生成一个目录surefire-reports,保存测试结果)
- mvn package:打包主程序(会编译、编译测试、测试、并且按照 pom.xml 配置把主程序打包生成 jar 包或者 war 包) (该命令生成的jar包只包含
src/main
目录下的所有文件,test不包含。) - mvn install:安装主程序(会把本工程打包,并且按照本工程的坐标保存到本地仓库中)
- mvn deploy:部署主程序(会把本工程打包,按照本工程的坐标保存到本地库中,并且还会保存到私服仓库中。 还会自动把项目部署到 web 容器中)。
注意:执行以上命令必须在命令行进入 pom.xml 所在目录,同时比如你执行mvn test
,Maven会自动从上往下帮你执行,因此你不必在执行mvn test-compil
e等命令。
5.Maven在IDEA中的使用
5.1 Maven在IDEA中的配置
idea中内置了maven ,一般不使用内置的, 因为用内置修改maven的设置不方便。使用自己安装的maven, 需要覆盖idea中的默认的设置。让idea指定maven安装位置等信息
(1)配置当前工程的设置,
file--settings ---Build, Excution,Deployment--Build Tools--Maven
Maven Home directory: maven的安装目录
User Settings File : 就是maven安装目录conf/setting.xml配置文件
Local Repository : 本机仓库的目录位置
--Build Tools--Maven--Runner
VM Option: -DarchetypeCatalog=internal
JRE: 你项目的jdk
maven项目创建时,会联网下载模版文件,模版文件比较大, 使用-DarchetypeCatalog=internal,不用下载, 创建maven项目速度快。
(2)配置以后新建工程的设置, file--other settings--Settings for New Project
5.2 使用Maven模板创建项目
- maven-archetype-quickstart : 普通的java项目
- maven-archetype-webapp : web工程
6.Maven依赖的范围
Maven中的依赖范围利用<scope></scope>
标签表示。scope的值有 compile, test, provided ,默认是compile
scope:表示依赖使用的范围,也就是在maven构建项目的相应阶段中起作用。maven构建项目的过程即生命周期,包括编译,测试,打包,安装,部署过程(阶段)。
例如junit的依赖范围是 test,表示junit只在测试阶段使用。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
provided的含义在于:在编译、测试阶段需要提供相关的jar包,而在安装部署过程则不需要提供。