Maven学习笔记

这里写目录标题

  • 1 Maven简介
    • 1.1 传统项目管理状态分析
    • 1.2 Maven是什么
    • 1.3 Maven的作用
  • 2 下载与安装
  • 3 Maven基础概念
    • 3.1 仓库
    • 3.2 坐标
    • 3.3 仓库配置
      • 3.3.1 本地仓库配置
      • 3.3.2 远程仓库配置
  • 4 手工制作Maven项目
    • 4.1 项目结构搭建
    • 4.2 项目构建
      • 4.3 插件创建Maven工程
    • 4.4 Maven工程目录
  • 5 IDEA生成Maven项目
    • 5.1 创建空Maven项目
    • 5.2 使用骨架创建Maven项目
    • 5.3 使用骨架创建Maven中的web项目
    • 5.4 Tomcat插件安装和Web工程启动 (IDEA开发工具maven项目通过tomcat7插件远程部署项目)
  • 6 依赖管理
    • 6.1 项目搭建
    • 6.2 依赖配置
    • 6.3 依赖传递
      • 6.3.1 概念
      • 6.3.2 依赖传递的冲突问题
      • 6.3.3 可选依赖
      • 6.3.4 排除依赖
    • 6.4 依赖范围
      • 6.4.1 概述
      • 6.4.2 依赖范围传递性
  • 7 生命周期与插件
    • 7.1 项目构建生命周期
    • 7.2 插件
  • 8 分模块开发与设计
    • 8.1 目标
    • 8.2 ssm-pojo拆分
    • 8.3 ssm_dao拆分
    • 8.4 ssm_service拆分
    • 8.5 ssm_controller拆分
    • 8.6 小结
  • 9 聚合和继承
    • 9.1 聚合
    • 9.2 继承
      • 9.2.1 概述和示例
      • 9.2.2 继承的资源
      • 9.2.3 继承和聚合的区别
    • 9.3 属性
      • 9.3.1 自定义属性
    • 9.3.2 内置属性
      • 9.3.3 其他属性
    • 9.4 版本管理
      • 9.4.1 工程版本区分
      • 9.4.2 工程版本号约定
    • 9.5 资源配置
    • 9.6 多环境开发配置
    • 9.7 跳过测试
  • 10 Maven私服
    • 10.1 Nexus私服搭建
    • 10.2 Nexus操作
      • 10.2.1 仓库分类和手工资源上传
      • 10.2.2 本地仓库访问私服

1 Maven简介

1.1 传统项目管理状态分析

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

Maven学习笔记_第1张图片

1.2 Maven是什么

  • maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)
  • POM(Project Object Model):项目对象模型
    Maven学习笔记_第2张图片

1.3 Maven的作用

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

2 下载与安装

  • 官网:http://maven.apache.org/
    1、将下载好的文件解压缩,我的是放在C:\Program Files\apache-maven-3.6.3下
    Maven学习笔记_第4张图片

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

2、配置环境变量:
在这里插入图片描述
Maven学习笔记_第5张图片
3、在cmd查看是否配置成功:

mvn -v

在这里插入图片描述

3 Maven基础概念

3.1 仓库

  • 仓库:用于存储资源,包含各种jar包
    Maven学习笔记_第6张图片

仓库分类

  • 本地仓库:自己电脑上存储资源的仓库,连接远程仓库获取资源
  • 远程仓库:包括私服和中央仓库,即非本机电脑上的仓库,为本地仓库提供资源
  • 中央仓库: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.clientgroupId>
    <artifactId>elasticsearch-rest-high-level-clientartifactId>
    <version>7.12.1version>
dependency>
  • 作用:使用唯一标识,唯一性地定位资源位置,通过该标识可以将资源的识别与下载工作交由机器完成

3.3 仓库配置

3.3.1 本地仓库配置

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

  • 默认位置:
    Maven学习笔记_第7张图片

其中的默认位置就是:

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

Maven学习笔记_第8张图片
可以自定义本地仓库的位置,将上述代码修改为:
Maven学习笔记_第9张图片

3.3.2 远程仓库配置

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

<repositories> 
    <repository> 
        <id>centralid> 
        <name>Central Repositoryname> 
        <url>https://repo.maven.apache.org/maven2url> 
        <layout>defaultlayout> 
        <snapshots> 
            <enabled>falseenabled>
        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-aliyunid> 
         
        <mirrorOf>centralmirrorOf>
         
        <name>Nexus aliyunname>
         
        <url>http://maven.aliyun.com/nexus/content/groups/publicurl>
    mirror>
