MAVEN全套教学-黑马

一、Maven介绍

1.1 maven是什么

  • Maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)
  • POM( Proiect Obiect Model):项目对象模型

1.2 maven的作用

  • 项目构建:提供标准的、跨平台的自动化项目构建方式
  • 依赖管理:方便快捷的管理项目依赖的资源(jar包),避免资源间的版本冲突问题
  • 统一开发结构:提供标准的、统一的项目结构

1.3 maven解压后的结构

1
2
3
4
5
6
|-bin  启动项bat,sh文件
|  |-mvn文件内部指定了 JAVA_HOME 等路径    
|-boot 类加载器
|  |-plexus-classworlds maven的类加载器
|-conf 核心配置文件
|-lib maven自己依赖的jar包

1.4 mvn安装

1
2
3
4
5
6
7
官网:http://maven.apache.org/
下载地址:http://maven.apache.org/download.cg

1.新建系统变量 MAVEN_HOME 指向解压目录
2.在path里面新增 %MAVEN_HOME%/bin

在CMD命令行里面输入 MVN 出现输出即为正确

1.5 maven仓库地址

jar包下载地址:https://repo1.maven.org/maven2/
mav中央仓库pom文件引用地址:https://mvnrepository.com/

1.6 mvn坐标

坐标由三部分组成

  • 组织ID groupId,项目隶属的组织名称(通常是域名的反写,例如:org.mybatis)
  • 项目ID artifactId,当前maven项目名称(通常是模块名称,例如:CRM、SMS)
  • 版本号 version
  • 打包方式 packaging

1.7 mvn中POM文件修改,本地仓库配置

默认本地jar包存储位置,默认这一行是注释的:

${user.home}/.m2/repository

自定义修改:

D:/maven/repository

1.8maven参数修改仓库配置

1
2
3
4
5
6
7
8
9
10
11
12
13
<mirrors>
<!-- -->
<mirror>
<!-- mirror -->
<id>nexus-aliyun</id>
<!-- -->
<mirrorOf>central</mirrorOf>
<!-- -->
<name>Nexus aliyun</name>
<!-- URL -->
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>

配置阿里云仓库:

1
2
3
4
5
6
7
8
9
10
11
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://maven.aliyun.com/repository/public</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>

在线查看阿里云可用jar包:https://developer.aliyun.com/mvn/view

配置使用腾讯云内网仓库地址

1
2
3
4
5
6
<mirror>
<id>nexus-tencentyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus tencentyun</name>
<url>http://mirrors.cloud.tencent.com/nexus/repository/maven-public/</url>
</mirror>

二、基础概念

三、第一个Maven项目(手工制作)

maven工程结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
project
|-java-project
|-pom.xml
|-src
|-main
|-java
|-com
|-itheima
|-Demo.java
|-resources
|-test
|-java
|-com
|-itheima
|-DemoTest.java
|-resources

Demo.java

1
2
3
4
5
6
7
8
9
10
package com.itheima
public class Demo{
public String say(String name){
System.out.print("hello"+name);
return "hello" + name;
}
public static void main(){

}
}

DemoTest.java

1
2
3
4
5
6
7
8
9
10
11
package com.itheima;
import org.junit.Test;
import org.junit.Assert;

public class DemoTest{
public void testSay(){
Demo d = new Demo();
String ret = d.say("maven");
Assert.assertEquals("hellomaven",ret);
}
}

pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.itheima</groupId>
<artifactId>project-java</artifactId>
<version>1.0</version>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>

命令参数

1
2
3
4
5
mvn compile     #编译
mvn clean #清理
mvn test #测试
mvn package #打包
mvn install #安装到本地仓库

命令1、mvn compile 编译

编译命令,用于把java生产.class文件。

命令2、mvn clean

清除命令,用于把 target 文件夹下面的文件都删除掉。

命令3、mvn test

测试命令,用于执行test目录下的测试,会生成一个测试报告,在 target/surefire-reportscom.itheima.DemoTest.txt

命令4、mvn package 打包

打包命令,生成.jar包,生成再target目录下。

命令5、mvn install 插入命令

把jar包上传到本地的mav仓库里面。

mav生成jar模板

1
mvn archetype:generate -DgroupId={包路径com.itheima} -DartifactId={项目名称dmdzzh} -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
  • 创建java项目
1
mvn archetype:generate -DgroupId=com.itheima -DartifactId=java-project -DarchetypeArtifactId=maven-archetype-quickstart -Dversion=0.0.1-snapshot -DinteractiveMode=false
  • 创建web工程
1
mvn archetype:generate -DgroupId=com.itheima -DartifactId=web-project -DarchetypeArtifactId=maven-archetype-webapp -Dversion=0.0.1-snapshot -DinteractiveMode=false

四、第一个Maven项目(IEDA制作)

