Maven学习笔记

1 Maven简介

1.1 传统项目管理状态分析

  • jar包不统一,不兼容
  • 工程升级维护过程操作繁琐

在这里插入图片描述

1.2 Maven是什么

  • maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)
  • POM(Project Object Model):项目对象模型
    在这里插入图片描述

1.3 Maven的作用

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

2 下载与安装

  • 官网:http://maven.apache.org/
    1、将下载好的文件解压缩,我的是放在C:\Program Files\apache-maven-3.6.3下
    在这里插入图片描述

bin包:maven所有可运行指令,运行maven主要运行里面的mvn.cmd
boot包:maven的类加载器,maven要自己管理一套java的运行程序,因为maven是java做的,它有它自己独立的类加载器
conf包:maven的配置管理,目录下有maven的配置文件
lib包:maven运行依赖的jar包

2、配置环境变量:
在这里插入图片描述
在这里插入图片描述
3、在cmd查看是否配置成功:

mvn -v

在这里插入图片描述

3 Maven基础概念

3.1 仓库

  • 仓库:用于存储资源,包含各种jar包
    在这里插入图片描述

仓库分类

  • 本地仓库:自己电脑上存储资源的仓库,连接远程仓库获取资源
  • 远程仓库:包括私服和中央仓库,即非本机电脑上的仓库,为本地仓库提供资源
  • 中央仓库:Maven团队维护,存储所有资源的仓库
  • 私服:部门或公司范围内存储资源的仓库,它从中央仓库来获取资源

私服的作用

  • 保存具有版本的资源,包含购买或自主研发的jar
  • 中央仓库的jar都是开源的,不能存储具有版权的资源
  • 一定范围内共享资源,仅对内部开放,不对外共享

3.2 坐标

  • 坐标:Maven中的坐标用于描述仓库中资源的位置
    https://repo1.maven.org/maven2/

  • 主要组成:

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

示例:

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.12.1</version>
</dependency>
  • 作用:使用唯一标识,唯一性地定位资源位置,通过该标识可以将资源的识别与下载工作交由机器完成

3.3 仓库配置

3.3.1 本地仓库配置

Maven启动后,会自动保存下载的资源到本地仓库,仓库位置可在conf/settings.xml下查看

  • 默认位置:
    在这里插入图片描述

其中的默认位置就是:

<localRepository>${user.home}/.m2/repository</localRepository>

在这里插入图片描述
可以自定义本地仓库的位置,将上述代码修改为:
在这里插入图片描述

3.3.2 远程仓库配置

随便找个maven中的jar包,用压缩软件打开:
在这里插入图片描述
返回上一层:
在这里插入图片描述
查找所有pom.的文件,其中pom-4.0.0.xml最特殊:
在这里插入图片描述
pom-4.0.0.xml中,Maven默认连接的远程仓库的位置(当然,我们不是在这里面改,只是了解):

<repositories> 
    <repository> 
        <id>central</id> 
        <name>Central Repository</name> 
        <url>https://repo.maven.apache.org/maven2</url> 
        <layout>default</layout> 
        <snapshots> 
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

