Maven进阶篇超详细笔记

2023-12-15 05:08:52

Maven进阶篇详细笔记,源码可见下载链接
大家阅读时可善用目录功能,可以提高大家的阅读效率
下载地址:Maven笔记+项目源码


分模块开发

分模块开发的意义

  • 将原始模块查分成若干个子模块,方便模块间的相互调用,接口共享

分模块开发的步骤

  1. 创建Maven工程
    • 将要拆分的功能放入另一个模块中(这里将原来的domain中的Book拆出去了)
  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>org.example</groupId>
  <artifactId>SSM</artifactId>  
  <packaging>pom</packaging>
  <version>1.0-SNAPSHOT</version>
    <dependencies>
<!--      依赖domain运行-->
      <dependency>
        <groupId>org.example</groupId>
        <artifactId>Maven_1</artifactId>
        <version>1.0-SNAPSHOT</version>
      </dependency>
        ...
    </dependencies>
</project>
  • 拆分出的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>org.example</groupId>
    <artifactId>Maven_1</artifactId>
    <version>1.0-SNAPSHOT</version>
</project>
  1. 通过maven指令安装模块到本地仓库
    • 运行拆分出模块的install指令,将其安装到本地
    • 再去运行原项目的compile指令,就可以运行了

注:如果不执行install之指令,在运行原项目的时候就会报错


依赖管理

依赖传递

  • 依赖具有传递性

    • 直接依赖:在当前项目中通过依赖配置建立的依赖关系
    • 间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源
  • 依赖传递冲突问题

    • 路径优先: 当依赖中出现相同的资源时,层级越深,优先级越低;层级越浅,优先级越高
    • 声明优先: 当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的
    • 特殊优先: 当同级配置了相同资源的不同版本,后配置的覆盖先配置的

如何直观的显示直接/间接依赖

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

可选依赖

  • 可选依赖是指对外隐藏所依赖的资源——不透明,我的依赖不给别人用
<?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>org.example</groupId>
    <artifactId>Maven_1</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>Maven_2</artifactId>
            <version>1.0-SNAPSHOT</version>
<!--            可选依赖是隐藏当前工作所依赖的资源,隐藏后的对应资源将不具有依赖传递性 true-隐藏 -->
            <optional>false</optional>
        </dependency>
    </dependencies>
</project>

排除依赖

  • 排除依赖是指主动断开依赖,被排除的资源无需指定版本——别人的依赖我不想用
<?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>org.example</groupId>
  <artifactId>SSM</artifactId>  
  <packaging>pom</packaging>
  <version>1.0-SNAPSHOT</version>
    <dependencies>
<!--      依赖domain运行-->
      <dependency>
        <groupId>org.example</groupId>
        <artifactId>Maven_1</artifactId>
        <version>1.0-SNAPSHOT</version>
<!--          排除依赖是隐藏当前资源对应的依赖关系,无视版本,指定id排除-->
          <exclusions> <!--这里面写要排除的项-->
              <exclusion> 
                  <groupId>org.example</groupId>
                  <artifactId>Maven_2</artifactId>
              </exclusion>
          </exclusions>
      </dependency>
        ...
  </dependencies>
</project>

继承和聚合

聚合

  • 聚合: 将多个模块组织成一个整体,同时进行项目构建的过程称为聚合
  • 聚合工程 :通常是一个不具有业务功能的“空”工程(有且仅有一个pom)文件
  • 作用: 使用聚合工程可以将多个工程编组,通过对聚合工程进行构建,实现对所包含的模块进行同步构建
    • 当工程中某个模块发生更新(变更)时,必须保障工程中与已更新模块的关联模块同步更新,
      此时可以使用聚合工程来解决批量模块同步构建的问题

聚合开发步骤

  1. 创建maven模块,设置打包类型为pom
  2. 设置当前聚合工程所包含的子模块名称
<?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>org.example</groupId>
    <artifactId>Maven</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

<!--    设置管理的模块名称 -->
    <modules>
        <module>../SSM</module>
        <module>../Maven_1</module>
        <module>../Maven_2</module>
    </modules>
</project>

继承

  • 概念: 继承描述的是两个工程间的关系,与java中的继承相似,子工程可以继承父工程中的配置信息,常见于依赖关系的继承
  • 作用:
    • 简化配置
    • 减少版本冲突