生成web项目,并且引入tomcat插件

  1. 在bulid里面插入插件,然后右侧刷新,就可以看到tomcat,点击tomcat:run就可以

    image-20220214215308627

1
2
3
4
5
6
7
8
9
10
11
12
13
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>80</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>

image-20220214215455305

版本号:

1
2
release完成版
snapshot测试版本,开发版

五、依赖管理

项目运行所依赖的jar包。

依赖传递

  • 直接依赖,在pom里面直接写上去的。
  • 间接依赖,在pom里面依赖的jar包里面依赖的jar包。

依赖传递冲突

  • 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高

  • 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的

  • 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的

image-20220214220448604

可选依赖

optional改为true,对外隐藏当前所依赖的资源,被引用的时候,引用方无法知道被引用里面的该jar包。

1
2
3
4
5
6
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<optional>true</optional>
</dependency>

排除依赖

从引用的jar资源里面剔除指定jar,如下引用junit包,但是从里面排除hamcrest-core包

1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>

依赖范围scope

  • 依赖的jar默认情况可以在任何地方使用,可以通过scope标签限定其作用范围。
  • 可选作用范围
    • 主程序有效(main文件夹范围)
    • 测试程序有效(test文件夹范文)
    • 是否参与打包(package指令范围内)
scope 主程序 测试代码 打包 范例
compile(默认) Y Y Y log4j,主程序要用,测试代码里面也用,上线之后也需要
test Y junit,只需要在test类里面使用,而且不需要达到包里面
provided Y Y servlet-api,本地需要,测试需要,但是服务上不需要,服务器里面有
runtime Y jdbc

image-20220226141413761

image-20220214223447708

1
2
3
4
5
6
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>

image-20220226142226516

六、生命周期与插件

完整的什么周期,分为三套:

  • clena:清理
  • default:核心工作
  • site:产生报告,发布站点

清理阶段

  • pre-clean 执行一些需要在clean之前完成的工作
  • clean 实际的清理工作
  • post-clean 执行一些clean之后的工作

核心阶段

生成报告阶段

image-20220226143146138

插件plugins

phase:阶段

测试插件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<goals>
<goal>jar</goal>
</goals>
<phase>generate-test-resources</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>

七、分模块开发与设计(mave高级重点)

  • ssm_pojo 模块
  • ssm_dao 模块
  • ssm_service 模块
  • ssm_controller 模块

八、聚合(重点)

上面的四个模块依次依赖,现在创建一个模块,里面管理所有模块。

步骤:

  1. 创建一个聚合模块项目,不需要src目录,只需要pom.xml文件
  2. 在pom.xml文件中增加一行:<packaging>pom</packaging>该行定义pom文件只用于构建管理。
    1. packaging标签默认打jar包,web默认打war包,聚合需要手动改为pom。
    2. 当增加packagin为pom的时候,该模块在idea里面会被标记为root。
  3. 添加内容<modules></modules>用于管理模块。module顺序无所谓,mavne根据模块依赖进行加载。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.itheima</groupId>
<artifactId>project-java</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<modules>
<module>../ssm_pojo</module>
<module>../ssm_dao</module>
<module>../ssm_service</module>
<module>../ssm_controller</module>
</modules>
</project>
  1. 打包部署的时候在ssm模块进行,单元测试开发可以在自己单独的模块里面启动测试。
  2. 实际上分模块之间还是依次依赖。

九、继承(重点)

用于解决:子模块中依赖的相同的jar包版本冲突。

使用方法:在pom.xml中添加

image-20220226172328187

十、属性(重点)

定义一个变量,可以在pom文件中使用。

  1. 自定义属性:定义properties标签用于定义参数。
  2. 系统内置属性:直接引用页面已经创建好的参数,例如version变量。
    1. 可以读取setting.xml中的属性{steeings.localRepository}
    2. 读取java系统属性。mvn help:system 查看所有属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<modelVersion>4.0.0</modelVersion>

<groupId>com.itheima</groupId>
<artifactId>project-java</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<modules>
<module>../ssm_pojo</module>
<module>../ssm_dao</module>
<module>../ssm_service</module>
<module>../ssm_controller</module>
</modules>
<properties>
<spring.version>5.1.9</spring.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>it.heima.com</groupId>
<artifactId>ssm_dao</artifactId>
<version>${version}</version>
</dependency>
</dependencies>
</dependencyManagement>


十一、版本管理

默认1.0-SNAPSHOT

  • SNAPSHOT 快照版本

  • RELEASE 发布版本

image-20220226174452658

十二、资源配置

在pom文件中管理数据库密码等配置文件信息。

十三、多环境开发配置

生成、开发、测试环境配置文件分离。

  1. 定义环境
    1.
  2. 使用环境

image-20220226180612394

十四、跳过测试

以下情况需要跳过测试,在maven中跳过test这个什么周期。

  • 整体模块未开发完成
  • 模块中某个功能未开发完成
  • 快速打包