mirrors>

4 手工制作Maven项目

4.1 项目结构搭建

Maven工程目录结构

Maven学习笔记_第13张图片
后面自己创建项目的样例:
Maven学习笔记_第14张图片

代码

在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开头,后面添加功能参数,可以一次执行多个命令,使用空格分隔
Maven学习笔记_第15张图片

使用示例

mvn compile

Maven学习笔记_第16张图片
如果jdk版本指定过低,会报以下错误:
Maven学习笔记_第17张图片
1、此时查看本地仓库,会有下载好的资源
Maven学习笔记_第18张图片
2、此时,在项目根目录中也会有编译完成的项目target:存放运行结果的
Maven学习笔记_第19张图片
3、执行clean命令,会清除target目录

mvn clean

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

mvn test

Maven学习笔记_第20张图片
测试报告:
Maven学习笔记_第21张图片
5、执行package命令,会将源程序编译并打包

mvn package

Maven学习笔记_第22张图片
注意:打包命令包含了编译和测试两个命令。

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

mvn install

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

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就是项目名
Maven学习笔记_第26张图片
2、其中pom.xml自带junit配置
在这里插入图片描述
3、maven项目缺少resources文件
Maven学习笔记_第27张图片

4.4 Maven工程目录

Maven学习笔记_第28张图片

5 IDEA生成Maven项目

5.1 创建空Maven项目

1、新建一个空的工程,然后选择jdk版本
Maven学习笔记_第29张图片Maven学习笔记_第30张图片
Maven学习笔记_第31张图片

2、打开setting,搜索maven并进行相关配置:
Maven学习笔记_第32张图片
3、打开setting structure新建模块module:
Maven学习笔记_第33张图片
Maven学习笔记_第34张图片

Maven学习笔记_第35张图片
4、然后标记各个目录的功能(如果颜色是灰色手动选择文件类型,缺少resources则在文件夹右键添加):
Maven学习笔记_第36张图片

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

6、在idea右侧有maven相关的操作:
Maven学习笔记_第38张图片
与mvn的各种命令相同,不再赘述。

7、除了以上方法外,还可以配置Maven运行,达到以上效果
在这里插入图片描述
编译
Maven学习笔记_第39张图片
清理
Maven学习笔记_第40张图片

5.2 使用骨架创建Maven项目

1、新建一个模块。选择骨架创建maven项目,这里选择quick-start
Maven学习笔记_第41张图片
2、项目结构如下:
Maven学习笔记_第42张图片
3、按照maven项目的经典结构进行改造,改造后的结果如下:
Maven学习笔记_第43张图片

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

1、新建一个模块。选择骨架创建maven的web项目,这里选择webapp
Maven学习笔记_第44张图片
2、项目结构如下:
Maven学习笔记_第45张图片
3、按照maven项目的经典结构进行改造,改造后的结果如下:
Maven学习笔记_第46张图片
4、在webapp下添加index.jsp
Maven学习笔记_第47张图片

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

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


<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">
  
  <modelVersion>4.0.0modelVersion>
  
  <packaging>warpackaging>

  
  <groupId>com.itheimagroupId>
  
  <artifactId>web01artifactId>
  
  <version>1.0-SNAPSHOTversion>

  
  <dependencies>

    <dependency>
      <groupId>junitgroupId>
      <artifactId>junitartifactId>
      <version>4.12version>
      <scope>testscope>
    dependency>
  dependencies>

  
  
  <build>
    
    <plugins>
      
      <plugin>
        <groupId>org.apache.tomcat.mavengroupId>
        <artifactId>tomcat7-maven-pluginartifactId>
        <version>2.1version>
        
        <configuration>
          <port>80port>
          <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,项目结构如下:
Maven学习笔记_第59张图片

2、各个模块的maven依赖如下:
Maven学习笔记_第60张图片

6.2 依赖配置

  • 依赖:指当前项目运行所需的jar,一个项目可以设置多个依赖
  • 格式:
 
<dependencies> 
     
    <dependency> 
         
        <groupId>junitgroupId> 
         
        <artifactId>junitartifactId> 
         
        <version>4.12version>
    dependency>
dependencies>

6.3 依赖传递

