【学】Maven 笔记 | 不食花生的猫

第一章 Maven 基础


网页地址

  1. 视频地址:黑马程序员Maven全套教程,maven项目管理从基础到高级,Java项目开发必会管理工具maven_哔哩哔哩_bilibili
  2. 依赖查询:https://mvnrepository.com/
  3.  Maven :Maven – Available Plugins

  4.  Nexus :Download

  5. 有道云笔记:https://note.youdao.com/s/avkgonCe

Maven 标签

resources: 资源文件配置信息

resource: 资源文件配置信息

testResources: test 资源文件配置信息

testResource: test 资源文件配置信息

  以下内容属于 dependencies  

groupId: 【组织 ID】定义当前 Maven 项目隶属组织名称(通常是域名反写,例如 org.mybaits)

artifactId: 【项目 ID】定义当前 Maven 项目名称(通常是模块名称,例如 CRM、SMS)

version: 【版本号】定义当前项目的版本号

packaging: 【jar/war】定义该项目的打包方式

optional: 是否对上级隐藏 true / false

exclusions: 排除掉某些

exclusion: 具体排除掉哪一个 ()

  注意:不写版本 见代码片段 1.2  

scope: 范围

  • 在主程序范围能不能用 【compile  文件夹范围内 】
  • 在测试范围能不能用【 test 】
  • 是否参与打包【 package 】

dependencyManagement:【依赖管理】 在 父pom 中做依赖管理

build

  • build 构建
  • plugins 插件(们)
  • plugin 插件

代码片段 1.1

<plugins>
    <plugin>
    <groupId> …… </groupId>
    <artifactId> …… </artifactId>
    <version>  ……   <version>
    <exclusions> <!-- 执行 -->
        <exclusions>
            <!--执行位置>
            <goals>
            <goal>jar</goal>
            <goals>
            <!-- 参考声明周期全过程 -->
            <phase> generate-test-resources <phase>
        <exclusions>
    </exclusions>
    </plugin>
</plugins>

表 1.1 scope 范围

scope 参数

主程序

测试程序

参与打包

典型

compile

🙆🏻‍♀️

🙆🏻‍♀️

🙆🏻‍♀️

log4j

test

🙆🏻‍♀️

junit

provided

🙆🏻‍♀️

🙆🏻‍♀️

servlet-api

runtime

🙆🏻‍♀️

jdbc

表 1.2 scope 以来传递中的范围问题

项目 2 \ 项目 1

compile

test

provided

runtime

compile

compile

test

provided

runtime

test

provided

runtime

runtime

test

provided

runtime

代码 1.2 排除下级依赖

<dependency>
    <groupId>父类 组名</groupId>  (定义 <parent> 之后可以删除)
    <artifactId>父类 artifactId</artifactId>
    <version>父类 版本</version>  (定义 <parent> 之后可以删除)
    <!--排除掉以下-->
    <executions> 
        <!-- 排除掉 a-->
        <execution>
            <groupId>a 的 groupId</groupId>
            <artifactId>a 的 artifactId</artifactId>
        </execution>
    </executions>
</dependency>

依赖传递

  • 若 b 项目引用 a 项目作为依赖,那么 a 项目引用的依赖 b 也引用
  • 直接依赖:直接引用的依赖
  • 间接依赖:通过引用其他项目获取其他项目的依赖

依赖冲突问题

  • 深度优先原则:层级越浅优先级越高(直接依赖>间接以依赖)
  • 声明优先原则:两个间接以来全都是 2 层,那么看引用他们依赖的 a 与 b ,谁在前面使用谁的
  • 后者覆盖原则:当同一个 pom 文件中出现了同一个依赖的不同版本,后者覆盖前者
  • 对上级隐藏 :true
  • 排除下级依赖:
  1. Maven 生命周期与插件

全部过程

第二章 Maven 高级


分模块开发思路

  • 将 controller 层、service 层等都单独划分为一个单独的 Maven 模块,通过接口进行连接

配置管理 | (插件同理)

配置一个新的 pom 文件用于管理所有的 pom

packaging:

  • 聚合 pom
  • 后端 jar
  • web war
<packaging> pom </packaging> <!-- 说明此文件专门用于配置管理 -->

<modules>
    <module> 各层级文件的名称 </module>
    <module>../ssm_pojo</module>
    <module>../ssm_dao</module>
    <module>../ssm_service</module>
    <module>../ssm_controller</module>
    ……
</modules>

继承

        在 父 pom 文件中定义所有的依赖

   父 pom: 

<dependencyManagement>
    <dependencies>
        <dependency>
            也可以写自己的项目,没两样
        </dependency>
        <dependency>
            <groupId> …… </groupId>
            <artifactId> …… </artifactId>
            <version> …… <version>
        </dependency>
    </dependencies>
</dependencyManagement>

  子 pom : dependency 中不用写 version  

<parent>
   <groupId> …… </groupId>
    <artifactId> …… </artifactId>
    <version> …… <version>
    <!-- 父工程 pom.xml 文件的地址-->
    <relativePath>  ../ssm/pom.xml </relativePath>
</parent>


<dependencies>
    <dependency>
        <groupId> …… </groupId>
        <artifactId> …… </artifactId>
        
    </dependency>
</dependencies>

  同理插件也可以继承,同样删除 version  

继承与聚合

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

第三章 自定义变量


<properties>
    <spring.version>1.2.3</spring.version>
</properties>

<!-- 使用格式 -->
${spring.version}