可以将其替换为镜像仓库,修改conf/settings.xml,配置为阿里云的镜像仓库
(https://www.bilibili.com/video/BV1Ah411S7ZE/p=5&spm_id_from=pageDriver&vd_source=5061eb5d9c29eda75a5e1981cbcb4d12)

<mirrors> 
    <!-- 配置具体的仓库的下载镜像 --> 
    <mirror> 
        <!-- 此镜像的唯一标识符,用来区分不同的镜像 --> 
        <id>nexus-aliyun</id> 
        <!-- 对哪种仓库进行镜像,即对哪个远程仓库进行替换,此处为中央仓库 --> 
        <mirrorOf>central</mirrorOf>
        <!-- 镜像名称 --> 
        <name>Nexus aliyun</name>
        <!-- 镜像的URL --> 
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
</mirrors>

4 手工制作Maven项目

4.1 项目结构搭建

Maven工程目录结构

在这里插入图片描述
后面自己创建项目的样例:
在这里插入图片描述

代码

在src/main/java/com/hongyi/下新建Demo.java

package com.hongyi;
public class Demo{
    public String say(String name) {
        System.out.println("Hello, " + name);
        return "Hello, " + name;
    }
}

在src/test/java/com/hongyi/下新建DemoTest.java

package com.hongyi;
import org.junit.Test;
import org.junit.Assert;

public class DemoTest {
    @Test
    public void testSay() {
        Demo d = new Demo();
        String ret = d.say("Maven");
        Assert.assertEquals("Hello, Maven", ret);//Assert断言语句,类似于中断,调试的一种
    }
}

在项目根目录(和src同级)下新建一个pom.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!-- pom文件所需的xml头,固定 -->
<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.hongyi</groupId>
    <!-- 项目名称 -->
    <artifactId>project-maven</artifactId>
    <version>1.0</version>
    <packaging>jar</packaging>
	
    <!-- 依赖的资源 -->
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
    
    <!-- 设定字符集和maven编译java程序时的jdk版本,这里是jdk9 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>9</maven.compiler.source>
        <maven.compiler.target>9</maven.compiler.target>
    </properties>
</project>

4.2 项目构建

Maven常用构建命令:使用mvn开头,后面添加功能参数,可以一次执行多个命令,使用空格分隔
在这里插入图片描述

使用示例

mvn compile

在这里插入图片描述
如果jdk版本指定过低,会报以下错误:
在这里插入图片描述
1、此时查看本地仓库,会有下载好的资源
在这里插入图片描述
2、此时,在项目根目录中也会有编译完成的项目target:存放运行结果的
在这里插入图片描述
3、执行clean命令,会清除target目录

mvn clean

4、执行test命令,也会编译生成target,并且附带有测试结果文件

mvn test

在这里插入图片描述
测试报告:
在这里插入图片描述
5、执行package命令,会将源程序编译并打包

mvn package

在这里插入图片描述
注意:打包命令包含了编译和测试两个命令。

6、执行install命令,会将该项目安装到本地仓库

mvn install

查看本地仓库,按照项目的groupId查找,例如com.hongyi:
在这里插入图片描述
其中项目名称artifactId又决定了一层目录,这里为project-maven:
在这里插入图片描述
版本号version又决定了一层目录:
在这里插入图片描述
最后的文件内容,即为打好包的jar包和对应的pom文件:
在这里插入图片描述

4.3 插件创建Maven工程

  • 创建工程(母版)
mvn archetype:generate
-DgroupId={project-packaging} 
-DartifactId={project-name} 
-DarchetypeArtifactId=maven-archetype-quickstart
-DinteractiveMode=false
  • 创建Java工程
mvn archetype:generate -DgroupId=com.itheima -DartifactId=java-project -
DarchetypeArtifactId=maven-archetype-quickstart -Dversion=0.0.1-snapshot -
DinteractiveMode=false
  • 创建web工程
mvn archetype:generate -DgroupId=com.itheima -DartifactId=web-project -
DarchetypeArtifactId=maven-archetype-webapp -Dversion=0.0.1-snapshot -
DinteractiveMode=false

1、创建目录最好是空目录(插件要求创建的目录内不能有maven结构)
cmd控制台内跳转到project目录下,输入上面“创建Java工程代码”生成maven项目,其中DartifactId=java-project就是项目名
在这里插入图片描述
2、其中pom.xml自带junit配置
在这里插入图片描述
3、maven项目缺少resources文件
在这里插入图片描述

4.4 Maven工程目录

在这里插入图片描述

5 IDEA生成Maven项目

5.1 创建空Maven项目

1、新建一个空的工程,然后选择jdk版本
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

2、打开setting,搜索maven并进行相关配置:
在这里插入图片描述
3、打开setting structure新建模块module:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
4、然后标记各个目录的功能(如果颜色是灰色手动选择文件类型,缺少resources则在文件夹右键添加):
在这里插入图片描述

5、按照上一节的操作,添加各个类,最后的项目结构如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/68309bca00f74b0a901928eca9a41eea.png
在这里插入图片描述
在这里插入图片描述

6、在idea右侧有maven相关的操作:
在这里插入图片描述
与mvn的各种命令相同,不再赘述。

7、除了以上方法外,还可以配置Maven运行,达到以上效果
在这里插入图片描述
编译
在这里插入图片描述
清理
在这里插入图片描述

5.2 使用骨架创建Maven项目

1、新建一个模块。选择骨架创建maven项目,这里选择quick-start
在这里插入图片描述
2、项目结构如下:
在这里插入图片描述
3、按照maven项目的经典结构进行改造,改造后的结果如下:
在这里插入图片描述

5.3 使用骨架创建Maven中的web项目

1、新建一个模块。选择骨架创建maven的web项目,这里选择webapp
在这里插入图片描述
2、项目结构如下:
在这里插入图片描述
3、按照maven项目的经典结构进行改造,改造后的结果如下:
在这里插入图片描述
4、在webapp下添加index.jsp
在这里插入图片描述

5.4 Tomcat插件安装和Web工程启动 (IDEA开发工具maven项目通过tomcat7插件远程部署项目)

1、将web.xml和pom.xml多余部分删除
在这里插入图片描述
在这里插入图片描述
2、在https://mvnrepository.com/search?q=tomcat+maven中搜索tomcat maven 找到图中的选项点击
在这里插入图片描述
第一个就是我们要的
在这里插入图片描述
在这里插入图片描述
复制里面的地址
在这里插入图片描述
3、将复制的地址在pom.xml构建插件,并远程运行
在这里插入图片描述
点击下方连接打开页面
在这里插入图片描述
在这里插入图片描述
4、还可以配置网址路径
在这里插入图片描述
5、为避免每次都要打开右侧Maven点击tomcat7的run插件,可以做如下配置:
在这里插入图片描述
在这里插入图片描述
6、pom中各标签作用意思

<?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/maven-v4_0_0.xsd">
  <!--指定pom的模型版本-->
  <modelVersion>4.0.0</modelVersion>
  <!--打包方式,web工程打包为war,java工程打包为jar-->
  <packaging>war</packaging>

  <!--组织id-->
  <groupId>com.itheima</groupId>
  <!--项目id-->
  <artifactId>web01</artifactId>
  <!--版本号:release完成版,snapshot开发版-->
  <version>1.0-SNAPSHOT</version>

  <!--设置当前工程的所有依赖-->
  <dependencies>
<!--    具体的依赖-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <!--如何添加插件-->
  <!--构建-->
  <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>
</project>

6 依赖管理

6.1 项目搭建

1、创建三个maven模块,project1,project2,project3,分别添加log4j的依赖,版本号依次为2.13.0,2.13.1,1.2.12,项目结构如下:
在这里插入图片描述

2、各个模块的maven依赖如下:
在这里插入图片描述

6.2 依赖配置

  • 依赖:指当前项目运行所需的jar,一个项目可以设置多个依赖
  • 格式:
<!-- 设置当前项目所依赖的所有jar --> 
<dependencies> 
    <!-- 设置具体的依赖 --> 
    <dependency> 
        <!-- 依赖所属群组id --> 
        <groupId>junit</groupId> 
        <!-- 依赖所属项目id --> 
        <artifactId>junit</artifactId> 
        <!-- 版本号 --> 
        <version>4.12</version>
    </dependency>
</dependencies>

6.3 依赖传递

6.3.1 概念

  • 直接依赖:在当前项目中通过依赖配置建立的依赖关系
  • 间接依赖:被依赖的资源如果依赖其他资源,则当前项目间接依赖其他资源
    在这里插入图片描述
    比如项目2用到项目3(将项目3的地址,放置在项目2的依赖中),项目2,依赖,项目3依赖的jar包
    在这里插入图片描述

6.3.2 依赖传递的冲突问题

  • 路径优先:当依赖中出现相同的资源,层级越深,优先级越低,反之越高
  • 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖靠后的,即两个1度资源中的2度资源分别存在相同的依赖,则看1度资源谁在先,谁先用谁。
  • 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的,即pom.xml中配置两个不同版本的junit,后写的覆盖前面写的。
    在这里插入图片描述

示例

1、project2依赖project3:

<!-- project2的pom -->
<dependency>
    <groupId>com.hongyi</groupId>
    <artifactId>project3</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

2、在project3中添加junit的依赖

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

3、查看此时的依赖关系
在这里插入图片描述
对当前项目project2而言,project3和log4j:2.13.1为1度依赖,而project3的log4j:2.13.2为2度依赖,因此被忽略(omitted)

6.3.3 可选依赖

可选依赖是指对外隐藏当前所依赖的资源,即不透明性。配置是在被依赖方。
可选依赖用来控制当前依赖是否向下传递成为间接依赖;
optional 默认值为 false,表示可以向下传递称为间接依赖;
若 optional 元素取值为 true,则表示当前依赖不能向下传递成为间接依赖。

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <!-- 添加这一选项,并设为true -->
    <optional>true</optional>
</dependency>

在这里插入图片描述
发现该依赖被隐藏了。

6.3.4 排除依赖

排除依赖是主动断开依赖的资源,被排除的资源不需要指定版本。配置是在依赖方。

例如project2要排除掉project3中的依赖log4j:2.13.2(虽然根据依赖冲突的解决也没有生效)。在project2的pom文件中添加:

<!-- 要排除掉project3中的log4j依赖 -->
<dependency>
    <groupId>com.hongyi</groupId>
    <artifactId>project3</artifactId>
    <version>1.0-SNAPSHOT</version>
    <exclusions>
        <exclusion>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>

执行结果:
在这里插入图片描述
发现project2中没有了log4j:2.13.2的依赖。只剩下junit的依赖

6.4 依赖范围

6.4.1 概述

依赖的jar默认情况可以在任何地方使用,可以通过scope标签设定其作用范围

  • 作用范围

主程序范围有效(main文件范围内)
测试程序范围有效(test文件范围内)
是否参与打包(package指令范围内)

在这里插入图片描述

示例

例如在project2中新增依赖:

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.9</version>
    <scope>test</scope>
</dependency>

执行结果:
在这里插入图片描述
通过这里可以知道这个jar包可以在哪用

6.4.2 依赖范围传递性

带有依赖范围的资源在进行传递时,作用范围将受到影响。
以间接依赖是否能打包,即runtime为主,判断范围是否受影响。只有能打包才能被用。
(如项目1依赖项目2,项目2范围必须能被打包,项目1中才能出现,且项目1中项目2依赖的范围,变成项目1的范围)
在这里插入图片描述

7 生命周期与插件

7.1 项目构建生命周期

Maven构建生命周期描述的是一次构建过程经历了多少个事件
在这里插入图片描述
Maven对项目构建的生命周期划分为3套:

  • clean:清理工作
  • default:核心工作,例如编译,测试,打包,部署等
  • site:产生报告,发布站点

clean生命周期

  • pre-clean:执行一些需要在clean之前完成的工作
  • clean:移除所有上一次构建生成的文件
  • post-clean:执行一些需要在clean之后立刻完成的工作

default构建生命周期

在这里插入图片描述
说明:图中标红的是Maven典型(常用)的构建生命周期点。

例如当执行mvn compile命令时,会从头(mvn validate)开始执行命令至mvn compile初。

又如执行mvn package命令时,也会从头开始执行,直到mvn package命令处停止。

site构建生命周期

在这里插入图片描述
在这里插入图片描述

7.2 插件

  • 插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能
  • 默认maven在各个生命周期上绑定有预设的功能
  • 通过插件可以自定义其他功能

在官网中可以查阅到各种插件:
在这里插入图片描述
理解:生命周期相当于人活到了几岁,而插件相当于在几岁时需要做哪些事情。

演示示例——自定义插件

1、项目搭建:在project3中的主类和测试类中分别创建Demo.java和DemoTest.java

public class Demo {
    public void run() {
        System.out.println("source code plugin...");
    }
}
public class DemoTest {
    public void test() {
        System.out.println("test source code plugin...");
    }
}

2、自定义插件写在标签中。在project3的pom文件中写入:

<build>
    <plugins>
        <plugin>
            <!-- 自定义插件所需的坐标 -->
            <!-- 这个插件的功能是生成项目的java源码 -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>3.2.1</version>
            <!-- 定义在哪个生命周期点执行,可定义多个生命周期点execution -->
            <executions>
                <execution>
                    <!-- 定义在什么范围类使得插件生效,可定义多个范围goal -->
                    <goals>
                        <!-- 定义在什么范围类使得插件生效 -->
                        <!-- jar表示在main主代码中生效,打源码包 -->
                        <!-- test-jar表示在test测试代码中生效,打源码包 -->
                        <goal>jar</goal>
                    </goals>
                    <!-- 在哪个生命周期点执行,此处为generate-test-resources -->
                    <phase>generate-test-resources</phase>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

在这里插入图片描述
此处演示在generate-test-resources处自定义了一个插件,该插件生成项目的源码文件。意味着,例如执行mvn test时,会执行到该插件。执行mvn compile时,不会执行到该插件。而且该插件只会生成main中的源代码。
1、刷新maven后,可看到该插件:
在这里插入图片描述

2、执行mvn compile,发现target并没有生成源码文件
在这里插入图片描述
3、执行mvn test,发现生成了源码文件
在这里插入图片描述
打开文件,发现是main的源码:
在这里插入图片描述
1、添加一个goal为test-jar。首先执行clean,再执行package:
在这里插入图片描述
发现有打包好的工程文件、main源码和test源码。
在这里插入图片描述
以下为Maven高级部分

8 分模块开发与设计

8.1 目标

目标:将ssm项目拆分。
在这里插入图片描述
如上图所示,将ssm项目拆分成右侧几个模块。

8.2 ssm-pojo拆分

1、新建一个maven项目模块
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2、拷贝原始项目中对应的相关代码到该模块中,删除不必要的测试类和配置文件
在这里插入图片描述
这个模块的pom没有依赖任何资源

<?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>com.itheima</groupId>
    <artifactId>ssm_pojo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>9</maven.compiler.source>
        <maven.compiler.target>9</maven.compiler.target>
    </properties>

</project>

8.3 ssm_dao拆分

1、新建模块ssm_dao,拷贝原始项目中对应的相关代码到该模块中,删除不必要的测试类和非dao层的配置文件。
在这里插入图片描述
2、对于dao层的pom文件内容如下(即所需的资源):注意ssm_pojo资源的导入

<dependencies>
    <!--导入资源文件pojo-->
    <dependency>
        <groupId>com.itheima</groupId>
        <artifactId>ssm_pojo</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <!--spring环境-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.1.9.RELEASE</version>
    </dependency>
    <!--mybatis环境-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.3</version>
    </dependency>
    <!--mysql环境-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>
    <!--spring整合jdbc-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.1.9.RELEASE</version>
    </dependency>
    <!--spring整合mybatis-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.3</version>
    </dependency>
    <!--druid连接池-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.16</version>
    </dependency>
    <!--分页插件坐标-->
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper</artifactId>
        <version>5.1.2</version>
    </dependency>
</dependencies>

3、运行mvn compile发现构建失败:
在这里插入图片描述
原因在于,导入了ssm_pojo的资源坐标,但是在本地仓库中没有这个资源,因此需要对ssm_pojo项目进行mvn install,将其安装到本地仓库:
在这里插入图片描述
然后再对ssm_dao进行编译,通过。
在这里插入图片描述
4、对dao的配置文件applicationContext.xml进行修改,删去非dao层的代码:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <!--开启bean注解扫描-->
    <context:component-scan base-package="com.itheima"/>
    <!--加载properties文件-->
    <context:property-placeholder location="classpath*:jdbc.properties"/>
    <!--数据源-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>
    <!--整合mybatis到spring中-->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="typeAliasesPackage" value="com.itheima.domain"/>
        <!--分页插件-->
        <property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <props>
                            <prop key="helperDialect">mysql</prop>
                            <prop key="reasonable">true</prop>
                        </props>
                    </property>
                </bean>
            </array>
        </property>
    </bean>
    <!--映射扫描-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.itheima.dao"/>
    </bean>
</beans>

8.4 ssm_service拆分

1、新建模块ssm_service,拷贝原始项目中对应的相关代码到该模块中,删除不必要的非service层的配置文件。注意保留测试类test。
在这里插入图片描述
2、对于service层的pom文件内容如下(即所需的资源):注意ssm_dao资源的导入,此外无需导入ssm_pojo的资源,因为他间接依赖了ssm_dao的ssm_pojo资源。对ssm_dao进行install命令。

<dependencies>
    <!--导入ssm_dao的资源-->
    <dependency>
        <groupId>com.itheima</groupId>
        <artifactId>ssm_dao</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <!--spring环境-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.1.9.RELEASE</version>
    </dependency>
    <!--junit单元测试-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    <!--spring整合junit-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>5.1.9.RELEASE</version>
    </dependency>
</dependencies>

3、对ssm_service的配置文件applicationContext.xml进行修改,删去非service层的代码,此外将其修改为applicationContext-service.xml。同理将ssm_dao的配置文件名修改为applicationContext-dao.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!--开启bean注解扫描-->
    <context:component-scan base-package="com.itheima"/>

    <!--开启注解式事务-->
    <tx:annotation-driven transaction-manager="txManager"/>

    <!--事务管理器-->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

</beans>

4、修改单元测试引入的配置文件名,由单个文件修改为多个文件:

@RunWith(SpringJUnit4ClassRunner.class)
// 修改这里:要引入dao层的配置文件
@ContextConfiguration(locations = {"classpath:applicationContext-service.xml", "classpath:applicationContext-dao.xml"})
public class UserServiceTest {

    @Autowired
    private UserService userService;

    @Test
    public void testSave(){
        User user = new User();
        user.setUserName("Jock");
        user.setPassword("root");
        user.setRealName("Jockme");
        user.setGender(1);
        user.setBirthday(new Date(333333000000L));

        userService.save(user);
    }

    @Test
    public void testDelete(){
        User user = new User();
        userService.delete(2);
    }

    @Test
    public void testUpdate(){
        User user = new User();
        user.setUuid(1);
        user.setUserName("Jockme");
        user.setPassword("root");
        user.setRealName("JockIsMe");
        user.setGender(1);
        user.setBirthday(new Date(333333000000L));

        userService.update(user);
    }

    @Test
    public void testGet(){
        User user = userService.get(1);
        System.out.println(user);
    }

    @Test
    public void testGetAll(){
        PageInfo<User> all = userService.getAll(2, 2);
        System.out.println(all);
        System.out.println(all.getList().get(0));
        System.out.println(all.getList().get(1));
    }

    @Test
    public void testLogin(){
        User user = userService.login("Jockme", "root");
        System.out.println(user);
    }
}

5、运行mvn test进行用例测试,通过。最后执行mvn install,将service层代码安装到本地仓库中。
在这里插入图片描述

8.5 ssm_controller拆分

1、利用骨架webapp新建maven模块ssm_controller。拷贝原始项目中对应的相关代码到该模块中,删除不必要的非controller层的配置文件。
在这里插入图片描述
2、对于controller层的pom文件内容如下(即所需的资源):注意ssm_service资源的导入和间接依赖:

<dependencies>
  <!--导入ssm_service的资源-->
  <dependency>
    <groupId>com.itheima</groupId>
    <artifactId>ssm_service</artifactId>
    <version>1.0-SNAPSHOT</version>
  </dependency>

  <!--springmvc环境-->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.1.9.RELEASE</version>
  </dependency>
  <!--jackson相关坐标3个-->
  <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.0</version>
  </dependency>
  <!--servlet环境-->
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
  </dependency>
</dependencies>

<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>

3、修改web.xml中的加载spring环境的配置文件(dao层和service层),使用*进行通配

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath*:applicationContext-*.xml</param-value>
</context-param>

4、配置tomcat服务器并使用postman测试:
http://localhost:8080/user?userName=Mark&password=123456&realName=Hongyi&gender=1&birthday=2022/01/06
在这里插入图片描述
数据库中:
在这里插入图片描述

8.6 小结

分模块开发:

  • 模块中仅包含当前模块对应的功能类与配置文件
  • spring核心配置根据模块功能不同进行独立制作
  • 当前模块所依赖的模块通过导入坐标的形式加入当前模块后才可以使用
  • web.xml需要加载所有的spring核心配置文件

9 聚合和继承

9.1 聚合

聚合:多模块的构建维护。
在这里插入图片描述

  • 聚合作用:聚合用于快速构建maven工程,一次性构建多个项目或模块

示例

1、创建一个空模块ssm,该项目中只有一个pom文件
在这里插入图片描述
2、打包类型定义为pom,并定义当前模块进行构建时关联的其他模块名称

<!--定义该工程,用于进行构建管理-->
<packaging>pom</packaging>

<!--管理的工程列表-->
<modules>
    <module>../ssm_dao</module>
    <module>../ssm_pojo</module>
    <module>../ssm_controller</module>
    <module>../ssm_service</module>
</modules>

注意:当前参与聚合操作的模块最终执行顺序与模块间的依赖关系有关,与配置顺序无关。如果当前模块间没有依赖关系,则与配置顺序无关。
在这里插入图片描述
3、执行mvn install并观察:

  • 各个模块的打包方式和打包顺序

在这里插入图片描述

  • 打包耗时

在这里插入图片描述

9.2 继承

9.2.1 概述和示例

继承:模块依赖关系维护。
在这里插入图片描述

  • 继承作用:通过继承可以实现在子工程中沿用父工程的配置
  • maven中的继承与java中的继承相似,在子工程中配置继承关系

示例

1、在父工程ssm中声明依赖管理,将子工程所有的依赖都声明在此处。利用标签

<!--声明此处进行依赖管理-->
<dependencyManagement>
    <!--具体的依赖-->
    <dependencies>
        <!--添加自己工程的依赖-->
        <dependency>
            <groupId>com.itheima</groupId>
            <artifactId>ssm_pojo</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.itheima</groupId>
            <artifactId>ssm_dao</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.itheima</groupId>
            <artifactId>ssm_service</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--springmvc环境-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>
        <!--jackson相关坐标3个-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.0</version>
        </dependency>
        <!--只展示了部分依赖-->
    </dependencies>
</dependencyManagement>

2、在子工程中定义父工程

<!--定义该工程的父工程-->
<parent>
    <!--父工程的名字-->
    <artifactId>ssm</artifactId>
    <groupId>com.itheima</groupId>
    <version>1.0-SNAPSHOT</version>
    <!--父工程的pom文件-->
    <relativePath>../ssm/pom.xml</relativePath>
</parent>

3、此时,子工程的依赖的版本号可以省略,例如:

<!--导入资源文件pojo-->
<dependency>
    <groupId>com.itheima</groupId>
    <artifactId>ssm_pojo</artifactId>
</dependency>

4、同理,插件的管理也可以在父工程中声明:

<build>
    <pluginManagement>
        <!--设置插件-->
        <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>
    </pluginManagement>
</build>

5、子工程中插件的版本和相关配置就可以省略

<build>
  <!--设置插件-->
  <plugins>
    <!--具体的插件配置-->
    <plugin>
      <groupId>org.apache.tomcat.maven</groupId>
      <artifactId>tomcat7-maven-plugin</artifactId>
    </plugin>
  </plugins>
</build>

9.2.2 继承的资源

以下资源,子工程都可以从父工程中继承:
在这里插入图片描述

9.2.3 继承和聚合的区别

  • 作用:
    聚合用于快速构建项目
    继承用于快速配置

  • 相同点:
    聚合与继承的pom.xml文件打包方式均为pom,可以将两种关系制作到同一个pom文件中
    聚合与继承均属于设计型模块,并无实际的模块内容

  • 不同点:
    聚合是在当前模块中配置关系,聚合可以感知到参与聚合的模块有哪些
    继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己

9.3 属性

9.3.1 自定义属性

  • 作用:等同于定义变量,方便统一维护
  • 配置位置:父工程的pom文件
  • 标签:
  • 调用格式:${ }

示例

1、在父工程中的pom文件内:

<!--定义自定义的属性-->
<properties>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
    <!--定义自定义的属性-->
    <spring.version>5.1.9.RELEASE</spring.version>
    <junit.version>4.12</junit.version>
</properties>

2、调用:

<!--springmvc环境-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
</dependency>

9.3.2 内置属性

  • 作用:使用maven内置属性,快速配置

例如,父工程和子工程的版本号一样,可以直接使用父工程的版本内置属性${version}:

<!--添加自己工程的依赖-->
<dependency>
    <groupId>com.itheima</groupId>
    <artifactId>ssm_pojo</artifactId>
    <version>${version}</version>
</dependency>
<dependency>
    <groupId>com.itheima</groupId>
    <artifactId>ssm_dao</artifactId>
    <version>${version}</version>
</dependency>
<dependency>
    <groupId>com.itheima</groupId>
    <artifactId>ssm_service</artifactId>
    <version>${version}</version>
</dependency>

9.3.3 其他属性

其他的属性类别还有Setting属性、Java系统属性、环境变量属性,了解即可。

9.4 版本管理

9.4.1 工程版本区分

在这里插入图片描述

  • SNAPSHOT快照版本

    项目开发过程中,为方便团队成员合作,解决模块间相互依赖和时时更新的问题,开发者对每个模块进行构建的时候,输出的临时性版本叫快照版本(测试阶段版本)
    快照版本会随着开发的进展不断更新

  • RELEASE发布版本

    项目开发到进入阶段里程碑后,向团队外部发布较为稳定的版本,这种版本所对应的构件文件是稳定的,即便进行功能的后续开发,也不会改变当前发布版本内容,这种版本称为发布版本

9.4.2 工程版本号约定

  • 约定规范:
    <主版本>.<次版本>.<增量版本>.<里程碑版本>
    主版本∶表示项目重大架构的变更,如∶spring5相较于spring4的迭代次版本∶表示有较大的功能增加和变化,或者全面系统地修复漏洞
    增量版本∶表示有重大漏洞的修复
    里程碑版本∶表明一个版本的里程碑(版本内部)。这样的版本同下一个正式版本相比,相对来说不是很稳定,有待更多的测试

  • 范例:
    5.1.9.RELEASE

9.5 资源配置

资源配置多文件维护:
在这里插入图片描述

配置文件引用pom属性:

  • 作用:在任意配置文件中加载pom文件中定义的属性

  • 调用格式:${ }

示例

1、例如jdbc.properties要读取父工程pom文件中的属性。首先在父工程pom文件中的标签中:

<bulid>
    <!--配置资源文件对应的信息-->
    <resources>
        <resource>
            <!--各个项目下所有的资源路径的目录-->
            <directory>${project.basedir}/src/main/resources</directory>
            <!--开启对配置文件的资源加载过滤-->
            <filtering>true</filtering>
        </resource>
    </resources>

    <!--针对test目录下的配置资源文件对应的信息-->
    <testResources>
        <testResource>
            <!--各个项目下所有的资源路径的目录-->
            <directory>${project.basedir}/src/test/resources</directory>
            <!--开启对配置文件的资源加载过滤-->
            <filtering>true</filtering>
        </testResource>
    </testResources>
</bulid>

设置属性:

<!--定义自定义的属性-->
<properties>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
    <spring.version>5.1.9.RELEASE</spring.version>
    <junit.version>4.12</junit.version>
    <jdbc.url>jdbc:mysql://127.0.0.1:3306/ssm_db?useSSL=false</jdbc.url>
</properties>

2、jdbc.properties内容:

jdbc.driver=com.mysql.jdbc.Driver
# 引用pom文件中的属性
jdbc.url=${jdbc.url}
jdbc.username=root
jdbc.password=12345678

9.6 多环境开发配置

多环境兼容:
在这里插入图片描述

配置方法

1、在父工程pom文件中:

<!--创建多环境-->
<profiles>
    <!--定义具体的环境:生产环境-->
    <profile>
        <!--定义环境对应的唯一名称-->
        <id>pro_env</id>
        <!--定义环境中使用的属性值-->
        <properties>
            <jdbc.url>jdbc:mysql://127.0.0.1:3306/ssm_db?useSSL=false</jdbc.url>
        </properties>
    </profile>
    <!--定义具体的环境:开发环境-->
    <profile>
        <!--定义环境对应的唯一名称-->
        <id>dev_env</id>
        <!--定义环境中使用的属性值-->
        <properties>
            <jdbc.url>jdbc:mysql://127.0.0.2:3306/ssm_db?useSSL=false</jdbc.url>
        </properties>
        <!--设置默认启动-->
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
</profiles>

2、加载指定的环境

  • 调用格式:
mvn 指令 -P 环境id
  • 范例:
mvn install -P dev_env

例如:新建一个maven配置,在开发环境执行install命令:
在这里插入图片描述

执行后查看jdbc.properties文件:
在这里插入图片描述
可见是按照开发环境的地址127.0.0.2进行项目安装的。

9.7 跳过测试

应用场景

  1. 整体模块功能未开发
  2. 模块中某个功能未开发完毕
  3. 单个功能更新调试导致其他功能失败
  4. 快速打包(因为测试需要耗费时间)

使用操作界面跳过测试

在这里插入图片描述

10 Maven私服

分模块合作开发:
在这里插入图片描述

10.1 Nexus私服搭建

  • Nexus是Sonatype公司的一款maven私服产品
  • 下载地址∶https∶//help.sonatype.com/repomanager3/download

搭建步骤

1、服务器首先必须配置好java的环境
2、将下载好的压缩包解压缩至任意位置
在这里插入图片描述

  • nexus服务所需内存等参数位于/bin/nexus.vmoptions中

在这里插入图片描述
在这里插入图片描述

  • nexus服务的端口等参数设置位于/etc/nexus-default.properties中

在这里插入图片描述
在这里插入图片描述
1、配置环境变量并刷新

vi /etc/profile
export NEXUS_HOME=/usr/local/nexus #nexus的目录
export RUN_AS_USER=root
source /etc/profile

2、进入nexus目录并运行

./bin/nexus start

3、访问配置好的端口网址即可
在这里插入图片描述
停止服务运行

./bin/nexus stop

10.2 Nexus操作

10.2.1 仓库分类和手工资源上传

私服资源的获取:下图所示,我们要把快照版的资源放在一个仓库里,把发行版的资源放在一个仓库里,第三方公共资源放在一个仓库里,这样方便进行管理,势必要对仓库进行分类和分组。
在这里插入图片描述

仓库分类

  • 宿主仓库hosted:保存无法从中央仓库获取的资源
    自主研发
    第三方非开源项目

  • 代理仓库proxy:代理远程仓库,通过nexus访问其他公共仓库,例如中央仓库

  • 仓库组group:
    将若干仓库组成一个群组,简化配置
    仓库组不能保存资源,属于设计型仓库
    在这里插入图片描述

操作实例

1、新建一个仓库,例如heima-release
在这里插入图片描述
2、仓库类型选择宿主仓库maven2(hosted)
在这里插入图片描述
3、创建好后,将其加入到maven-public仓库组中,方便管理
在这里插入图片描述
4、将ssm_pojo打包好的jar文件上传至heima-release仓库中
在这里插入图片描述
5、查看仓库里的ssm_pojo资源
在这里插入图片描述

10.2.2 本地仓库访问私服

idea环境中的资源上传与下载:
在这里插入图片描述
1、配置本地仓库访问私服的权限(setting.xml)

<!--让本地仓库能够访问搭建的私服的远程仓库-->
<server>
    <!--宿主仓库id-->
    <id>heima-release</id>
    <username>admin</username>
    <password>XXXXXXXXX</password>
</server>
<server>
    <id>heima-snapshot</id>
    <username>admin</username>
    <password>XXXXXXXXX</password>
</server>

2、配置本地仓库资源的下载来源

<!--中央仓库的资源从阿里云下载-->
<mirror>
    <id>nexus-aliyun</id>    
    <name>nexus-aliyun</name>  
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>    
    <mirrorOf>central</mirrorOf> 
</mirror>

<!--其他的从私服下载-->
<mirror>
    <id>heima</id>
    <!--url为maven-public仓库组的url-->
    <url>XXXXXXXXXXXX</url>
    <mirrorOf>*</mirrorOf> 
</mirror>

3、配置当前项目ssm访问私服上传资源的保存位置(pom.xml)

<!--发布配置管理-->
<distributionManagement>
    <repository>
        <!--发布到发行版的仓库,注意这里的id必须和setting.xml配置的id相同-->
        <id>heima-release</id>
        <!--发行版仓库的url-->
        <url>http://XXXXXXX/repository/heima-release/</url>
    </repository>
    <snapshotRepository>
        <!--发布到快照版的仓库-->
        <id>heima-snapshot</id>
        <!--快照版仓库的url-->
        <url>http://XXXXXXX/repository/heima-snapshot/</url>
    </snapshotRepository>
</distributionManagement>

4、执行命令

mvn deploy

在这里插入图片描述

5、执行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值