6.3.1 概念

  • 直接依赖:在当前项目中通过依赖配置建立的依赖关系
  • 间接依赖:被依赖的资源如果依赖其他资源,则当前项目间接依赖其他资源
    Maven学习笔记_第61张图片
    比如项目2用到项目3(将项目3的地址,放置在项目2的依赖中),项目2,依赖,项目3依赖的jar包
    Maven学习笔记_第62张图片

6.3.2 依赖传递的冲突问题

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

示例

1、project2依赖project3:


<dependency>
    <groupId>com.hongyigroupId>
    <artifactId>project3artifactId>
    <version>1.0-SNAPSHOTversion>
dependency>

2、在project3中添加junit的依赖

<dependency>
    <groupId>junitgroupId>
    <artifactId>junitartifactId>
    <version>4.12version>
dependency>

3、查看此时的依赖关系
Maven学习笔记_第64张图片
对当前项目project2而言,project3和log4j:2.13.1为1度依赖,而project3的log4j:2.13.2为2度依赖,因此被忽略(omitted)

6.3.3 可选依赖

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

<dependency>
    <groupId>junitgroupId>
    <artifactId>junitartifactId>
    <version>4.12version>
    
    <optional>trueoptional>
dependency>

Maven学习笔记_第65张图片
发现该依赖被隐藏了。

6.3.4 排除依赖

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

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


<dependency>
    <groupId>com.hongyigroupId>
    <artifactId>project3artifactId>
    <version>1.0-SNAPSHOTversion>
    <exclusions>
        <exclusion>
            <groupId>org.apache.logging.log4jgroupId>
            <artifactId>log4j-coreartifactId>
        exclusion>
    exclusions>
dependency>

执行结果:
Maven学习笔记_第66张图片
发现project2中没有了log4j:2.13.2的依赖。只剩下junit的依赖

6.4 依赖范围

6.4.1 概述

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

  • 作用范围

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

Maven学习笔记_第67张图片

示例

例如在project2中新增依赖:

<dependency>
    <groupId>org.mybatisgroupId>
    <artifactId>mybatisartifactId>
    <version>3.5.9version>
    <scope>testscope>
dependency>

执行结果:
Maven学习笔记_第68张图片
通过这里可以知道这个jar包可以在哪用

6.4.2 依赖范围传递性

带有依赖范围的资源在进行传递时,作用范围将受到影响。
以间接依赖是否能打包,即runtime为主,判断范围是否受影响。只有能打包才能被用。
(如项目1依赖项目2,项目2范围必须能被打包,项目1中才能出现,且项目1中项目2依赖的范围,变成项目1的范围)
Maven学习笔记_第69张图片

7 生命周期与插件

7.1 项目构建生命周期

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

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

clean生命周期

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

default构建生命周期

Maven学习笔记_第70张图片
说明:图中标红的是Maven典型(常用)的构建生命周期点。

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

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

site构建生命周期

Maven学习笔记_第71张图片
Maven学习笔记_第72张图片

7.2 插件

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

在官网中可以查阅到各种插件:
Maven学习笔记_第73张图片
理解:生命周期相当于人活到了几岁,而插件相当于在几岁时需要做哪些事情。

演示示例——自定义插件

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>
            
            
            <groupId>org.apache.maven.pluginsgroupId>
            <artifactId>maven-source-pluginartifactId>
            <version>3.2.1version>
            
            <executions>
                <execution>
                    
                    <goals>
                        
                        
                        
                        <goal>jargoal>
                    goals>
                    
                    <phase>generate-test-resourcesphase>
                execution>
            executions>
        plugin>
    plugins>
build>

Maven学习笔记_第74张图片
此处演示在generate-test-resources处自定义了一个插件,该插件生成项目的源码文件。意味着,例如执行mvn test时,会执行到该插件。执行mvn compile时,不会执行到该插件。而且该插件只会生成main中的源代码。
1、刷新maven后,可看到该插件:
Maven学习笔记_第75张图片

2、执行mvn compile,发现target并没有生成源码文件
Maven学习笔记_第76张图片
3、执行mvn test,发现生成了源码文件
Maven学习笔记_第77张图片
打开文件,发现是main的源码:
Maven学习笔记_第78张图片
1、添加一个goal为test-jar。首先执行clean,再执行package:
Maven学习笔记_第79张图片
发现有打包好的工程文件、main源码和test源码。
Maven学习笔记_第80张图片
以下为Maven高级部分

8 分模块开发与设计

8.1 目标