<!-- 直接使用项目的 version -->
<version>${version}</version>

<!-- 读取 settings.xml 文件中的值 -->
${settings.localRepository}

<!-- 读取 Java 系统属性 -->
${user.home}
<!-- 使用: mvn help:system 可以查看系统环境变量 -->

第四章 版本管理


工程版本

  • SNAPSHOT(快照版本)
    • 项目开发过程中,为方便团队成员合作,解决模块间互相依赖和实时更新的问题,开发者对每个模块进行构建的时候,输出的临时性版本叫做快照版本(测试阶段版本)
    • 快照版本会随着开发的进站不断更新
  • RELEASE(发布版本)
    • 项目开发到进入阶段里程碑后,向团队外部发布较为稳定的版本,这种版本对应的构建文件是稳定的,几遍进行功能的后续开发,也不会改变当前发布版本的内容,这种版本成为发布版本

功能版本号约定

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

第五章 多环境


配置资源文件对应信息

  • 在 pom 文件中设定配置文件路径
  • 开启加载 pom 属性过滤功能
  • 使用   ${属性名}    格式引用 pom 属性
<properties>
    <jdbc.username> …… </jdbc.username>
</properties>

<resources>
    <resource>
        <directory>../ssm_dao/src/main/resources</directory>
        <directory>${project.basedir}/src/main/resources</directory>
        <filtering>true</filtering>
    <resource>
</resources>
<!-- jdbc.properties -->

jdbc.username=${jdbc.username}

定义 生产/开发 环境

<profiles>

    <!-- 定义具体的环境:生产环境 -->
    <profile>
        <!-- 定义环境唯一名称 -->
        <id> pro_env </id>
        <!-- 定义环境中专用的属性值 -->   
        <jdbc.url> url1 </jdbc.url>
        <!--  默认使用这个配置  -->
        <activeByDefault>true</activeByDefault>
    </profile>
    
    <!-- 定义具体的环境:开发环境 -->
    <profile>
        <id> dev_env </id> 
        <!-- 定义环境中专用的属性值 --> 
        <jdbc.url> url2 </jdbc.url>      
    </profile>
    
</profiles>

使用

  • maven 中加入一个新的生命周期
  • 指令为:install -P dev_env

第六章 跳过测试


使用场景

  • 整体模块功能未开发
  • 模块中某个功能未开发完毕
  • 单个功能更新调试导致其他功能失败
  • 快速打包
  • ……

使用方法

  插件:maven helper  

  1. 方案 1:直接使用 IDEA 进行屏蔽
  2. 方案 2:选中 pom 文件,右键 run以下命令:install -D skipTests
  3. 方案 3:build 中设置跳过测试
<build>
    <plugins>
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.1</version>
            
            <configuration>
                <!-- 跳过测试 -->
                <skipTest>true</skipTest>
            </configuration>
            
            <configuration>
                <!-- 指定测试 -->
                <includes>
                    <include>**/Demotest.java</include>
                </includes>
                
                <!-- 排除以下进行测试 -->
                <excludes>
                    <exclude>**/User*Test.java</exclude>
                </excludes>
            </configuration>
            
        </plugin>
    </plugins> 
</build>           

第七章 Nexus 私服搭建与使用


Nexus私服

  • 启动:进入 bin 文件夹 nexus run
  • 访问:localhost:8081

仓库分类

  1. 宿主仓库 hosted
    1. 保存无法从中央仓库获取的资源
      1. 自主研发
      2. 第三方非开源项目
  2. 代理仓库 proxy
    1. 代理远程仓库,通过 nexus 访问其他公共仓库,例如中央仓库
  3. 仓库组 group
    1. 将若干个仓库组成一个群组,简化配置
    2. 仓库组不能保存资源,属于设计型仓库

Idea 与 Nexus 私服

  • Maven settings.xml 文件中的配置
<servers>
    <server>
        <id>jim-release</id>
        <username>admin</username>
        <password>admin</password>
    </server>
    <server>
        <id>jim-snapshots</id>
        <username>admin</username>
        <password>admin</password>
    </server>
</servers>

<mirrors>
    <mirror>
        <id>jim</id>
        <mirrorOf>*</mirrorOf>
        <url>去 Nexus 私服仓库复制 </url>
    </mirror>
</mirrors>
  • 发布  【 maven deploy 】 
<distributionManagement>
    <repository>
    <!-- settings.server 中的 ID -->
        <id></id>
        <url></url>
    </repository>
</distributionManagement>

第八章 其他


settings.xml

<settings> <!-- 本地仓库地址 --> <localRepository>/Users/hsk/DevTools/mavenRepository</localRepository> <mirrors> <mirror> <!--次镜像唯一标识符,用来区分不同的 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>

Maven 生命周期全过程

  • validate 校验
  • initialize 初始化
  • generate-sources 生成源代码
  • process-sources 处理源代码
  • generate-resources 生成资源文件
  • process-resources 处理资源文件
  • compile 编译
  • process-classes 处理类文件
  • generate-test-sources 处理测试源代码
  • process-test-sources 生成测试源代码
  • generate-test-resources 生成测试资源文件
  • process-test-resources 处理测试资源文件
  • test-compile 编译测试源码
  • process-test-classes 处理测试类文件
  • test 测试
  • prepare-package 准备打包
  • package 打包
  • pre-integration-test 集成测试前
  • integration-test 集成测试
  • post-integration-test 集成测试后
  • verify 验证
  • install 安装
  • deploy 部署