跳过测试的三种方法:

  1. 在idea里面点击跳过测试按钮。

  2. 命令行里面跳过测试

    1
    2
    mav 命令行里面添加 -D skipTests
    例如:mvn install -D skipTests
  3. 在插件里面跳过test

    在maven里面test使用的插件时:org.apache.maven.plugins.maven-surefire-plugin,-配置插件的参数既可跳过测试。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <build>
    <pluginManagement>
    <plugins>
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.2</version>
    <configuration>
    <skipTests>true</skipTests>
    </configuration>
    </plugin>
    </plugins>
    </pluginManagement>
    </build>
  4. 指定测试内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <build>
    <pluginManagement>
    <plugins>
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.2</version>
    <configuration>
    <skipTests>true</skipTests>
    <includes>
    <!-- 包含指定测试-->
    <include>**/UserTest.java</include>
    </includes>
    <excludes>
    <!-- 排除用-->
    </excludes>
    </configuration>
    </plugin>
    </plugins>
    </pluginManagement>
    </build>

十四、私服

多模块分开分开,不同人将开发好的jar资源放到私服里面,进行合作开发,使用nexus私服。

本次搭建的服务是nexus3:

官方文档地址:https://help.sonatype.com/repomanager3/product-information/download

官方网站:https://help.sonatype.com/docs

Linux搭建方式:

win搭建方式:

直接下载解压,然后在命令行里面执行

1
D:\nexus-3.38.0-01\bin> .\nexus.exe /run nexus

默认端口:8081

端口配置文件地址:etc/nexus-default.properties

程序java虚拟机配置地址:bin/nexus.vmoptions

win默认账号密码:账号admin

1.在页面手工上传资源

image-20220320113208603

仓库组:设计概念,把多个仓库组合在一起方便使用

中央仓库备份(代理仓库):

宿主仓库(私有仓库):公司内部代码程序

Browse/maven-central 代理仓库,中央仓库

Browse/maven-snapshots 宿主仓库,nexus内部自带的仓库

Browse/maven-public 自带的仓库组

操作一,创建一个项目仓库,例如xcdn-release

设置/Repository/Repositories/Create repository/{选择类型为maven2(hosted)}

操作二,把xcdn-release添加到maven-public里面

设置/Repository/Repositories/maven-public/{选择添加xcdn仓库即可}

操作三,在页面手动上传jar包

主页/Upload/xcdn/{选择文件,添加相关坐标信息}

2.在IDEA里面配置私服

idea里面配置的是本地仓库,所以代码上传到私服是由本地的仓库进行操作,还需要告诉jar包上传的位置,哪个仓库哪个位置。

image-20220320120506190

用户名密码配置到本地仓库里面,上传的位置配置到项目地址里面,下载的地址配置到本地。

  1. 在本地仓库配置账号密码

配置本地maven的settings.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<servers>
<server>
<id>xcdn-release</id>
<username>admin</username>
<password>admin</password>
</server>
<server>
<id>xcdn-snapshots</id>
<username>admin</username>
<password>admin</password>
</server>
</servers>


<mirrors>
<mirror>
<!-- mirror -->
<id>nexus-aliyun</id>
<!-- central 代表中央仓库的东西从这个仓库来 -->
<mirrorOf>central</mirrorOf>
<!-- -->
<name>Nexus aliyun</name>
<!-- URL -->
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
<mirror>
<!-- mirror -->
<id>nexus-xcdn</id>
<!-- 所有东西都从这里找,所以配置*号 -->
<mirrorOf>*</mirrorOf>
<!-- URL -->
<url>http://localhost:8081/repository/maven-public/</url>
</mirror>
</mirrors>
  1. 通过install命令把本地打好的jar包发布到私服上。

    发布有一个专门的生命周期,Lifecycle-deploy。

​ 如下内容中id里面对应参数为本地maven中配置的servers/server/id标签内容匹配,然后根据在本地maven配置文件中的账号密码实现jiar包上传。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<bulid>
</build>

<distributionManagement>
<repository>
<id>xcdn-release</id>
<url>http://localhost:8081/repository/heima-release/</url>
</repository>
<snapshotRepository>
<id>xcdn-snapshots</id>
<url>http://localhost:8081/repository/heima-snapshots/</url>
</snapshotRepository>
</distributionManagement>

3.使用docker安装nexus3

docker官网:https://hub.docker.com/

docker-nexus3官网:https://hub.docker.com/r/sonatype/nexus3/

安装步骤

  1. 拉取镜像
  2. 创建目录卷
  3. 创建容器
  4. 查看服务器里面的密码
1
2
3
4
5
6
7
8
9
docker pull sonatype/nexus3

docker volume create --name nexus-data

docker run -d -p 8081:8081 --name nexus3 -v nexus-data:/nexus-data sonatype/nexus3

docker exec -it nexus3 /bin/sh

cat /nexus-data/admin.password