目标:将ssm项目拆分。
Maven学习笔记_第81张图片
如上图所示,将ssm项目拆分成右侧几个模块。

8.2 ssm-pojo拆分

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


<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.0modelVersion>

    <groupId>com.itheimagroupId>
    <artifactId>ssm_pojoartifactId>
    <version>1.0-SNAPSHOTversion>

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

project>

8.3 ssm_dao拆分

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

<dependencies>
    
    <dependency>
        <groupId>com.itheimagroupId>
        <artifactId>ssm_pojoartifactId>
        <version>1.0-SNAPSHOTversion>
    dependency>
    
    <dependency>
        <groupId>org.springframeworkgroupId>
        <artifactId>spring-contextartifactId>
        <version>5.1.9.RELEASEversion>
    dependency>
    
    <dependency>
        <groupId>org.mybatisgroupId>
        <artifactId>mybatisartifactId>
        <version>3.5.3version>
    dependency>
    
    <dependency>
        <groupId>mysqlgroupId>
        <artifactId>mysql-connector-javaartifactId>
        <version>5.1.47version>
    dependency>
    
    <dependency>
        <groupId>org.springframeworkgroupId>
        <artifactId>spring-jdbcartifactId>
        <version>5.1.9.RELEASEversion>
    dependency>
    
    <dependency>
        <groupId>org.mybatisgroupId>
        <artifactId>mybatis-springartifactId>
        <version>2.0.3version>
    dependency>
    
    <dependency>
        <groupId>com.alibabagroupId>
        <artifactId>druidartifactId>
        <version>1.1.16version>
    dependency>
    
    <dependency>
        <groupId>com.github.pagehelpergroupId>
        <artifactId>pagehelperartifactId>
        <version>5.1.2version>
    dependency>
dependencies>

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


<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">
    
    <context:component-scan base-package="com.itheima"/>
    
    <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>
    
    <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">mysqlprop>
                            <prop key="reasonable">trueprop>
                        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。
Maven学习笔记_第89张图片
2、对于service层的pom文件内容如下(即所需的资源):注意ssm_dao资源的导入,此外无需导入ssm_pojo的资源,因为他间接依赖了ssm_dao的ssm_pojo资源。对ssm_dao进行install命令。

<dependencies>
    
    <dependency>
        <groupId>com.itheimagroupId>
        <artifactId>ssm_daoartifactId>
        <version>1.0-SNAPSHOTversion>
    dependency>
    
    <dependency>
        <groupId>org.springframeworkgroupId>
        <artifactId>spring-contextartifactId>
        <version>5.1.9.RELEASEversion>
    dependency>
    
    <dependency>
        <groupId>junitgroupId>
        <artifactId>junitartifactId>
        <version>4.12version>
    dependency>
    
    <dependency>
        <groupId>org.springframeworkgroupId>
        <artifactId>spring-testartifactId>
        <version>5.1.9.RELEASEversion>
    dependency>
dependencies>

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


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

    
    <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层代码安装到本地仓库中。
Maven学习笔记_第90张图片

8.5 ssm_controller拆分

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

<dependencies>
  
  <dependency>
    <groupId>com.itheimagroupId>
    <artifactId>ssm_serviceartifactId>
    <version>1.0-SNAPSHOTversion>
  dependency>

  
  <dependency>
    <groupId>org.springframeworkgroupId>
    <artifactId>spring-webmvcartifactId>
    <version>5.1.9.RELEASEversion>
  dependency>
  
  <dependency>
    <groupId>com.fasterxml.jackson.coregroupId>
    <artifactId>jackson-databindartifactId>
    <version>2.9.0version>
  dependency>
  
  <dependency>
    <groupId>javax.servletgroupId>
    <artifactId>javax.servlet-apiartifactId>
    <version>3.1.0version>
    <scope>providedscope>
  dependency>
dependencies>

<build>
  
  <plugins>
    
    <plugin>
      <groupId>org.apache.tomcat.mavengroupId>
      <artifactId>tomcat7-maven-pluginartifactId>
      <version>2.1version>
      <configuration>
        <port>80port>
        <path>/path>
      configuration>
    plugin>
  plugins>
build>

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

<context-param>
  <param-name>contextConfigLocationparam-name>
  <param-value>classpath*:applicationContext-*.xmlparam-value>
context-param>

