Maven 学习日记(1)
资料
https://pan.baidu.com/s/1o66CnnnX-MkoLa3z56joew#list/path=%2F
提取码
8uws
对 Maven 的需求
1、目前存在的问题
(1) 一个项目就是一个工程
如果项目非常庞大,就不适合使用 package 划分模块,最好是每个模块对应一个工程。
借助 Maven 可以将一个项目拆分成多个工程。
(2) 项目中需要的 jar 包必须手动复制、粘贴到工程中
带来的问题是: 同样的 jar 包重复出现在不同的项目工程中,一方面浪费存储空间,另外让工程比较臃肿。
借助 Maven,可以将 jar 包仅仅保存在仓库中,有需要的工程"引用"这个文件接口,并不需要真的把jar包复制过来。
(3) jar 包需要别人帮我们准备好、或者到官网下载
不同技术的官网提供 jar 包下载的形式是五花八门的。
有些技术的官网就是通过 Maven 等专门的工具提供下载的。
如果以不规范的方式下载 jar 包,那么其中的内容可能也是不规范的。
借助 Maven 可以以一种规范的方式下载 jar 包,因为所有知名框架或第三方的 jar 包已经按照统一的规范存放在 Maven 的中央仓库中。
(4) 一个 jar 包依赖的其他 jar 包需要自己手动加入到项目中
Maven 会自动将被依赖的 jar 包导入。
Maven 是什么
-
Maven 是一款服务于 Java 平台的自动化构建工具。
Make -> ant -> Maven -> Gradle
-
构建
(1) 概念:以 java 源文件、框架配置文件、JSP、HTML、CSS、图片等资源为原材料去生产一个可以运行的项目的过程。
编译->部署->搭建
(2) 编译: Java 源文件 User.java -> 编译 -> Class 字节码文件 -> 交给虚拟机JVM执行
(3) 部署:一个 BS 项目最终运行的并不是动态工程本身,而是编译的结果
(4) 构建过程中的各个环节
-
清理: 将以前编译得到的旧 class 字节码文件删除,为下一次编译做准备
-
编译: 将 Java 源程序编程成 class 字节码文件
-
测试: 自动测试,自动调用 JUnit 程序
-
报告: 测试程序执行的结果
-
打包: 动态 Web 工程打 war 包,Java 工程打 jar 包
-
安装: Maven 特定的概念 - 将打包得到的文件复制到仓库中的指定位置
-
部署: 将动态 Web 工程生成的 war 包复制到 Servlet 容器的指定目录下,使其可以运行
(5) 自动化构建
安装 Maven 核心程序
1、检查 JAVA_HOME 环境变量
2、解压 Maven 核心程序压缩包
3、配置 Maven 的环境变量
(1) MAVEN_HOME 或 M2_HOME,所在 bin 目录上级目录
(2) path: 所在 bin 目录
3、运行 mvn -v
第一个 Maven 工程
① 创建约定的目录结构
[1] 根目录: 工程名
[2] src 目录: 源码
[3] pom.xml 文件: Maven 工程的核心配置文件
[4] main 目录: 存储主程序
[5] test 目录: 存放测试程序
[6] java 目录: 存放 Java 源文件
[7] resources 目录: 存放框架或其他工具的配置文件
② 为什么要遵守约定的目录结构
[1] Maven 要负责项目的自动化构建,以编译为例,Maven 要想自动进行编译,必须知道 Java 文件保存在哪里。
[2] 如果我们自己自定义的东西想要让框架或工具知道,有两种方式: 以配置的方式告诉框架和遵守框架内部的约定。
③ 工程创建
创建如图所示目录结构
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.an.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>
Hello.java
package com.an.maven;
public class Hello {
public String sayHello(String name){
return "Hello "+name+"!";
}
}
HelloTest.java
package com.an.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);
}
}
④ 常用 Maven 命令
1、执行与构建过程相关的 Maven 命令,必须进入 pom.xml
所在的目录。
与构建过程相关:编译、测试、打包、部署 ...
2、常用命令
(1) mvn clean
清理
(2) mvn compile
编译
直接运行可能会下载报错。
原因为2020年1月maven只支持https请求。
解决方法: 在 settings.xml 的 mirror 标签添加阿里云镜像
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
此时执行成功
(3) mvn test-compile
编译测试程序
(4) mvn test
执行测试
(5) mvn package
打包
3、关于联网问题
(1) Maven 的核心程序中仅仅定义了抽象的生命周期,但是具体的工作必须由特定的插件来完成,而插件本身并不包含在 Maven 的核心程序中。
(2) 当我们执行的 Maven 命令需要用到某些插件是,Maven 核心程序首先会在本地仓库中查找。
(3) 本地仓库的默认位置: 系统中当前用户的目录/.m2/repository
(4) Maven 核心程序如果在本地仓库中找不到需要的插件,他会自动连接外网,当中央仓库下载,如果此时无法连接外网,则构建失败。
(5) 修改默认本地仓库位置可以让 Maven 核心程序到我们事先准备好的目录下载文件。
-
找到 Maven 的
settings.xml
-
找到
localRepository
标签,并取消它的注释 -
将标签体内容修改为已经准备好的 Maven 仓库目录
4、命令执行结果
执行 mvn compile
后
执行 `mvn test-compile 后
执行 mvn package
后
POM
1、含义: Project Object Model 项目对象模型
2、porm.xml 对于 Maven 工程是核心配置文件,与构建过程相关的一切设置都在这个文件中进行配置。
坐标
1、Maven 坐标
使用下面三个相邻在仓库中唯一定位一个 Maven 工程
(1) groupid: 公司或组织域名倒序 + 项目名
(2) artifactid: 模块名称
(3) version: 版本
2、Maven 工程的坐标与仓库中目录对应关系
将groupid
中的点换成/
+ artifactid + /
+ version
仓库
1、仓库的分类
(1) 本地仓库: 当前电脑上部署的仓库目录,为当前电脑上所有 Maven 工程服务。
(2) 远程仓库:
-
私服: 搭建在局域网环境中,为局域网范围内的所有 Maven 工程服务
-
中央仓库: 架设在 Internet 上,为全世界的所有 Maven 工程服务
-
中央仓库镜像: 架设在各个大洲,为中央仓库分担流量,减轻中央仓库压力,同时更快响应用户请求
2、仓库中保存的内容: Maven 工程
(1) Maven 自身所需要的插件
(2) 第三方框架或工具的 jar 包
(3) 我们自己的 Maven 工程
第二个 Maven 工程
1、目录结构
2、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.an.maven</groupId>
<artifactId>HelloFriend</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>HelloFriend</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.an.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
3、HelloFriend.java
package com.an.maven;
import com.an.maven.Hello;
public class HelloFriend {
public String sayHelloToFriend(String name){
Hello hello = new Hello();
String str = hello.sayHello(name)+" I am "+this.getMyName();
System.out.println(str);
return str;
}
public String getMyName(){
return "John";
}
}
4、HelloFriendTest.java
package com.an.maven;
import static junit.framework.Assert.assertEquals;
import org.junit.Test;
import com.an.maven.Hello;
public class HelloFriendTest {
@Test
public void testHelloFriend(){
HelloFriend helloFriend = new HelloFriend();
String results = helloFriend.sayHelloToFriend("litingwei");
assertEquals("Hello litingwei! I am John",results);
}
}
5、使用 Maven compile
直接执行 mvn compile
报错
依赖
1、解决项目二的问题
Maven 解析依赖信息时会到本地仓库查找被依赖的 jar 包
对于我们自己的 Maven 工程使用 install 命令安装后就可以进入仓库
到第一个项目中执行 mvn install
此时第二个项目编译成功
2、依赖的范围
(1) compile
-
对主程序是否有效:有效
-
对测试程序是否有效:有效
-
是否参与打包:参与
(2) test
-
对主程序是否有效:无效
-
对测试程序是否有效:无效
-
是否参与打包:不参与
(3) provided
-
对主程序是否有效:有效
-
对测试程序是否有效:有效
-
是否参与打包:不参与
-
是否参与部署:不参与
-
典型例子:servlet-api.jar
生命周期
1、各个构建环节执行的顺序:不能打乱顺序,必须按照正确顺序执行
2、Maven 的核心程序中定义了抽象的生命周期,生命周期中各个阶段的具体任务是由插件来完成的。
3、Maven 有三套独立的生命周期,分别是:
(1) Clean Lifecycle: 在进行真正的构建之前进行一些清理工作。
(2) Default Lifecycle: 构建的核心部分,编译,测试,打包,安装,部署等等。
(3) Site Lifecycle: 生成项目报告,站点,发布站点。
4、Maven 核心程序为了更好实现自动化构建,按照这一特点执行声明周期中的各个阶段:不论现在要执行生命周期的哪一个阶段,都是从这个生命周期最初的位置开始执行。
5、插件和目标
(1) 生命周期的各个阶段仅仅定义了要执行的任务是什么
(2) 各个阶段和插件的目标是对应的
(3) 相似的目标有特定的插件来完成
idea 环境下创建 Maven 项目
编译 Maven 项目
打包 Maven 项目
Maven 创建 Web 项目
修改 JDK 版本
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
设置单元测试的版本
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
删除 pluginManagement 标签
添加 Web 部署的插件
Tomcat
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>8081</port>
<path>/test</path>
<uriEncoding>UTF-8</uriEncoding>
<server>tomcat7</server>
</configuration>
</plugin>