Maven
1、配置 Maven
-
解压 Maven:包地址:
/Users/moby/IdeaProjects/tools/apache-maven-3.3.9 -
打开终端执行:
open ~/.bash_profile -
在
profile中输入以下内容:# 添加Maven到环境变量 export M3_HOME=/Library/Maven/apache-maven-3.3.9 export PATH=$M3_HOME/bin:$PATH
-
使新的环境变量生效:
source ~/.bash_profile -
输出 Maven 环境地址
echo $M3_HOME echo $PATH
-
查看 Maven 版本:
mvn -version
2、Maven 的目录结构
bin:含有 mvn 运行的脚本。boot:plexus-classworlds 类加载器框架。conf:含有 settings.xml 配置文件。- -settings.xml:其中含有默认的用户库。(可改默认本地仓库的地址)
lib:含有Maven运行时所需要的Java类库。
3、Maven 概述
3.1、软件工程
软件工程:为了能够实现软件的流水线式生产,在设计和构建软件时能够有一种规范和工程化的方法,人们便提出了软件工程概念。
3.2、什么是 Maven
Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和依赖管理。
依赖管理:项目中需要使用的其他 jar 包,项目依赖的内容。jar 包中的类可能使用另外一个 jar 包中的类,这两个 jar 也是依赖。
3.3、Maven的作用
- 管理多个模块,多个模块之间的关系。
- 管理依赖的 jar。
- 管理 jar 的版本。
- 自动下载 jar,文档,源代码。
- 构建项目(编译代码,测试程序,打包,部署等)。
3.4、项目构建的过程
清理、编译、测试、报告、打包、安装、部署。
- 清理:删除以前的编译结果,为重新编译做好准备。
- 编译:将 Java 源程序编译为字节码文件。
- 测试:使用 Maven 测试你写的方法是否完成了功能。
- 报告:把测试的结果写成文件。
- 打包:把程序的 class 文件和配置文件压缩为一个压缩文件(rar,zip)。
- 安装:把 5 打包后的文件安装到 Maven 的仓库。
- 部署:把 5 打包后的文件放到服务器上,准备执行。
4、Maven的核心概念
①、POM ②、约定的目录结构 ③、坐标 ④、依赖管理 ⑤、仓库管理 ⑥、生命周期 ⑦、插件和目标 ⑧、继承 ⑨、聚合
4.1、POM
POM 就是(Project Object Model)项目对象模型,Maven 是把这个项目看作一个模型,按这个模型进行构建。
POM 是 Maven 工程的基本单元,是一个 xml 文件,Maven 的所有设置、操作都是在这个文件中定义的,开发人员也操作这个文件,包括了项目的信息,用于描述项目的构建过程,声明项目的依赖。只要是 Maven 项目,这个文件必须有,名字是 pom.xml。
| 基本信息 | ||
| modelVersion | Maven 模型的版本,对于 Maven2 和 Maven3 来说,它只能是 4.0.0 | |
| groupId | 组织 id,一般是公司域名的倒写。 格式可以为:1. 域名倒写。 例如 com.baidu2. 域名倒写+项目名。例如 com.baidu.appolo | groupId、artifactId、version 三个元素。生成了一个Maven 项目的基本坐标,在众多的maven 项目中可以唯一定位到某一个项目。坐标也决定着将来项目在仓库中的路径及名称。 |
| artifactId | 项目名称,也是模块名称,对应 groupId 中 项目中的子项目。 | |
| version | 项目的版本号。如果项目还在开发中,是不稳定版本, 通常在版本后带-SNAPSHOT version 使用三位数字标识,例如 1.1.0 | |
| packaging | 项目打包的类型,可以使 jar、war、rar、ear、pom,默认是 jar | |
| 依赖 | |
|---|---|
| dependencies 和 dependency | Maven 的一个重要作用就是管理 jar 包,为了一个项目可以构建或运行,项目中不可避免的,会依赖很多其他的 jar 包,在 Maven 中,这些 jar 就被称 为依赖,使用标签 dependency 来配置。而这种依赖的配置正是通过坐标来 定位的,由此我们也不难看出,Maven 把所有的 jar 包也都视为项目存在了。 |
| 配置属性 | |
|---|---|
| properties | properties 是 用来定义一些配置属性的,例如 project.build.sourceEncoding (项目构建源码编码方式), 可以设置为 UTF-8,防止中文乱码,也可定义相关构建版本号,便于日后统一升级。 |
| 继承 | |
|---|---|
| parent | 在 Maven 中, 如果多个模块都需要声明相同的配置, 例如: groupId 、version、有相同的依赖、或者相同的组件配置等,也有类似 Java 的继承机制,用 parent 声明要继承的父工程的 pom 配置。 |
| 聚合 | |
|---|---|
| modules | 在 Maven 的多模块开发中,为了统一构建整个项目的所有模块,可以提供一个额外的模块,该模块打包方式为 pom,并且在其中使用 modules 聚合的其它模块,这样通过本模块就可以一键自动识别模块间的依赖关系来构建所有模块,叫 Maven 的聚合。 |
4.2、约定的目录结构
Maven 定义好的程序的目录及目录放置的内容,一个项目是一个文件夹。Maven 遵循约定大于配置
---文件夹(项目)
--src:
-main --- Java主程序的源代码和其他配置文件
java --- 放置主程序的源文件的(.java)
resources ---放置配置文件的
-test --- 放测试程序的文件,测试 main 目录下的程序
java --- 测试程序源代码
resources ---测试程序需要使用的配置文件
-pom.xml --- Maven 工程的核心配置文件
4.3、坐标:唯一标识项目
groupId、artifactId、version ------唯一标示一个资源,简称 gav。
- groupId:这是工程组的标识。它在一个组织或者项目中通常是唯一的。通常是公司/组织域名倒序+项目名,或域名倒序。
- artifactId:这是工程的标识。它通常是工程的名称。自定义的唯一值。
- version:这是工程的版本号。在 artifact 的仓库中,它用来区分不同的版本。数字值,一般用三位表示「3.1.0」
4.4、仓库
仓库就是用来存放资源的。
资源有什么:
- Maven 使用的各种插件对应的 jar 文件。
- 你项目的打包对应 jar 文件。
- 其他的 jar 文件(项目中使用的依赖 jar 文件)。
仓库的分类:
- 本地仓库:在你的计算机上的目录。
- 远程仓库:都是通过互联网访问的。
- 中央仓库:最权威的,全世界的开发人员都共用的仓库。 中央仓库
- 中央仓库的镜像:中央仓库的拷贝,位于各个大洲。目的是分担中央仓库的压力。
- 私服:自己搭建的服务器,一般是在局域网内部使用的。公司中自己搭建私服服务器, 是用来给整个公司的开发团队使用的。私服是公司内部使用的,公司之外是不能访问的。可以对整个公司提供共用的资源。
Maven如何使用仓库:
用户的项目(使用 Maven 下载依赖)—> Maven 访问本地仓库 —> 私服 —> 中央仓库的镜像 —> 中央仓库
搜索仓库:
资源搜索地址:mvnrepository.com/
4.5、依赖管理
依赖:classA 使用了 classB 的属性或者方法,叫做 classA 依赖 classB 。
Maven 最重要的功能,管理依赖。
1、依赖使用方式:
- 在 pom.xml 文件使用 dependencies 和 dependency 表示。
- 依赖就你项目中使用的 jar 文件(许多 class 文件)。
<dependencies><!--依赖开始-->
<!--每一个dependency表示一个独立的依赖项-->
<dependency><!--测试依赖-->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency><!--Mybatis 的依赖-->
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<!--。。。-->
</dependencies> 依赖结束
2、依赖管理范围
依赖的范围(scope):compile、test、provided,默认采用 compile
3、如何获取 gav 的内容
- 去要使用的资源官网。
- 去 Maven 的仓库,搜索。
4.6、Maven 的生命周期
Maven 的生命周期就是:Maven 工具构建项目的各个阶段(清理、编译、测试、报告、打包、安装、部署)。这些阶段执行时,会从开始执行。 例如:现在你要执行测试工作, Maven 会先执行清理,在执行编译,最后执行测试。
Maven 生命周期中各个阶段的执行,都有对应的 Maven 命令
- 清理 mvn clean:把之前编译的 class 文件和资源文件都删除,对应的是删除
target目录。 - 编译 mvn compile:把
src/main/java目录下的 java 文件编译为 class 文件, 把这些 class 文件都放到target/clases目录中。把src/main/resoures目录下的文件拷贝到target/clases目录。 - 编译测试文件 mvn test-compile:把
src/test/java目录下的 java 文件编译好,拷贝到target/test-classes目录中,同时把src/test/resources目录下的文件拷贝到target/test-classes目录中。 - 执行测试 mvn test:Maven 会执行
target/test/classes目录中的java程序。测试命令执行后,会生成测试报告(记录了测试程序的执行结果的文件)。 - 打包 mvn package:把
target/classes目录中的 .class 文件和其他的配置文件都放到一个压缩文件中。Java 中规定,对应 j2se 项目,打包后的文件扩展名 jar;对于web应用,扩展名时war。默认是 jar。 - 安装 mvn install:把打包生成的 jar、war 文件安装到 Maven 的本地仓库。其他项目可以使用这些 jar。
- 部署 mvn deploy:把本工程打包,按照本工程的坐标保存到本地库中,并且还会保存到私服仓库中。还会自动把项目部署到 web 容器中。
4.7、插件
Maven 命令执行时,Maven 内部是使用插件完成工作的。例如执行mvn compile,对应是一个 maven-compile-plugin 插件(插件对应一些 jar)。
5、单元测试 junit
junit:是一个其他人写的用来执行测试功能的类库,里面有很多的方法,用来执行测试程序的功能。
作用:开发人员自己编译 junit,测试自己写的代码是否完成功能;开发人员是测试类中的方法,每个方法都需要测试,一个方法就是一个单元。
如何使用:
-
在 pom.xml 加入单元测试的依赖
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> -
在 Maven 的约定目录中,
src/test/java目录中写测试程序的代码。- 方法定义规则:必须是 public;没有返回值 void;方法名称自定义(推荐:test + 测试方法名);没有参数;在方法上面加入 @Test。例如:
@Test //junit 中的注解,表示当前方法是测试方法。 public void testAddNumber(){ HelloMaven hello = new HelloMaven(); int res = hello.addNumber(10,20); //调用 junit 的方法判断你的 addNumber 执行是否正确。 //Assert.assertEquals(期望值,实际值); Assert.assertEquals(30,res); }
6、Maven 在 IDEA 中的配置
1、配置 File — Settings
2、配置 File — OtherSettings — Preferences for New Projects:同上
7、如何在 IDEA 创建 Maven 项目
7.1、JavaSe 项目:
7.2、创建 JavaWeb项目
其他同上……
8、Maven 常用设置
8.1、全局变量
在 Maven 的 pom.xml 文件中, 用于定义全局变量,POM 中通过 ${property_name} 的形式引用变量的值。
<!--定义全局变量:-->
<properties>
<spring.version>4.3.10.RELEASE</spring.version>
</properties>
<!--引用全局变量:-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!--Maven 系统采用的变量:-->
<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>
8.2、指定资源位置
src/main/java 和 src/test/java 这两个目录中的所有*.java 文件会分别在 comile 和 test-comiple 阶段被编译,编 译结果分别放到了 target/classes 和 targe/test-classes 目录中,但是这两个目录中的其他文件都会被忽略掉,如果需 要把 src 目录下的文件包放到 target/classes 目录,作为输出的 jar 一部分。需要指定资源文件位置。以下内容放到标签中。
<build>
<!--Maven 处理资源的插件-->
<resources>
<resource>
<directory>src/main/java</directory><!--所在的目录-->
<includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<!--filtering 选项 false 不启用过滤器, *.property 已经起到过滤的作用了 -->
<filtering>false</filtering>
</resource>
</resources>
</build>