4、配置tomcat服务器并使用postman测试:
http://localhost:8080/user?userName=Mark&password=123456&realName=Hongyi&gender=1&birthday=2022/01/06
Maven学习笔记_第92张图片
数据库中:
Maven学习笔记_第93张图片

8.6 小结

分模块开发:

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

9 聚合和继承

9.1 聚合

聚合:多模块的构建维护。
Maven学习笔记_第94张图片

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

示例

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


<packaging>pompackaging>


<modules>
    <module>../ssm_daomodule>
    <module>../ssm_pojomodule>
    <module>../ssm_controllermodule>
    <module>../ssm_servicemodule>
modules>

注意:当前参与聚合操作的模块最终执行顺序与模块间的依赖关系有关,与配置顺序无关。如果当前模块间没有依赖关系,则与配置顺序无关。
Maven学习笔记_第95张图片
3、执行mvn install并观察:

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

Maven学习笔记_第96张图片

  • 打包耗时

Maven学习笔记_第97张图片

9.2 继承

9.2.1 概述和示例

继承:模块依赖关系维护。
Maven学习笔记_第98张图片

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

示例

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


<dependencyManagement>
    
    <dependencies>
        
        <dependency>
            <groupId>com.itheimagroupId>
            <artifactId>ssm_pojoartifactId>
            <version>1.0-SNAPSHOTversion>
        dependency>
        <dependency>
            <groupId>com.itheimagroupId>
            <artifactId>ssm_daoartifactId>
            <version>1.0-SNAPSHOTversion>
        dependency>
        <dependency>
            <groupId>com.itheimagroupId>
            <artifactId>ssm_serviceartifactId>
            <version>1.0-SNAPSHOTversion>
        dependency>
        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-webmvcartifactId>
            <version>5.1.9.RELEASEversion>
        dependency>
        
        <dependency>
            <groupId>com.fasterxml.jackson.coregroupId>
            <artifactId>jackson-databindartifactId>
            <version>2.9.0version>
        dependency>
        
    dependencies>
dependencyManagement>

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


<parent>
    
    <artifactId>ssmartifactId>
    <groupId>com.itheimagroupId>
    <version>1.0-SNAPSHOTversion>
    
    <relativePath>../ssm/pom.xmlrelativePath>
parent>

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


<dependency>
    <groupId>com.itheimagroupId>
    <artifactId>ssm_pojoartifactId>
dependency>

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

<build>
    <pluginManagement>
        
        <plugins>
            
            <plugin>
                <groupId>org.apache.tomcat.mavengroupId>
                <artifactId>tomcat7-maven-pluginartifactId>
                <version>2.1version>
                <configuration>
                    <port>80port>
                    <path>/path>
                configuration>
            plugin>
        plugins>
    pluginManagement>
build>

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

<build>
  
  <plugins>
    
    <plugin>
      <groupId>org.apache.tomcat.mavengroupId>
      <artifactId>tomcat7-maven-pluginartifactId>
    plugin>
  plugins>
build>

9.2.2 继承的资源

以下资源,子工程都可以从父工程中继承:
Maven学习笔记_第99张图片

9.2.3 继承和聚合的区别

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

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

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

9.3 属性

9.3.1 自定义属性

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

示例

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


<properties>
    <maven.compiler.source>11maven.compiler.source>
    <maven.compiler.target>11maven.compiler.target>
    
    <spring.version>5.1.9.RELEASEspring.version>
    <junit.version>4.12junit.version>
properties>

2、调用:


<dependency>
    <groupId>org.springframeworkgroupId>
    <artifactId>spring-webmvcartifactId>
    <version>${spring.version}version>
dependency>

9.3.2 内置属性

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

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


<dependency>
    <groupId>com.itheimagroupId>
    <artifactId>ssm_pojoartifactId>
    <version>${version}version>
dependency>
<dependency>
    <groupId>com.itheimagroupId>
    <artifactId>ssm_daoartifactId>
    <version>${version}version>
dependency>
<dependency>
    <groupId>com.itheimagroupId>
    <artifactId>ssm_serviceartifactId>
    <version>${version}version>
dependency>

9.3.3 其他属性

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

9.4 版本管理

9.4.1 工程版本区分

Maven学习笔记_第100张图片

  • SNAPSHOT快照版本

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

  • RELEASE发布版本

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

9.4.2 工程版本号约定

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

  • 范例:
    5.1.9.RELEASE

9.5 资源配置

资源配置多文件维护:
Maven学习笔记_第101张图片

