01.Maven 简介
1.Maven 的需求
目前技术在开发中存在的问题
- 一个项目就是一个工程
如果项目非常庞大,就不适合继续使用 package 来划分模块。最好是每一个模块对应一 个工程,利于分工协作。
借助于 Maven 就可以将一个项目拆分成多个工程。
- 项目中的 jar 包必须手动“复制”、“粘贴”到 WEB-INF/lib 目录下
带来的问题是:同样的 jar 包文件重复出现在不同的项目工程中, 一方面浪费存储空间,另外也让工程比较臃肿。
借助 Maven ,可以将 jar 包仅仅保存在“仓库”中,有需要使用的工程"引用”这个文件接口,并钚需要真的把 jar 包复制过来。
- jar 包需要别人替我们准备好,或到官网下载
不同技术的官网提供 jar 包下载的形式是五花八门的。
有些技术的官网就是通过 Maven 或 SVN 等专门的工具来提供下载的。
如果是以不规范的方式下载的 jar 包,那么其中的内容很可能也是不规范的。
借助于 Maven 可以以一种规范的方式下载 jar 包。因为所有知名框架或第三方工具的 jar 包以及按照统一-的规范存放在 了 Maven 的中央仓库中
以规范的方式下载的 jar 包,内容也是可靠的。
Tips: "统一的规范"不仅是对 T 开发领域非常重要,对于整个人类社会都是非常重要的。
- 一个 jar 包依赖的其他 jar 包需要自己手动加入到项目中
FileUpload 组件–>IO 组件。 commons-fileupload-1.3.jar 依赖于 commons-io-2.0.1jar
如果所有 jar 包之间的依赖关系都需要程序员自己非常清楚的了解,那么就会极大的增加学习成本。
Maven 会自动将被依赖的 jar 包导入进来。
2.Maven 的概述
Maven 是 Apache 软件基金会组织维护的一款自动化构建工具。主要有两个作用:
- maven 工程对 jar 包的管理过程
- 项目的一键构建
2.1 构建
概念:以“java 原文件”、“框架配置文件”、“JSP”、“HTML”、“图片”等资源为“原材料”,去“生产”一个可以运行的项目过程
其中包括:编译、部署、搭建
- 编译:Java 源文件[User.java]-→ 编译- +Class 字节码文件[User.class]- +交给 JVM 去执行
- 部署:一个 BS 项目最终运行的并不是动态 Web 工程本身,而是这个动态 Web 工程"编译的结果”
一个形象的比喻:生的鸡 -> 处理 -> 熟的鸡
动态 Web 工程 -> 编译、部署 -> 编译结果
图解编译结果与动态 Web 工程的区别:
开发过程中,所有的路径或配置文件中配置的类路径等都是以编译结果的目录结构为标准的
其中:
被称为运行时环境,并不会加载到编译结果中
- 构建过程的各个环节
- 清理:将以前编译得到的旧的 class 字节码文件删除,为下一-次编译做准备
- 编译:将 Java 源程序编程成 class 字节码文件
- 测试:自动测试,自动调用 junit 程序
- 报告:测试程序执行的结果
- 打包:动态 Web_ I 程打 war 包, Java 工程打 jar 包
- 安装: Maven 特定的概念一将打包得到的文件复制到 "仓库”中的指定位置
- 部署:将动态 Web.工程生成的 war 包复制到 Servlet 容器的指定目录下,使其可以运行
- 自动化构建
2.2 安装 Maven 核心程序
- 检查 JAVA_HOME 环境变量, maven 本身就是 java 写的,所以要求必须安装 JDK
- 下载并解压 maven 安装程序 ,放在一个非中文无空格路径下
- 配置 Maven 相关的环境变量
- 验证是否安装成功,在 cmd 中运行 mvn -v 命令
2.3 第一个 Maven 工程(原生 Maven)
- 创建约定的目录结构
目录结构
Hello 工程名
|---src 源码
|---|---main 放主程序
|---|---|---java 存放java源文件
|---|---|---resources 存放框架或其他工具的配置文件
|---|---test 存放测试程序
|---|---|---java 存放java源文件
|---|---|---resources 存放框架或其他工具的配置文件
|---pom.xml Maven的核心配置文件
手动创建时为什么要遵守约定的目录结构?
Maven 要负责我们这个项目的自动化构建,以编译为例, Maven 要想自动进行编译,那么它必须知道 Java 源文件保存在哪里
而,我们自定义的东西要想让框架知道或工具知道,有两种方式
- 通过配置的方式告诉框架
- 按照框架约定的来创建
- 编写 pom.xml
<?xml version="1.0" ?>
<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>com.atguigu.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Hello</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
- 在 src/main/java/com/atguigu/maven 目录下新建文件Hello.java
package com.atguigu.maven;
public class Hello {
public String sayHello(String name){
return "Hello "+name+"!";
}
}
- 在/src/test/java/com/atguigu/maven 目录下新建测试文件HelloTest.java
package com.atguigu.maven;
import org.junit.Test;
import static junit.framework.Assert.*;
public class HelloTest {
@Test
public void testHello(){
Hello hello = new Hello();
String results = hello.sayHello("litingwei");
assertEquals("Hello litingwei!",results);
}
}
- 在命令行中运行基本命令
mvn compile 编译
mvn clean 清理
mvn test 测试
mvn package 打包
注意:运行 Maven 命令时一定要进入 pom.xml 文件所在的目录!