目录
一、Maven初步介绍
1、什么是Maven?
Maven 可以整合多个项目之间的引用关系,我们可以根据业务和分层需要任意拆分一个项目;Maven 提供规范的管理各个常用 jar 包及其各个版本,并且可以自动下载和引入项目中;
Maven 可以根据指定版本自动解决 jar 包版本兼容问题;
Maven 可以把 jar 包所依赖的其它 jar 包自动下载并引入项目。
2、为什么使用Maven?
在没使用Maven之前,我们之前做一个项目的问题:
(1)我们在开发阶段需要很多个jar包,需要我们自己手动管理。不管是各种依赖还是版本问题,都需要我们自己手动去完成。
(2)一个很大的工程是有很多模块的,几千几万的类都是很常见的,靠我们自己编译,测试是非常麻烦的
(3)在开发完成后,还需要进行测试,改BUG。不断的进行测试。
(4)测试完还需要打包,将项目部署的服务器上。
所以我们需要Maven帮助我们去做这些事情,能让我们更专注的去编写代码:
(1)项目的自动构建,帮助开发人员做项目代码的编译,测试, 打包,安装,部署等工作。
(2)管理依赖(管理项目中使用的各种jar包)。
依赖:项目中需要使用的其他资源, 常见的是jar 。 比如项目要使用mysql驱动。我们就说项目依赖mysql驱动。
3、Maven 中的概念
①POM
②约定的目录结构
③坐标
④依赖管理
⑤仓库管理
⑥生命周期
⑦插件和目标
⑧继承
⑨聚合
4、安装Maven步骤
(1)确定JAVA_HOME 指定jdk的安装目录, 如果没有JAVA_HOME, 需要在windows的环境变量中创建JAVA_HOME, 它的值是jdk的安装目录
(2)解压缩 apache-maven-3.3.9-bin.zip ,把解压后的文件放到一个目录中。
目录的路径不要有中文, 不要有空格。
(3)把maven安装目录中下的bin的路径添加到path中
打开 cmd 命令行输入:mvn -v
出现以上内容表示配置好了。
二、Maven 的核心概念
1、Maven 约定的目录结构
Maven项目使用的大多数人遵循的目录结构。叫做约定的目录结构。
一个 maven 项目就是一个文件。比如一个项目叫:Hello项目
Hello 项目文件夹
\src
\main 叫做主程序目录(完成项目功能的代码和配置文件)
\java 源代码(包和相关的类定义)
\resources 配置文件
\test 放置测试程序代码的(开发人员自己写的测试代码)
\java 测试代码的(junit)
\resources 测试程序需要的配置文件
\pom.xml maven的配置文件, 核心文件
maven的使用方式:
1)maven可以独立使用: 创建项目,编译代码,测试程序,打包,部署等等
2)maven和idea一起使用:通过idea借助maven,实现编码,测试,打包等等
演示第一种方式创建一个maven项目:
(1)根据以上目录结构创建目录。
(2)在 /main/java 目录下创建一个Hello java小程序。
(2)在cmd命令行,在 src 的目录下,执行:mvn compile 命令。
在执行过程中,可以看到这样一串地址,这个地址就是 maven的中央仓库,他自动从仓库中下载所需要的 jar 包。
显示编译成功。并且会生成一个 target 目录:会把编译好的字节码文件放到 /target/classes 目录下。
以上步骤好了之后,cmd 命令行执行:java 类名 执行。
2、pom 文件
pom :即 Project Object Model 项目对象模型。一个项目对应一个 pom.xml 文件
Maven 把一个项目的结构和内容抽象成一个模型,在 xml 文件中 进行声明,以方便进行构建和描述,pom.xml 是 Maven 的灵魂。所以,maven 环境搭建好之后,所有的学习和 操作都是关于 pom.xml 的。
下面解析 pom 文件:
<?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 模型的版本-->
<modelVersion>4.0.0</modelVersion>
<!--坐标-->
<groupId>com.bjpwoernode.maven</groupId>
<artifactId>ch01-maven</artifactId>
<version>1.0-SNAPSHOT</version>
<!--打包类型-->
<packaging></packaging>
</project>
3、坐标
坐标组成: <groupId> <artifactId> <version>
坐标的作用:其实和数学中的坐标是一样的,用来确定某一个资源,每一个资源都会有一个坐标。这个坐标是唯一的,简称 gav
<groupId> :组织名称,代码,公司,团体或者单位的表示,一般是域名的倒写。如果项目比较大,也可以:域名倒写+项目名
<artifactId> :项目名称,如果groupId有项目名,那么artifactId就是子项目名。
<version> :版本,项目的版本号。推荐三位数字组成(自定义的,俩位,一位都行),例如:主版本号,此版本号,小版本号,SNAPSHOT:表示不稳定版本。
<packaging>:项目打包的类型, 有jar ,war, ear, pom等等 默认是jar。web项目打包类型时 war 。
项目使用gav:
1.每个maven项目,都需要有一个自己的gav
2.管理依赖,需要使用其他的jar ,也需要使用gav作为标识。
搜索坐标的地址: https://mvnrepository.com/
4、依赖 dependency
依赖:项目中需要使用的 jar 包。
需要使用maven表示依赖,管理依赖。 通过使用dependency和gav一起完成依赖的使用
需要在pom.xml文件中,使用dependencies 和dependency, 还有gav 完成依赖的说明。
格式:
<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>
maven使用gav作为标识,从互联网下载依赖的jar。 下载到你的本机上。 由maven管理项目使用的这些jar
5、仓库
我们所需要的 jar 包都是 maven 管理的,那么有的 jar 包是非常大的,我们下载的 maven 才几兆,几十兆,那么多的 jar 包他是从哪里来的呢?
仓库分为:
(1)本地仓库:
本地仓库又叫本机仓库,存放在你计算机的某一个位置:
C:\Users\用户名\.m2\repository
本地仓库的位置是可以修改的,在maven安装路径 /conf/setting.xml 文件中。
在 localRepository 标签里写上自己修改的路径即可。
*****注意:如果本地仓库中出现下面这样的字母,说明jar包无法使用,不管有没有jar包。如果确定jar包的版本,项目名,组织名称都对的话,需要重新刷新 pom.xml 文件,重新导入。
(2)远程仓库:需要通过联网访问的
1)中央仓库: 一个ftp服务器, 存放了所有的资源。
2)中央仓库的镜像: 就是中央仓库的拷贝。 在各大主要城市都有镜像。
3)私服:在局域网中使用的。 私服就是自己的仓库服务器。 在公司内部使用的。
6、maven 的生命周期,插件,命令
maven的生命周期: 项目构建的各个阶段。 包括 清理, 编译, 测试,报告,打包,安装,部署
插件:要完成构建项目的各个阶段,要使用maven的命令, 执行命令的功能是通过插件完成的。插件就是jar,一些类。
命令: 执行maven功能是 由命令发出的。 比如 mvn compile
(1)mvn clean 清理命令。删除以前生成的数据,删除 target 目录。
maven使用的插件 maven-clean-plugin ,版本:2.5
(2)mvn compile 编译命令。执行的代码编译,把 src/main/java 目录下所有的 java 代码编译为 class 文件,也就是字节码文件,同时把 class 文件拷贝到 target/classes 目录下,classes就是类路径。
maven使用的插件: maven-compiler-plugin,版本:3.1 编译代码的插件
maven-resources-plugin 版本:2.6 资源插件,处理文件的,将 resources 中为文件拷贝到 classes 中
(3)mvn test-compile 编译命令,编译 target/test/java 中的代码,将它翻译为class文件,同时拷贝到 target/test-classes 目录下。
maven使用的插件: maven-compiler-plugin,版本:3.1 编译代码的插件
maven-resources-plugin 版本:2.6 资源插件,处理文件的,将 resources 中为文件拷贝到 classes 中
(4)mvn test 测试命令, 作用执行 test-classes目录的程序, 测试src/main/java目录中的主程序代码是否符合要求。他会自动编译测试 target/test/java 中的代码。
插件: maven-surefire-plugin 版本 2.12.4
(5)mvn package 打包。作用是把项目中的资源class文件和配置文件都放到一个压缩文件中, 默认压缩文件是jar类型的。 web应用是war类型。
插件:maven-jar-plugin 版本 2.4。
执行打包处理。 生成一个 jar(war) 扩展的文件,文件名:项目名+版本号+扩展名 , 放在target目录下.
打包的文件包含的是 src/main 目录中的所有的生成的class和配置文件和test无关。
(6)mvn install 安装,将打包成的 jar(war) 包,存放到本地仓库中。如何查看安装的具体位置:插件:maven-jar-plugin 版本 2.4。
<groupId>yangzhaoguang</groupId>
<artifactId>maven_demo03</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
安装的具体位置和你项目中 pom.xml 文件中的 groupId 有关,如果有 " . " 分割,就是一个具体的文件夹。artifactId 是你的 jar(war) 包名字。
拿上边坐标为例,的安装路径为:
本地仓库\yangzhaoguang\maven_demo03\1.0-SNAPSHOT\maven_demo03-1.0-SNAPSHOT.war
以上命令必须在 pom.xml 文件所在目录中!!
7、自定义配置插件
插件的配置需要在 pom.xml 文件 <build> 标签里面。 <plugins> 里可以配置多个插件,每一个 <plugin> 标签里就是一个插件。
<!-- 设置构建项目相关的内容 -->
<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>
8、单元测试(Junit)
用于开发人员自测的一个功能。一个方法就是一个单元。每个方法都能测试。
使用Junit:
(1)在 pom.xml 加入依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
(2) src/test/java 下编写测试类
单元测试使用的建议:
1.测试类的定义, 名称一般是Test+要测试的类名称
2.测试类它的包名和要测试的类包名一样。
3.在类中定义方法,要测试代码。
方法的定义:public void 方法名 () {}
4.在测试类中的方法,可以单独执行。 测试类也可以单独执行
5.在方法的上面加入@Test
三、Maven 和 IDEA 的集成
1、IDEA集成 maven
Files ----> setting
VM Option : -DarchetypeCatalog=internal
设不设置都可以,如果不设置,创建新项目时需要重新设置maven
2、基于maven 普通 java项目
设置 组织名称,项目名,版本号。
配置基本信息,如果没问题就不需要修改了。
在创建项目时,你的IDEA右下角出现以下提示,点击 Enable Auto-Import 。他的意思是你的pom.xml 文件发生变化时,会自动更新。
等一段时间后,控制台会显示:BUILD SUCCESS ,表示创建成功。
创建完,我们的目录结构是没有 resources 文件夹的的,这个我们自己可以创建。
但是 创建完还不行,普通的文件夹是没法用的,需要将普通文件夹变为 带有 Root 的文件夹。
3、基于maven创建web工程
其余和创建普通java项目一样。
我们看 webapp 的目录结构:
默认的目录结构是没有 java和resources目录的,如果需要我们可以自己创建。
在<dependencies> 标签中加入Servlet 和 jsp 依赖:
其实从 pom.xml 加入依赖和从Tomcat中引入jar其实是一样的,方法不同而已。
组织名称,项目名,版本号可以去 mvnRepository.com 找。
<!--加入Servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--加入jsp依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
4、idea 中 的maven 工具窗口
5、导入其他模块
四、依赖管理
依赖范围:<scope> 标签
依赖范围表示:这个依赖(jar和里面的类)在项目构建的哪个阶段起作用。
scope标签的属性值:
compile :参与构建项目的所有阶段。默认就是 compile
test:测试,在测试阶段使用,比如:mvn test
provided:提供者,项目在部署到服务器时,不需要提供这个依赖的jar,而是由服务器来提供这个依赖的jar包。比如:servlet,jsp jar包
五、Maven常用设置
1、指的是 <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>
2、全局变量
在properties定义标签,这个标签就是一个变量, 变量名可以自己取,标签的文本就是变量的值。
可以使用全局变量表示 多个依赖使用的版本号。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source> <!--编译时的JDK版本-->
<maven.compiler.target>1.8</maven.compiler.target> <!--运行时的JDK版本-->
<!--自定义的全局变量-->
<junit.version>4.11</junit.version>
<servlet.version>3.1.0</servlet.version>
</properties>
使用全局变量:${变量名}
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope> <!--Junit依赖只在测试阶段起作用,并不会参与打包-->
</dependency>
<!--加入Servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet.version}</version>
<scope>provided</scope>
</dependency>
3、 资源插件
Maven 处理的配置文件信息的默认规则 :
①:maven会把src/main/resources目录中的文件, 拷贝到target/classes目录下
②:maven只处理 src/main/java 目录中的 .java文件,把这些java文件编译为class,拷贝到 target/classes 目录中。 不处理其他文件。
那么如果我们想将src/main/java目录下的其他文件编译到 target/classes目录下怎么办,使用 资源插件:
<build>
<!--设置资源插件-->
<resources>
<resource>
<!--指定目录范围-->
<directory>src/main/java</directory>
<includes>
<!--表示src/main/java目录下的 text,xml 文件都会被编译到 target/classes目
录下-->
<include>**/*.xml</include>
<include>**/*.text</include>
</includes>
<!--不使用默认拦截器,自己配置-->
<filtering>false</filtering>
</resource>
</resources>
</build>