继承步骤

  1. 创建maven模块,打包方式设为pom(跟聚合相同)
  2. 在父工程的pom文件中配置依赖关系(子工程将沿用父工程中的依赖关系)
  3. 在父工程中配置可选的依赖
  • 父工程
<?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>org.example</groupId>
    <artifactId>Maven</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    
<!--继承必选依赖-->
<dependencies>
   <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-webmvc</artifactId>
       <version>5.2.10.RELEASE</version>
   </dependency>
</dependencies>


<!-- 可选依赖管理-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>
  • 子工程
<?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>org.example</groupId>
  <artifactId>SSM</artifactId>  
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
    
<!--    配置当前工程继承自parent工程-->
    <parent>
        <groupId>org.example</groupId>
        <artifactId>Maven</artifactId>
        <version>1.0-SNAPSHOT</version>
<!--        父工程路径(可不填)-->
        <relativePath>../Maven/pom.xml</relativePath>
    </parent>

    <dependencies>
      <dependency>
        <groupId>org.example</groupId>
        <artifactId>Maven_1</artifactId>
        <version>1.0-SNAPSHOT</version>
      </dependency>
<!--        添加可选依赖(不需要版本号)-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
  </dependencies>
</project>

继承和聚合的区别

  • 作用:
    • 聚合用于快速构建项目
    • 继承用于快速配置
  • 相同点:
    • 聚合与继承的pom.xml文件打包方式均为pom,可以将两种关系只做到同一个pom文件中
    • 聚合与继承均属于设计型模块,并无实际的模块内容
  • 不同点:
    • 聚合是在当前模块中配置关系,聚合可以感知到参与聚合的模块有哪些
    • 继承是在子模块中配置关系,父模块无法感知哪写子模块继承了自己

属性

pom文件中使用属性

  • 定义属性-properties
  • 使用属性-${}
<?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>org.example</groupId>
    <artifactId>Maven</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
        </dependency>
    </dependencies>

<!--    定义属性-->
    <properties>
        <spring.version>5.2.9.RELEASE</spring.version>
    </properties>
</project>

资源文件中引用属性

  1. 定义属性
  2. 在pom中设属性生效范围
  3. 在资源文件中调用属性
  • pom.xml
<?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>org.example</groupId>
    <artifactId>Maven</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>
  
<!--    定义属性-->
    <properties>
        <jdbc.url>jdbc:mysql:///ssm_db?useSSL=false</jdbc.url>
    </properties>
<!--    让指定路径下的文可以使用pom中的属性-->
    <build>
        <resources>
            <resource>
                <directory>${project.basedir}/src/main/resources</directory><!--这里用了一个maven的系统属性-->
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>
</project>
  • jdbc.properties
    • 可定义多个,这里只定义一个用于举例说明
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=${jdbc.url}
jdbc.username=root
jdbc.password=123456
  1. 配置maven打war包时不检查web.xml是否存在
<?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>org.example</groupId>
  <artifactId>SSM</artifactId>  
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.4.0</version>
        <configuration>
          <failOnMissingWebXml>false</failOnMissingWebXml>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

其他属性

在这里插入图片描述

版本管理

  • 工程版本
    • SNAPSHOT(快照版本)
      • 项目开发过程中临时输出的版本,称为快照版本
      • 快照版本会随着开发的进展不断更新
    • RELEASE(发布版本)
      • 项目开发到进入阶段里程碑后,项团队外发布较为稳定的般,这种版本所对应的构建文件是稳定的,即便进行功能的后续开发,也不会改变当前发布版本内容,
        这种版本称为发布版本
  • 发布版本
    • alpha版
    • beta版
    • 纯数字版

Maven多环境开发配置与应用

多环境开发

  • maven提供配置多种环境的设定,帮助开发者使用过程中快速切换环境
  1. 配置多环境
<?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>org.example</groupId>
    <artifactId>Maven</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>
<!--    配置多环境-->
    <profiles>
<!--     开发环境-->
        <profile>
            <id>env_dep</id>
            <properties>
                <jdbc.url>jdbc:mysql:///ssm_db?useSSL=false</jdbc.url>
            </properties>
        </profile>
