maven
1.1.maven的作用
(1)项目的自动构建,帮助开发人员做项目代码的编译,测试,打包,安装,部署等工作
(2)管理依赖(管理项目中使用的各种jar包),依赖:就是项目中需要使用的其他资源,常见的是jar包
1.2.没有使用maven怎么管理依赖
管理jar,需要从网络中单独下载某个jar
需要选择正确的版本,手工处理jar之间的依赖
1.3.什么是maven
maven是项目的自动化构架工具,管理项目的依赖
1.4.maven中的概念
①pom
②约定的目录结构
③坐标
④依赖管理
⑤仓库管理
⑥生命周期
⑦插件和目标
⑧继承
⑨聚合
1.5.maven的安装
因为maven是使用Java语言编写的,因此要安装maven,首先要保证maven已经配置了环境变量,之后才能配置maven的环境变量
maven的核心概念
1.约定的目录结构
maven项目使用的是大多数人遵循的目录结构,叫做约定的目录结构,一个maven项目是一个文件夹,比如一个叫Demo的项目
Demo 项目文件夹
\src
\main 主程序,完成项目功能的代码和配置文件
\java 源代码(包和相关的类的定义)
\resources 配置文件
\test 放置测试程序代码的(开发人员自己编写的测试代码)
\java 测试代码的(junit)
\resources 测试程序需要的配置文件
\pom.xml maven的配置文件,核心文件
maven的使用方式
- maven可以独立使用:创建项目,编译代码,测试程序,打包,部署等
- maven和idea一起使用:通过idea借助maven,实现编码,测试,打包等(重点掌握)
2.pom.xml
POM:project object model项目对象模型,maven把项目当作模型来处理,操作这个模型就是操作这个项目,maven通过pom.xml文件实现项目的构建和依赖管理
<!--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/maven-v4_0_0.xsd">
<!--表示的是pom的版本,也就是项目模型的版本-->
<modelVersion>com.lkw</modelVersion>
<!--坐标-->
<groupId>maven01</groupId>
<artifactId>hello</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>17</java.version>
<maven.complier.source>1.8</maven.complier.source>
<maven.complier.target>1.8</maven.complier.target>
</properties>
</project>
3.坐标
坐标的组成是groupId,artifactId,version
坐标的作用:确定资源,是资源的唯一标识,在maven中,每个资源都是坐标,坐标是唯一的,简称gav
<!--坐标-->
<groupId>maven01</groupId>
<artifactId>hello</artifactId>
<version>1.0-SNAPSHOT</version>
groupId:组织名称,公司团体或者单位标识,通常是公司域名的倒写
artifactId:项目名称,如果groupId中有项目名,那么此时当前的值就是子项目名,项目名也是唯一的
version:项目的版本号,注意:当版本号中有-SNAPSHOT,表示快照,是不稳定的版本,当一个项目还没有完成的时候,就处于快照阶段
项目使用gav:
- 每一个maven项目,都需要有一个自己的gav
- 管理依赖,需要使用其他的jar,也需要使用gav作为标识
4.依赖 dependency
依赖:项目中需要使用的其他资源(jar)
需要使用maven表示依赖,管理依赖,通过似乎用dependency和gav一起完成依赖的使用
需要在pom.xml文件中,使用dependencies和dependency,还有gav完成依赖的说明
<dependencies>
<!--各种需要使用的jar包-->
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
</dependency>
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version></dependency>
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version></dependency>
</dependenncies>
maven使用gav作为标识,从互联网下载依赖的jar,下载到本机上,由maven管理项目使用的这些jar
5.仓库
1.maven的仓库存放的是:
- maven工具自己的jar包
- 第三方的其他jar包,比如项目中要使用MySQL的驱动jar包
- 自己写的程序,可以打包成jar,存放到仓库中
2.仓库的分类
-
本地仓库:(本机仓库),位于自己的计算机上,它是硬盘中的某个目录,本地仓库的默认路径是你登陆操作系统账号的目录中/.m2/repository
修改本地仓库的位置:修改maven的配置文件(maven的安装路径/cong/settings.xml)
步骤:
- 创建一个空文件夹,作为仓库使用,目录名不要有中文或者空格
- 修改settings.xml文件,将本地仓库的位置修改为新建的这个仓库的路径
maven的工作方式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P5PSqjpk-1648113778073)(C:/Users/lenovoliukaiwu/AppData/Roaming/Typora/typora-user-images/1648098876183.png)]
-
远程仓库:需要通过互联网访问的
- 中央仓库:一个ftp服务器,存放了所有的资源
- 中央仓库镜像:是中央仓库的拷贝,在各大主要城市都有镜像
- 私服:在局域网中使用的,私服就是自己的仓库服务器,在公司内部使用
6.maven的声明周期,插件和命令
maven的生命周期:项目构建的各个阶段,包括清理,编译,报告,打包,安装,部署
插件:要完成项目的构建的各个阶段,要使用maven命令,执行命令的功能是通过插件完成的,插件就是jar,一些类
命令:执行maven的功能是由命令发出的,比如mvn complie
单元测试(junit)
junit是一个单元测试工具,在Java中经常使用
单元:在Java中指的是方法,一个方法就是一个单元,方法是测试的最小单元
作用:使用junit测试方式是否玩完成了要求,开发人员自测
使用单元测试
-
加入junit依赖
<dependency> <groupId>junit</groupId> <artifaceId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>
-
在src/test/java目录下创建测试类文件,写测试代码
-
单元测试使用的建议:
-
测试类的定义,名称一般是Test+要测试的类的类名
-
测试类它的报名要和测试的类包名一样,比如都叫做com.lkw
-
在类中定义方法,编写测试代码
方法的定义:public方法,没有返回值,方法名自定义(建议使用test+要测试的方法的名称),方法没有参数
-
在测试类中的方法,可以单独执行,测试类也可以单独执行
-
在方法的头部加上@Test注解
-
maven的命令:
-
mvn clean:清理命令,作用是删除以前生成的数据,删除target目录
插件:maven-clean-plugin
-
mvn complie:编译命令,执行的代码编译,把src/main/java目录中的java代码编译为class文件,同时把class文件拷贝到target/classes目录,这个目录存放的是类文件的根目录,也叫做类路径,classpath
插件:maven-complier-plugin
插件:maven-resources-plugin:资源插件,处理文件的,作用是把src/main/resources目录中的文件拷贝到target/classes目录中
-
mvn-test-complie:编译命令,编译src/test/java目录中的源文件,把生成的class拷贝到target/test-classes目录,同时把src/test/resources目录中的文件拷贝到test-classes目录
插件:maven-complier-plugin 编译代码的插件
maven-resouces-plugin 资源插件,处理文件
-
mvn test:测试命令,作用是执行test-classes目录的程序,测试src/main/java目录中的主程序代码是否符合要求
插件:maven-surefire-plugin
-
mvn package:打包,作用是把项目中的资源class文件和配置文件都放到一个压缩文件中,默认压缩文件是jar类型的,web应用是war类型的,扩展时jar,war的
插件:mave-jar-plugin:执行打包处理,生成一个jar扩展的文件,放在target目录下
<groupId>com.lkw</groupId> <artifactId>maven-test</artifactId> <version>1.0-SANPSHOT</version> <packaging>jar</packaging> 打包的文件名:artifactId-version.packaging 最终生成的文件名是:maven-test-1.0-SANPSHOT.jar
-
mvn install:把生成的好的打包的文件,安装到maven仓库中
插件:maven-install-plugin:把生成的jar文件按转发到本地仓库中
<groupId>com.lkw</groupId> <artifactId>maven-test</artifactId> <version>1.0-SANPSHOT</version> <packaging>jar</packaging> groupId中的值,如果有“.”前后都是独立的文件夹,比如com.lkw就是com/lkw artifactId和version都是独立的文件夹
-
自定义配置插件
在pom.xml文件中,build标签中,设置插件
<!--构建项目相关的内容--> <build> <!--设置插件--> <plugins> <plugin> <groupId>org.apache.maven.plugins</grouId> <artifactId>maven-complier-plugins</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source><!--指定编译代码的jdk版本--> <target>1.8</target><!--运行java程序使用的jdk版本--> </configuration> </plugin> </plugins> </build>
maven与idea的集成
第一步:file—>settings
第二步:配置参数
创建基于maven的普通java项目
第一步:在src/main/java/相应的包名下创建一个名为HelloMaven的Java类作为被测试类
第二步:在这个类中编写要被测试的方法——addNUmber
package com.lkw;
public class HelloMaven {
public int addNumber(int a ,int b){
System.out.println("addNumber执行了");
return a+b;
}
}
第三步:在src/test/java/相应的包名下创建一个名为TestHelloMaven的Java类作为测试类
第四步:在这个类中编写一个名为testAddNumber的方法
第五步:在测试方法上加上@Test注解
package com.lkw;
import org.junit.Assert;
import org.junit.Test;
public class TestHelloMaven {
@Test
public void testAddNumber(){
//创建被测试类对象
HelloMaven maven = new HelloMaven();
int number = maven.addNumber(10, 20);
Assert.assertEquals(30,number);
}
}
第六步:点击run,测试方法是否可以运行
使用maven创建web应用
第一步:选择web应用的模板
第二步:在pom.xml文件中导入servlet和jsp的依赖
第三步:配置tomcat服务器
第四步:创建相应的页面
第五步:编写servlet
第六步:访问服务器
将项目打包之后依然可以访问tomcat的原因:
因为在使用idea工具的时候,idea里面的tomcat实际上是tomcat的一个副本,然后关闭idea,使用本机上的tomcat作为服务器的时候,使用startup.bat命令启动服务器,然后通过浏览器访问的要求是你所打包的项目必须是在CATALINA_HOME下面的webapps下面才可以,所以要求把在idea中打包的项目拷贝到webapps下面,然后在浏览器访问的时候端口号后面跟的是所打包文件的名字
依赖管理
依赖范围:使用scope表示依赖的范围
依赖范围表示:这个依赖(jar和里面的类)在项目构建的哪个阶段起作用
依赖范围scope:
- complie:默认范围,参与构建项目的所有阶段
- test:测试,在测试阶段使用,比如执行mvn test
- provided:提供者,项目部署到服务器的时候,不需要提供这个依赖的jar,而是由服务器依赖的jar包明显的是servlet和jsp依赖
常用设置
(1)propeties标签里面的配置
<properties>
<maven.complier.source>1.8</maven.complier.source>源码编译 jdk版本
<maven.complier.target>1.8</maven.complier.target>运行代码 jdk版本
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>项目构建使用的编码,避免中文乱码
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>生成报告的编码
</properties>
(2)全局变量
在properties定义标签,这个标签就是一个变量,标签的文本就是变量的值
使用全局变量表示多个依赖使用的版本号
使用步骤:
-
在properties标签中,定义一个标签,指定版本的值,这个标签名是自定义的,但是最好见名知义
<properties> <!--自定义标签--> <spring.version>5.2.5.RELEASE</spring.version> <junit.version>4.11</junit.version> </properties>
-
使用全局变量,语法${变量名}
-
使用资源插件
处理配置文件的信息,maven默认处理配置文件
①:maven只会把src/main/resources目录中的文件,拷贝到target/classes目录下
②:maven只处理src/main/java目录中的.java文件,把这些文件编译为class,拷贝到target/classes目录中,不处理其他文件
<build> <!--资源插件,告诉maven把src/main/java目录中的指定扩展名文件拷贝到target/classes目录中--> <resources> <resource> <directory>src/main/java</directory><!--所在的目录--> <includes> <!--包括目录下的.properties,.xml文件都会被扫描到--> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <!--filtering选项false不启动过滤器,*.properties已经起到过滤作用了--> <filtering>false</filtering> </resource> </resources> </build>