maven
1,Maven 简介
1.1 maven能做什么
- 项目的自动构建,帮助开发人员做项目代码的编译,测试,打包,安装,部署等工作。
- 管理依赖(管理项目中使用的各种jar包)
- 依赖:项目中需要使用的其他资源。常见的是jar。比如项目要使用mysql驱动,我们就说项目依赖mysql驱动。
1.2 什么是maven
- maven是apache基金会的开源项目,使用java语法开发
- maven是项目的自动化构建的工具
- 构建过程的各个环节:清理,编译,测试,报告,打包,安装,部署
1.3 maven解压后的目录结构
2,Maven的核心概念
2.1 目录结构
- maven项目使用的是大多数人遵循的目录结构,叫做约定的目录结构
- 一个maven项目是一个文件夹。比如项目叫做Hello
Hello 项目文件夹
\src
\main 叫做主程序目录(完成项目功能的代码和配置文件)
\java 源代码(包和相关的类定义)
\resources 配置文件
\test 放置测试程序代码(开发人员自己写的测试代码)
\java 测试代码的
\resource 测试程序需要的配置文件
\pom.xml maven的配置文件,核心文件
- maven可以独立使用:创建项目,编译代码,测试程序,打包,部署等等
- maven和idea一起使用,通过借助idea使用maven
2.2 pom文件
- 即 Project Object Model 项目对象模型。 Maven 把一个项目的结构和内容抽象成一个模型,在 xml 文件中
进行声明,以方便进行构建和描述, pom.xml 是 Maven 的灵魂。所以, maven 环境搭建好之后,所有的学习和操作都是关于 pom.xml 的
2.3 坐标
- 坐标组成是groupid,artifiactld,version,坐标概念来自数学
- 坐标的作用:确定资源的,是资源的唯一标识。在maven中,每个资源都是坐标,坐标值是唯一的。简称gav
坐标:唯一值, 在互联网中唯一标识一个项目的
<groupId>公司域名的倒写</groupId> //组织名称,公司,团体或者单位的标识。这个值常使用的公司的域名的倒写;如果项目比较大,也可以是域名倒写+大项目名称
<artifactId>自定义项目名称</artifactId> // 项目名称,如果groupId中有项目,此时当前的值就是子项目名。项目的名称是唯一的。
<version>自定版本号</version> //版本,项目的版本号,使用的数字。三位组成。例如 主版本号.次版本号.小版本号 例如5.2.5 ; 如果项目还在开发中,是不稳定版本,通常在版本后带-SNAPSHOT
- 每个maven项目,都需要有一个自己项目的gav
- 管理依赖,需要使用其他的jar,也需要使用gav作为标识
- 搜索坐标的地址:https://mvnrepository.com/ 搜索使用的中央仓库, 使用groupId 或者 artifactId作为搜索条件
2.4 依赖 dependency
- 依赖:项目中要使用的其他资源
- 通过dependency和gav一起完成依赖的使用
- Maven 的一个重要作用就是管理 jar 包,为了一个项目可以构建或运行,项目中不可避免的,会依赖很多其他的 jar 包,在 Maven 中,这些 jar 就被称为依赖,使用标签 dependency 来配置。 而这种依赖的配置正是通过坐标来定位的,由此我们也不难看出, maven 把所有的 jar 包也都视为项目存在了。
<dependencies>
<!--依赖 java代码中 import -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
</dependencies>
maven使用gav作为标识,从互联网下载依赖的jar包到本地仓库
- packaging: 项目打包的类型,可以使 jar、 war、 rar、 ear、 pom,默认是 jar
-
**build** 表示与构建相关的配置, 例如设置编译插件的 jdk 版本
2.5 仓库
-
maven仓库存放的是:
- 存放maven使用的jar 和 我们项目使用的jar
maven使用的插件(各种jar)
自己项目使用的jar(第三方的工具) ,如mysql驱动
自己写的程序可以打包为jar,存放到仓库
- 存放maven使用的jar 和 我们项目使用的jar
-
仓库的分类:
-
本地仓库, 就是你的个人计算机上的文件夹,存放各种jar。默认路径是你登录操作系统的账号的目录中/.m2/repository
-
远程仓库, 在互联网上的,使用网络才能使用的仓库
①:中央仓库,最权威的, 所有的开发人员都共享使用的一个集中的仓库,
https://repo.maven.apache.org :中央仓库的地址
②:中央仓库的镜像:就是中央仓库的备份, 在各大洲,重要的城市都是镜像。③:私服,在公司内部,在局域网中使用的, 不是对外使用的。
-
-
maven仓库工作方式
2.6 maven生命周期,插件和命令
-
maven的生命周期:项目构建的各个阶段,包括清理,编译,测试,报告,打包,安装,部署;
-
插件:要完成构建项目的各个阶段,要使用maven的命令,执行命令的功能是通过插件来完成的。插件就是jar,一些类
-
命令:执行maven功能是由命令发出的。比如mvn compile。
-
单元测试(junit):junit是一个单元测试的工具,在java中经常使用
-
单元:在java中指的是方法。一个方法就是一个单元,方法是测试的最小单位
-
测试方法的定义:public方法,没有返回值,方法名称自定义(建议Test+测试的方法名称),方法没有参数
mvn中的常用命令
-
mvn clean 清理(会删除原来编译和测试的目录,即 target 目录,但是已经 install 到仓库里的包不会删除)
-
mvn compile 编译主程序,把src/main/java目录中的java代码编译为class文件,同时把class文件拷贝到target/classes目录。这个目录classes是存放类文件的根目录(也叫类路径,classpath)
-
mvn test-compile 编译src/test/java目录中的源文件,把生成的class拷贝到target/test-classes目录。同时把src/test/resources目录中的文件拷贝到test-classess目录
-
mvn test 测试目录,执行test-classes目录的程序,(会生成一个目录surefire-reports,保存在target中。保存测试结果)
-
mvn package 打包主程序(会编译、编译测试、测试、并且按照 pom.xml 配置把主程序打包生成 jar 包或者 war 包)
- 打包的文件包含的是src/main目录中的所有的生成的class和配置文件和test无关
-
mvn install 把生成的打包的文件放到本地仓库中(会把本工程打包,并且按照本工程的坐标保存到本地仓库中)
- 仓库中的jar包的位置
-
mvn deploy 部署主程序(会把本工程打包,按照本工程的坐标保存到本地库中,并且还会保存到私服仓库中。还会自动把项目部署到 web 容器中)
插件
-
maven-compiler-plugin 版本3.1 编译代码的插件
-
maven-resources-plugin 版本2.6 资源插件,处理文件的。作用是把src/main/resources目录中的文件拷贝到target/classes目录中
-
maven-jar-plugin 这个插件是把 class 文件、配置文件打成一个 jar(war 或其它格式)包
-
maven-install-plugin 发布插件的功能就是把构建好的 artifact 部署到本地仓库,还有一个 deploy 插件是将构建好的 artifact 部署到远程仓库
-
插件可以在自己的项目中设置, 最常使用的是 maven 编译插件。设置项目使用的 jdk 版本时通过编译插件指定。
pom.xml 文件中设置。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
3,maven和idea集成
4,依赖管理
- 依赖范围, 使用scope表示的。
- scope的值有 compile, test, provided ,默认是compile
- scope:表示依赖使用的范围,也就是这个依赖(jar和里面类)在maven构建项目的哪些阶段中起作用。
- maven构建项目 编译, 测试 ,打包, 安装 ,部署 过程(阶段)
- compile :默认的,参与构建项目的所有阶段
- test: 测试,在测试阶段使用,比如执行mvn test会使用junit
- provided:提供者。项目在部署到服务器时,不需要提供这个依赖的jar,而是由服务器提供这个依赖的jar包。明显的是servlet和jsp依赖
5,常用设置(讲的是properties它里面的设置)
- 在 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>
使用资源插件
-
处理的配置文件的信息,maven默认处理配置文件
- maven会把src/main/resources目录中的文件,拷贝到target/classes目录下
- maven只处理src/main/java目录中的.java文件,把这些java文件编译为class,拷贝到target/classes目录中。不处理其他文件。
-
src/main/java 和 src/test/java 这两个目录中的所有*.java 文件会分别在 comile 和 test-comiple 阶段被编译,编译结果分别放到了 target/classes 和 targe/test-classes 目录中,但是这两个目录中的其他文件都会被忽略掉,如果需要把 src 目录下的文件包放到 target/classes 目录,作为输出的 jar 一部分。需要指定资源文件位置。 以下内容放到标签中。
<build>
<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>
Maven进阶
1,创建maven父工程
-
父工程的 packaging 标签的文本内容必须设置为 pom
-
父工程要求 src 目录必须删除掉。
-
父工程添加的依赖,所有子模块会无条件的去继承
-
maven多模块管理,其实就是让它的子模块的pom文件来继承父工程的pom文件。
-
以上做法,子模块会无条件继承父工程的所有依赖,导致的问题是,本不需要的继承的依赖也会被继承,这就大大增加了项目模块最终打包的大小,也可能为上线埋下了隐患。也就是说,父工程管理的是所有项目模块的依赖,而不是某一个项目模块的依赖,所以某一个项目模块不需要继承父工程中的所有依赖, 这就需要子项目模块向父工程声明需要的依赖即可(声明式依赖)。而此时,父工程实际只需要管理依赖的版本号即可。
- 父工程添加 dependencyManagement 标签管理依赖:
- 父工程添加 dependencyManagement 标签管理依赖:
-
由于父工程管理依赖的版本号,那么子模块要想继承依赖,只能通过声明式来添加依赖,实际上,子模块中的依赖是继承父工程依赖的版本号;如果子模块已定义依赖版本号,那么以子模块定义的版本号为准。