<!--    生产环境-->
        <profile>
            <id>env_pro</id>
            <properties>
                <jdbc.url>jdbc:mysql://127.2.2.2:3306/ssm_db?useSSL=false</jdbc.url>
            </properties>
<!--            设定为默认启用的环境-->
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
<!--    测试环境-->
        <profile>
            <id>env_test</id>
            <properties>
                <jdbc.url>jdbc:mysql://127.3.3.3:3306/ssm_db?useSSL=false</jdbc.url>
            </properties>
        </profile>
    </profiles>

<!--    让指定路径下的文可以使用pom中的属性-->
    <build>
        <resources>
            <resource>
                <directory>${project.basedir}/src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>
</project>
  1. 使用多环境

mvn 指令 -p 环境定义id 范例:

mvn install -p pro_env

跳过测试

  • 应用场景

    • 功能更新中且没有开发完成
    • 快速打包
  • 使用方式

    • idea自带的maven功能
    • maven插件
    • maven语句
  1. idea自带的maven功能

在这里插入图片描述

2.maven插件(细粒度控制跳过测试)

<?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>org.example</groupId>
    <artifactId>Maven</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

<!--    让指定路径下的文可以使用pom中的属性-->
    <build>
        <resources>
            <resource>
                <directory>${project.basedir}/src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
<!--      跳过测试-->
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.1</version>
                <configuration>
                    <skipTests>false</skipTests><!--是否完全跳过测试-->
                    <!--排除掉不参与测试的内容-->
                    <excludes>
                        <exclude>**/BookServiceTest.java</exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
  1. maven指令

mvn 指令 -D skipTests

mvn install -D skipTests


私服

私服简介

  • 私服是一台独立的服务器,用于解决团队内部的资源共享与资源同步问题

  • Nexus

    • Sonatype公司的一款maven私服产品

Nexus安装与启动

  • 在nexus-3.62.0-01-win64\nexus-3.62.0-01\bin 目录下启用cmd
  • 输入命令行启动服务器
    nexus.exe /run nexus
  • 访问服务器,在浏览器中输入 http://localhost:8081
  • 修改基础配置信息
    • 安装路径下etc目录中nexus-default.properties文件保存有nexus基础配置信息,例如默认访问端口
  • 修改服务器运行配置信息
    • 安装路径下bin目录中,nexus.vmoptions文件保存有nexus服务器启动对应的配置信息,例如默认占用空间

私服资源操作流程分析

在这里插入图片描述

私服仓库分类

在这里插入图片描述

私服仓库配置

  1. 在私服管理页面>设置界面>Repositories>create repository —— 新建宿主仓库,
    一般新建两个,(snapshot,release)
  2. 将新建的宿主仓库纳入到仓库组中,在maven-public仓库组的group选项中将两个仓库纳入,并save
  3. 在maven配置文件中设置访问私服权限以及私服访问路径
  • setting.xml
<setting>
	<!-- 配置访问私服的权限 -->
<servers>
    <server>
      <id>lonelysnow-release</id> <!-- 私服中的服务器ID -->
      <username>admin</username>
      <password>123456</password>
    </server>
    <server>
      <id>lonelysnow-snapshot</id> 
      <username>admin</username>
      <password>123456</password>
    </server>
</servers>

        <!-- 私服访问路径 -->
<mirrors>
    <mirror>
        <id>maven-public</id> <!--仓库组ID-->
        <mirrorOf>*</mirrorOf>
        <url>http://localhost:8081/repository/maven-public/</url>
    </mirror>
</mirrors>
  
</setting>
  1. 工程上传到私服服务器设置
  • pom.xml
<!--    配置当前工程保存在私服中的具体位置-->
    <distributionManagement>
        <repository>
            <id>lonelysnow-release</id>
            <url>http://localhost:8081/repository/lonelysnow-release/</url>
        </repository>

        <snapshotRepository>
            <id>lonelysnow-snapshot</id>
            <url>http://localhost:8081/repository/lonelysnow-snapshot/</url>
        </snapshotRepository>
    </distributionManagement>
  1. 发布命令
    mvn deploy

文章来源:https://blog.csdn.net/lonely__snow/article/details/134885071
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。