配置文件引用pom属性:

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

  • 调用格式:${ }

示例

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

<bulid>
    
    <resources>
        <resource>
            
            <directory>${project.basedir}/src/main/resourcesdirectory>
            
            <filtering>truefiltering>
        resource>
    resources>

    
    <testResources>
        <testResource>
            
            <directory>${project.basedir}/src/test/resourcesdirectory>
            
            <filtering>truefiltering>
        testResource>
    testResources>
bulid>

设置属性:


<properties>
    <maven.compiler.source>11maven.compiler.source>
    <maven.compiler.target>11maven.compiler.target>
    <spring.version>5.1.9.RELEASEspring.version>
    <junit.version>4.12junit.version>
    <jdbc.url>jdbc:mysql://127.0.0.1:3306/ssm_db?useSSL=falsejdbc.url>
properties>

2、jdbc.properties内容:

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

9.6 多环境开发配置

多环境兼容:
Maven学习笔记_第102张图片

配置方法

1、在父工程pom文件中:


<profiles>
    
    <profile>
        
        <id>pro_envid>
        
        <properties>
            <jdbc.url>jdbc:mysql://127.0.0.1:3306/ssm_db?useSSL=falsejdbc.url>
        properties>
    profile>
    
    <profile>
        
        <id>dev_envid>
        
        <properties>
            <jdbc.url>jdbc:mysql://127.0.0.2:3306/ssm_db?useSSL=falsejdbc.url>
        properties>
        
        <activation>
            <activeByDefault>trueactiveByDefault>
        activation>
    profile>
profiles>

2、加载指定的环境

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

例如:新建一个maven配置,在开发环境执行install命令:
Maven学习笔记_第103张图片

执行后查看jdbc.properties文件:
Maven学习笔记_第104张图片
可见是按照开发环境的地址127.0.0.2进行项目安装的。

9.7 跳过测试

应用场景

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

使用操作界面跳过测试

Maven学习笔记_第105张图片

10 Maven私服

分模块合作开发:
Maven学习笔记_第106张图片

10.1 Nexus私服搭建

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

搭建步骤

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

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

在这里插入图片描述
Maven学习笔记_第107张图片

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

Maven学习笔记_第108张图片
Maven学习笔记_第109张图片
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、访问配置好的端口网址即可
Maven学习笔记_第110张图片
停止服务运行

./bin/nexus stop

10.2 Nexus操作

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

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

仓库分类

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

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

  • 仓库组group:
    将若干仓库组成一个群组,简化配置
    仓库组不能保存资源,属于设计型仓库
    Maven学习笔记_第112张图片

操作实例

1、新建一个仓库,例如heima-release
Maven学习笔记_第113张图片
2、仓库类型选择宿主仓库maven2(hosted)
Maven学习笔记_第114张图片
3、创建好后,将其加入到maven-public仓库组中,方便管理
Maven学习笔记_第115张图片
4、将ssm_pojo打包好的jar文件上传至heima-release仓库中
Maven学习笔记_第116张图片
5、查看仓库里的ssm_pojo资源
Maven学习笔记_第117张图片

10.2.2 本地仓库访问私服

idea环境中的资源上传与下载:
Maven学习笔记_第118张图片
1、配置本地仓库访问私服的权限(setting.xml)


<server>
    
    <id>heima-releaseid>
    <username>adminusername>
    <password>XXXXXXXXXpassword>
server>
<server>
    <id>heima-snapshotid>
    <username>adminusername>
    <password>XXXXXXXXXpassword>
server>

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


<mirror>
    <id>nexus-aliyunid>    
    <name>nexus-aliyunname>  
    <url>http://maven.aliyun.com/nexus/content/groups/publicurl>    
    <mirrorOf>centralmirrorOf> 
mirror>


<mirror>
    <id>heimaid>
    
    <url>XXXXXXXXXXXXurl>
    <mirrorOf>*mirrorOf> 
mirror>

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


<distributionManagement>
    <repository>
        
        <id>heima-releaseid>
        
        <url>http://XXXXXXX/repository/heima-release/url>
    repository>
    <snapshotRepository>
        
        <id>heima-snapshotid>
        
        <url>http://XXXXXXX/repository/heima-snapshot/url>
    snapshotRepository>
distributionManagement>

4、执行命令

mvn deploy

Maven学习笔记_第119张图片

5、执行结果
Maven学习笔记_第120张图片

你可能感兴趣的:(java,maven,apache)