自动化构建工具 Maven
哔哩哔哩尚硅谷 Maven-Eclipse版 学习视频网址
文章只为分享学习经验和自己复习用,学习还是去查看正规视频网站和官方文档更有效
解释 | 归属 | 备注 | |
---|---|---|---|
pom.xml | Maven核心配置文件 | 文件 | |
resources | 资源,存放框架或其他工具 | 文件 | |
<groupId> |
项目组ID | pom.mxl | 官网倒序 |
<artifactId> |
项目的模块ID | pom.mxl | |
<version> |
模块版本号 | pom.mxl | |
<dependency> |
依赖信息 | pom.mxl | |
<type> |
依赖类型 | pom.mxl | |
<scope> |
依赖范围 | pom.mxl | |
mvn clean | 清理 | Maven命令 | |
mvn compile | 编译主程序 | Maven命令 | |
mvn test-compile | 编译测试程序 | Maven命令 | |
mvn test | 执行测试 | Maven命令 | |
mvn package | 打包 | Maven命令 | 执行下面,上面的也会执行 |
mvn install | 安装 | Maven命令 | 安装才会存入本地仓库 |
mvn site | 生产站点 | Maven命令 | |
compile | 编译 | 依赖范围 | 全能使用,并且保存 |
test | 测试 | 依赖范围 | 只测试使用,不保存 |
provided | 假如 | 依赖范围 | 全能使用,但是不保存 |
Clean | 清理 | 依赖生命周期 | |
Site | 位置 | 依赖生命周期 | |
Default | 默认 | 依赖生命周期 | |
<exclusion> |
依赖排除 | pom.mxl | |
<properties> |
性质 | pom.mxl | 统一版本号 |
<parent> |
继承 | 继承pom.mxl | 子类声明 |
<relativePath> |
相对路径 | 继承pom.mxl | 子类中的父类路径 |
<dependencyManagement> |
依赖关系管理 | 继承pom.mxl | 父类统一配置子类依赖 |
<module> |
聚合 | pom.mxl | 一键安装各个模块 |
<build> |
部署 | pom.mxl | 已经不太适用 |
目录
- 自动化构建工具 Maven
-
- 1、标准技术
- 2、这些技术在开发中存在的问题 [Why]
- 3、Maven是什么?[what]
- 4、安装 Maven 核心程序
- 5、Maven-jar依赖信息网站
- 6、Maven---Eclipse常见报错
Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和依赖管理。Maven 这个单词的本意是:专家,内行。读音是['meɪv(ə)n]或['mevn]。
Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。
Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目。由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目发文时使用 Maven,而且公司项目采用 Maven 的比例在持续增长。
1、标准技术
2、这些技术在开发中存在的问题 [Why]
- 一个项目就是一个工程
- 如果项目非常庞大,就不适合继续使用package来划分模块。最好是每个模块对应一个工程,利于分工协作。
- 借助于Maven就可以将一个项目拆分成多个工程。
- 项目中需要的jar包必须手动 “复制” 、“粘贴” 到 WEB-INF/lib 目录下
- 带来的问题是:同样的jar包文件会重复出现在不同的项目工程中,一方面浪费存储空间,另外也让工程比较臃肿。
- 借助Maven,可以将jar包仅仅保存在 “仓库” 中,有需要使用的工程 “引用” 这个文件接口,并不需要真的把jar包复制过来。
- jar包需要别人替我们准备好,或到官网下载
- 不同技术的官网提供jar包下载的形式是五花八门的。
- 有些技术的官网就是通过Maven或SVN等专门的工具来提供下载。
- 如果是以不规范的方式下载的jar包,那么其中的内容很可能也是不规范的。
- 借助于Maven可以以一种规范的方式下载jar包。因为所有知名框架或第三方工具的jar包以及按照统一的规范存放在Maven的中央仓库中。(以规范的方式下载jar包,内容也是可靠的)
- Tips:“统一的规范” 不仅是对IT开发领域非常重要,对于整个人类社会都是非常重要的。
- 一个jar包依赖的其他jar包,也需要自己手动加入到项目中
- File Upload 组件 → IO 组件,commons-fileupload-1.3.jar 依赖于 commons-io-2.0.1.jar。一个正规工程需要大量的jar包以及它的关联jar包。
- 如果所有jar包之间的依赖关系都需要程序员自己非常清楚的了解,那么就会极大的增加学习成本。
- Maven会自动将被依赖的jar包导入进来。
3、Maven是什么?[what]
3.1、Maven是一款服务于Java平台的自动化构建工具
Make → Ant → Maven → Gradle
3.2、构建
构建并不是创建,创建一个工程并不等于构建一个项目。
要了解构建的含义我们应该由浅入深的从以下三个层面来看:
1、纯 Java 代码
大家都知道,我们 Java 是一门编译型语言,.java 扩展名的源文件需要编译成.class 扩展名的字节码文件才能够执行。所以编写任何 Java 代码想要执行的话就必须经过编译得到对应的.class 文件。
2、Web 工程
当我们需要通过浏览器访问 Java 程序时就必须将包含 Java 程序的 Web 工程编译的结果“拿”到服务
器上的指定目录下,并启动服务器才行。这个“拿”的过程我们叫部署。
3、实际项目
在实际项目中整合第三方框架,Web 工程中除了 Java 程序和 JSP 页面、图片等静态资源之外,还包括第三方框架的 jar 包以及各种各样的配置文件。所有这些资源都必须按照正确的目录结构部署到服务器上,项目才可以运行。
-
概念:以 “Java源文件”、“框架配置文件”、”JSP“、”HTML“、”图片“ 等资源为 ”原材料“,去 ”生产“ 一个可以运行的项目的过程
- 编译
- 部署
- 搭建
-
编译:Java源文件[User.java] → 编译 → Class字节码文件[User.class] → 交给JVM去执行
Tips:运行时环境
其实是一组jar包的引用,并没有把jar包本身复制到工程中,所以并不是目录
- 部署:一个BS项目最终运行的并不是动态Web工程本身,而是这个动态Web工程 “编译的结果”
“ 编译的结果 ”
生的鸡 → 处理 → 熟的鸡
动态Web工程 → 编译、部署 → 编译结果
- 编译结果和工程本身是不一样的
相对路径在没有输入/WebContent
时也能正确跳转,是由于程序真正运行的是编译结果。
根目录名为工程名字,里面没有WebContent目录,WebContent目录的内容已经变成了编译结果的主体内容,包括/good
。
所以开发过程中,所有的路径或配置文件中配置的类路径等都是以编译结果的目录结构为标准的
Tips:tc_sever 可以查看项目目录
整个目录复制到eclipse解压安装目录下的dropins目录下即可
实际使用中IDEA和Eclipse已经帮助我们进行了构建与部署,所有体验不是很明显
eclipse自动编译(构建)
3.3、构建过程中的各个环节
- 清理:将以前编译得到旧class字节码文件删除,为下一次编译做准备
- 编译:将Java源程序编译成class字节码文件
- 测试:自动测试,自动调用junit程序
- 报告:测试程序执行的结果
- 打包:动态Web工程war包,Java工程打jar包
- 安装:Maven特定的概念——将打包得到的文件复制到 “仓库” 中的指定位置
- 部署:将动态Web工程生成的war包复制到Servlet容器的指定目录下,使其可以运行
3.4、自动化构建
由于它环节比较多,如果只是人工去操作就比较费劲,所以自动化构建尤其重要
一个正常的修复BUG流程
我们发现中间红色的步骤是重复的
如果将重复的步骤交给自动构建就可以省很多步骤
此时 Maven 的意义就体现出来,它可以自动的从构建过程的起点一致执行到终点
4、安装 Maven 核心程序
4.1、检查JAVA_HOME环境变量
C:\Users\Administrator>echo %JAVA_HOME%
G:\java\jdk
4.2、Maven核心程序的压缩包
解压Maven核心程序的压缩包,放在一个非中文无空格路径下
D:\Environment\apache-maven-3.8.1
4.3、配置Maven相关的环境变量
(1)MAVEN_HOME或M2_HOME
(2)path
4.4、验证:运行 mvn -v 命令查看Maven版本
C:\Users\Administrator>mvn -v Apache Maven 3.8.1 (05c21c65bdfed0f71a2f2ada8b84da59348c4c5d) Maven home: D:\Environment\apache-maven-3.8.1\bin\.. Java version: 1.8.0_231, vendor: Oracle Corporation, runtime: G:\java\jdk\jre Default locale: zh_CN, platform encoding: GBK OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"
4.5、Maven的核心概念
- 约定的目录结构
- POM
- 坐标
- 依赖
- 仓库
- 生命周期/插件/目标
- 继承
- 聚合
4.6、创建第一个Maven工程
1、 创建约定的目录结构(强制性)
Hello
|—src
|—|---main
|—|---|—java
|—|---|—resources
|—|---test
|—|---|—java
|—|---|—resources
|—pom.xml
- 根目录:工程名
- src目录:源码
- pom.xml文件:Maven工程的核心配置文件
- test目录:存放测试程序
- java目录:存放Java源文件
- resources目录:存放框架或其他工具的配置文件
2、为什么要遵守约定的目录结构呢?
-
Maven要负责我们这个项目的自动化构建,以编译为例,Maven要想自动化编译,那么它必须知道Java源文件保存在哪里
- 以配置的方式明确告诉框架
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classspath:spring-context.xml</param-value> </context-param>
-
遵守框架内部已经存在的约定
log4j.properties
log4j.xml
-
约定 > 配置 > 编码
4.7、常用Maven命令
1、创建测试目录
创建约定目录
按约定创建
Hello
|—src
|—|---main
|—|---|—java
|—|---|—resources
|—|---test
|—|---|—java
|—|---|—resources
|—pom.xml
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> <!-- 它所依赖的其他jar,junit -->
</project>
编写主程序diam
编写主程序代码
在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);
//assertEquals 断言,断言results 和内容一样,不然抛异常
}
}
2、基本的Maven命令
(1)注意:执行与构建过程相关的Maven命令,必须进入pom.xml所在的目录。与构建过程相关:编译、测试、打包、…
(2)常用命令
-
mvn clean:清理
-
mvn compile:编译主程序
生成target文件→classes和maven-status文件
-
mvn test-compile:编译测试程序
-
mvn test:执行测试
-
mvn package:打包(只会打包主程序)
target文件中出现→maven-archiver、surefire-reports(测试报告)、test-classes、Hello-0.0.1-SNAPSHOT.jar(只有主程序,没有测试程序)
-
mvn install:安装
-
mvn site:生成站点
执行各个构建环节都是有顺序的,当你执行 “打包” 的时候,也会执行 “测试”
4.8、关于联网问题和修改默认本地仓库
1、Maven的核心程序中仅仅定义了抽象的生命周期,但是具体的工作必须由特定的插件来完成。而插件本身并不包含在Maven得核心程序中
2、当我们执行的Maven命令需要用到某些插件时,Maven核心程序会首先到本地仓库中查找
3、本地仓库的默认位置:[系统中当前用户的家目录]\.m2\repository
C:\Users\[登录当前系统的用户名]\.m2\repository
4、Maven核心程序如果在本地仓库中找不到需要的插件,那么它会自动连接外网,到中央仓库下载
5、如果此时无法连接外网,则构建失败
6、修改默认本地仓库的位置可以让Maven核心程序到我们事先准备好的目录下查找插件
- 找到Maven解压目录\conf\settings.xml
- 在settings.xml文件中找到localRepository标签
- 将
<localRepository>/path/to/local/repo</localRepository>
从注释中取出 - 将标签体内容修改为已经准备好的Maven仓库目录
4.9、POM
-
含义:Project Object Model 项目对象模型
-
pom.xml 对于Maven工程是核心配置文件,与构建过程相关的一切设置都在这个文件中进行配置。
重要程度相当于web.xml对于动态Web工程
4.10、坐标
1、数学中的坐标
(1)在一个平面中使用 x、y 两个向量可以唯一的确定平面中的一个点。
(2)在空间中使用 x、y、z 三个向量可以唯一的确定空间中的一个点。
2、Maven 的坐标
使用如下三个向量在 Maven 的仓库中唯一的确定一个 Maven 工程。
GAV
(1)groupid:公司或组织的域名倒序+当前项目名称
<groupid>com.ssxxz.maven</groupid>
(2)artifactId:当前项目的模块名称
<artifactId>Hello</artifactId>
(3)version:当前模块的版本
<version>1.0.0</version>
SNAPSHOT
表示一个不稳定的更新速度很快,临时的一个
RELEASE
分离,表示这个工程已经彻底分离了,一个完整稳定的版本
3、Maven工程的坐标与仓库中路径的对应关系
Maven工程
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.0.0.RELEASE</version>
仓库中路径
org\springframework\spring-core\4.0.0.RELEASE\spring-core-4.0.0.RELEASE.jar
4.11、仓库
1、仓库的分类
-
仓库的分类
-
本地仓库:当前电脑上部署的仓库目录,为当前电脑上所有Maven工程服务
</
-