Maven
Maven
思维导图:点击打开
1.Maven介绍
- apach组织提供的一个顶级项目
- maven是一个Jav开发工具
- 作用
- 管理项目构建生命周期
- 管理项目的jar包
- 管理项目基础信息
- 文档管理
- 测试报告
2.项目构建生命周期
1.清理:清理之前编译或测试生成的文件
2.编译:将java程序编译成class文件
3.测试:测试程序是否能满足预期功能
4.报告:将测试结果生成报告
5.打包:
- java工程:将工程中所有java类打成jar包
- web工程:将工程打包成war包
6.发布:将第5步生成的jar包或war包提交到本地仓库或远程仓库
3.maven如何在项目中管理jar包
在maven出现之前,jar包的管理是很麻烦的
-
jar包定位较难:需要手动去网上下载,找到合适版本;
- 使用maven后,只需要在pom.xml文件中添加jar包的坐标,就可以自动下载相应的jar包。
-
jar之间存在依赖:A.jar依赖B.jar,B.jar又依赖C.jar,想使用A.jar就需要将B.jar和C.jar先下载好。
- 使用maven后,会自动将A.jar依赖的所有jar包下载好
-
jar包冲突:同一个项目中,有多个jar引用同一个jar
-
使用maven后,提供两个方案解决jar包冲突
-
短路径优先:
A.jar---->B.jar---->C.jar D.jar---->C.jar
D.jar先一步引用到C.ar,那么maven就只会使用D.jar
-
声明优先
A.jar---->C.jar B.jar---->C.jar
A.jar和B.jar引用C.jar的长度一致,但A.jar先一步声明,故maven只会使用A.jar
-
-
4.maven仓库
maven仓库存放着maven所管理的所有jar包。
分为本地仓库、私服仓库和中央仓库
- 本地仓库:maven在本地的jar包仓库。
- 当在项目编译时,maven首先就从本地仓库寻找项目需要的jar包。
- 私服仓库:局域网中搭建的一个仓库,一般用于团队开发。
- 当maven在本地仓库找不到需要的jar包时,就会从私服仓库找。
- 中央仓库:位于英国的中央仓库,全世界只有一个,为全世界程序员提供jar包
- 当maven在私服仓库也找不到jar包时,就会从中央仓库找。
- 因为中央仓库位于外网,所以下载缓慢,因此在国内搭建了相应的镜像仓库,为国内程序员提供jar包。
5.maven项目信息管理
maven可生成api文档和测试报告,处理这些的工作一般是测试人员做的。
6.maven的安装
1.去官网下载maven,一般maven3.3.9比较适合jdk1.8
链接:https://archive.apache.org/dist/maven/maven-3/3.3.9/binaries/
2.解压缩到非中文目录
3.配置环境变量
我的电脑---->右键---->属性---->高级系统设置---->环境变量---->下面新建【M2_HOME】
填入maven文件的解压缩位置,点击确定。
双击下面的path环境变量,新建【%M2_HOME%】
4.测试
windows+R---->cmd
输入mvn -v
出现如下画面即代表成功。
7.更换本地仓库位置
当发送任意maven命令【mvn clean】时,会导致maven在本机生成一个本地仓库
默认位置:
C:\Users\本机用户名\.m2\repository
修改本地仓库位置
在maven安装目录的conf目录下,备份setting.xml文件
打开setting.xml文件,添加< localRepository>标签,写上需要修改的路径,即可。
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<!-- 更换本地仓库目录 -->
<localRepository>D:/Source/Maven/maven_repository</localRepository>
8.maven项目结构
使用maven管理项目必须遵守maven项目的结构规范来创建项目。
9.创建一个maven项目
1.新建一个文件夹HelloProject
2.按maven项目结构创建相应文件夹
3.配置pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<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">
<modelVersion>4.0.0</modelVersion>
<!-- 项目在仓库中的位置是由坐标来决定的,坐标的组成:groupId、artifactId和version -->
<!-- artifactId和version决定项目生成jar包的名称。如【ch01-maven-1.0-SNAPSHOT.jar】 -->
<!-- 组织名,通常是公司或组织域名倒序+项目名 -->
<groupId>com.tsccg</groupId>
<!-- 当前项目模块名,通常是工程名 -->
<artifactId>ch01-maven</artifactId>
<!-- 当前项目版本号 -->
<version>1.0-SNAPSHOT</version>
<!-- 单元测试依赖 -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
4.在main目录下新建/com/tsccg/HelloMaven.java
编写项目代码:
package com.tsccg;
public class HelloMaven {
public static int add(int a,int b) {
return a + b;
}
public static void main(String[] args) {
System.out.println("10 + 20 = " + add(10,20));
}
}
5.在test目录下新建/com/tsccg/TestHelloMaven.java
编写测试代码:
package com.tsccg;
import org.junit.Assert;
import org.junit.Test;
public class TestHelloMaven {
@Test
public void testAdd() {
System.out.println("------01执行HelloMaven类的add方法------");
HelloMaven hm = new HelloMaven();
int result = hm.add(10,20);
Assert.assertEquals(30,result);
}
// @Test
// public void testAdd2() {
// System.out.println("------02执行HelloMaven类的add方法------");
// HelloMaven hm = new HelloMaven();
// int result = hm.add(10,20);
// Assert.assertEquals(50,result);
// }
}
6.执行项目
在pom.xml文件所在目录,打开dos窗口,执行mvn test。
若最终显示BUILD SUCCESS,则说明执行成功。
10.maven常用命令(项目构建周期)
- mvn clean:清除命令
- 删除当前工程中的target文件夹
- mvn compile:编译项目文件命令
- 将main文件夹下的resources中所有文件都拷贝到target文件夹里
- 编译当前工程的main文件夹里的所有java文件,将生成的.class文件放入当前工程的target文件夹里。
- mvn test-compile:编译测试文件命令
- 执行mvn compile
- 将test文件夹下的resources中所有文件都拷贝到target文件夹里
- 编译当前工程的test文件夹里的所有java文件,将生成的.class文件放入当前工程的target文件夹里。
- mvn test:执行测试,生成测试报告
- 执行mvn test-compile
- 运行生成的.class文件,执行测试类中所有的测试方法,生成测试报告,将测试报告放进target文件夹里。
- mvn package:打包
- 执行mvn test
- 如果测试没有问题,将main下所有java文件生成的所有class文件打包成jar或war,放入target文件夹里
- mvn install:安装
- 执行mvn package
- 把生成的jar/war包放入本地仓库
11.maven坐标(gav)
为了方便maven对jar的定位,在maven世界中,每一个jar都要有一个独一无二的坐标。
这个坐标由三部分组成:groupId、artifactId、version
<groupId>com.tsccg</groupId>
<artifactId>ch01-maven</artifactId>
<version>1.0-SNAPSHOT</version>
其中:
- groupId对应的是公司/组织名,通常是公司/组织域名倒写
- artifactId对应的是当前项目名,可以自定义
- version对应的是当前项目的版本号,同样可以自定义,但不能乱写
artifactId和version一起组成了项目打包后的包名。如:【ch01-maven-1.0-SNAPSHOT.jar】
12.在IDEA中设置Maven
12.1设置当前项目
左上角FIle---->settings---->Build,Execution,Deployment---->Build Tools---->Maven
改成自己使用的路径即可
12.2加速项目构建
选择Maven---->Runner
VM Options:
-DarchetypeCatalog=internal
Maven项目构建时,会自动下载模板文件,比较慢。这样设置可以指定使用内部模板,可以加快maven项目构建速度。
JRE:选择1.8
12.3设置之后新建的项目
左上角File---->New Projects Settings---->Settings for New Projects
按上面的步骤重复设置一遍即可。
13.在IDEA中创建Maven项目
13.1创建parent Module
创建一个maven项目Test-Project,不需要勾选Create from archetye(从模板创建)
输入项目名后输入项目的坐标,然后将自动生成的src目录删除。
13.2创建普通maven-java项目
1.左上角File---->new---->Module
选择Maven,然后勾选Create from archetye(从模板创建),选择图中的以quickstart结尾的模板,next。
2.填写module名、项目坐标,next
3.idea自动配置的项目信息,一般不用管,直接next
4.项目创建成功
5.创建缺少的resources文件
6.在自动生成的pom.xml文件中只保留下面语句即可,其他可以删掉
7.进行单元测试
1.寻找合适的单元测试jar包:
打开maven官方仓库:https://mvnrepository.com/
搜索junit,找到使用量最多的版本,复制对应坐标(点击即可复制)
2.将依赖添加到pom.xml文件中的dependencies标签内
3.如果idea没有自动下载对应jar包,手动点击右上角更新按钮
maven会自动将对应jar包下载到本地仓库,下次使用就不需要重新下载了。
4.编写项目主程序
在main目录下自动创建的App类里编写jdbc查询方法,所需数据库驱动按上面的方法在pom文件里添加。
package com.tsccg;
import java.sql.*;
/**
* @author TSCCG
* 主程序
*/
public class App {
public static void main(String[] args) {
App app = new App();
boolean result = app.search();
System.out.println(result ? "查询成功":"查询失败");
}
public boolean search() {
boolean result = false;
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tsccg?serverTimezone=UTC ",
"root","123456");
String sql = "select count(*) from t_vip";
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
if (rs.next()) {
result = true;
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(ps != null) {
try {
ps.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(conn != null) {
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
return result;
}
}
5.编写测试类
在test/java目录下创建com.tsccg.TestAdd
package com.tsccg;
import org.junit.Test;
import static org.junit.Assert.assertTrue;
/**
* 测试App类
* 测试类命名规范:test+所测类/方法名
*/
public class TestApp {
//测试App里的add方法
@Test
public void testAdd() {
App app = new App();
boolean result = false;
result = app.search();
// Assert.assertEquals(true,result);//期待值,实际值
assertTrue(result);//默认期待值为true
}
}
6.开始单元测试
13.3创建maven-web项目
1.选择webapp模板
同样的步骤,只不过创建时,选择以webapp结尾的模板
2.补全缺少的文件
项目建好后,如下图:
补全缺少的maven项目结构文件
3.添加servlet依赖
创建好的web项目无法直接创建Servlet接口实现类,需要添加servlet依赖
去官网搜索servlet,得到相应坐标,添加到pom.xml中,点击右上角更新按钮
之后就可以创建Servelt了。
4.创建Servlet
编写程序:
package com.tsccg;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @Author: TSCCG
* @Date: 2021/09/05 18:01
*/
public class OneServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Integer age = 19;
request.setAttribute("age",age);
request.getRequestDispatcher("index.jsp").forward(request,response);
}
}
6.创建展示页面
编写index.jsp
<%@ page isELIgnored="false"%><%--如果无法使用el表达式则添加--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--使用EL表达式实现关系运算输出--%>
EL表达式:${age>=18?"欢迎光临":"谢绝入内"}