maven【maven】技术详解

Maven

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

  • Project Object Model:项目对象管理模型

  • 作用:

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

1.下载与安装

  • 1.下载:在官网中找到对应版本的maven进行下载,解压到需要安装的目录下即完成了安装
  • 2.配置:添加环境变量:MAVEN_HOME,以及在path中添加:%MAVEN_HOME%\bin
  • 3.本地仓库配置:在maven文件下找到conf文件夹,打开里面的setting.xml
  • 5.仓库控制:

2.仓库

  • 用于存储资源,包含各种jar包

3.坐标

  • 用于描述仓库中资源的位置

4.Maven工程制作

1)手动制作

1.Maven项目构建命令
  • 项目结构:

5.Maven的IDEA生成

pom.xml文件的说明:

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/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>
    </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.依赖

1)依赖

  • 指当前项目运行需要用到的jar包(指别人开发的资源模块)

2)依赖传递

  • 依赖具有传递性:
    • 直接依赖:在当前项目中通过配置建立的依赖关系
    • 间接依赖:被依赖的资源如果依赖其他资源,则当前项目是间接依赖其他资源的
1.依赖传递冲突
  • 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高
  • 声明优先:当资源在相同层级被依赖时,配置顺序靠前的资源覆盖配置顺序靠后的
  • 特殊优先:当同级配置了相同资源的不同版本,则后配置的覆盖先配置的

2.可选依赖
  • 可选依赖指对外隐藏当前所依赖的资源--不透明
  • 在配置资源时,添加:<optional>true<optional>

在project03中对外隐藏对junit资源的依赖,在project02中能看到priject03依赖的其他资源,而无法看到project03对junit的依赖

3.排除依赖
  • 排除依赖指主动断开依赖的资源,被排除的资源无需指定版本

在project02中引入project03的依赖时,不需要用到project03的log4j资源时,在project02配置project03时添加需要排除的依赖名称:这样在project02中就不会传递project03中的log4j资源

4.依赖范围
  • 依赖的jar默认情况都可以使用,可以通过scope标签设定作用范围
  • 作用范围:
    • 主程序范围有效(main文件夹范围内)
    • 测试程序范围有效(test文件夹范围内)
    • 是否参与打包(package指令范围内)
依赖范围传递

7.生命周期与插件

1)项目构建生命周期
  • 生命周期:由项目编译到安装到maven库中的一次构建过程

  • Maven对项目构建的生命周期分为三阶段:

    • clean:

    • default:

    • site:

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

在project03中配置插件,插件执行的阶段为generate-test-resource,当运行test阶段时,由于test在generate-test-resource阶段后面,所以依然会执行插件的功能。

Maven高级

1.分模块开发与设计

  • 把一个大的项目,根据功能划分为多个小的模块
  • 模块中只包含当前模块对应的功能类与配置文件
  • spring核心配置根据模块功能不同进行独立制作
  • 当前模块所依赖的模块通过导入坐标的形式加入当前模块之后,并且安装到本地maven仓库中才可以使用
  • web.xml需要加载所有的spring核心配置文件
  • 1.ssm_pojo的拆分:

    • 拷贝原始项目对应的相关内容到ssm_pojo模块中
      • 实体类
      • 配置文件(无)
  • 2.ssm_dao模块的拆分:

    • 拷贝项目中dao文件下的所有内容
    • 对原始项目中其他bean的使用,比如使用到了ssm_pojo中的user类:
      • 将ssm_pojo的坐标直接导入到pom.xml文件中,将ssm_pojo作为一个资源导入到ssm_dao模块中
      • 需要将ssm_pojo安装到本地仓库中 (install)
    • 配置文件中需要使用到的依赖复制到ssm_dao的pom.xml文件
  • 3.ssm_service模块的拆分:

    • 将service相关的文件从原始项目中复制下来
    • 使用到了dao中的bean,于是将ssm_dao的模块坐标导入到当前项目中:
      • 将ssm_dao的坐标直接导入到pom.xml文件中,将ssm_dao作为一个资源导入到ssm_service模块中
      • 需要将ssm_dao安装到本地仓库中 (install)
    • 配置文件中需要使用到的依赖复制到ssm_service的pom.xml文件
  • 4.controller模块拆分:

  • 1.将模块设置为web-app模板

2.聚合

  • 当前项目结构中,所有模块是层层嵌套的,如果中间某个模块进行了更新,其他模块如何将他们所依赖的模块同步更新?
  • 创建一个管理工程,只用作模块的管理:操作当前模块就能打包或者编译它管理的所有模块
  • 在pom.xml中添加<packaging>pom</packaging>:定义该工程用于构建管理
  • 再添加:<modules></modules>里面则放入需要管理的工程模块名称
  • 相当于管理层,里面不包含任何代码,只负责所有模块的统一更新和版本升级

3.继承

  • 模块依赖关系维护:多个模块依赖的资源版本可能会有冲突
  • 使用一个总的依赖版本管理:在总的管理中列举所有依赖以及统一的版本,然后各个子模块只用对应用到的模块<dependencyManagement></dependencyManagement>
  • 在子模块中,定义父工程的坐标:指定哪个是总的依赖项:<parent></parent>
  • 子模块中去掉每个依赖的版本,全部是从父工程的依赖中获取版本号,groupId也可以省略,与父工程是用一个group


4.继承与聚合的对比

  • 聚合:在父工程中可以明确知道有哪些模块
  • 继承:父工程模块无法找到哪些子模块是继承了自己,通常都是在子模块中配置父工程坐标

5.属性

  • 我们定义一个自定义属性<properties></properties>来统一版本名称,统一管理依赖的版本


工程版本


资源配置

  • 在对应模块的pom.xml文件中定义对应的属性,在<build></build>中配置文件对应信息,然后使用${}获取该属性:在模块配置文件中读取核心配置中的属性值(这样就把所有配置属性集中到核心配置中管理)


多环境开发配置

多环境兼容

当开发和生成时需要在不同的环境下进行时,可以在pom.xml中定义多环境:

比如在开发中是在自己的服务器上运行,而生成时则是在总的服务器上运行,就可以通过多环境设置不同环境下的属性:

xml 复制代码
<!--  创建多环境-->
  <profiles>
<!--    定义具体的环境:生成环境-->
    <profile>
<!--      定义环境对应的唯一名称-->
      <id>pro_env</id>
<!--      定义环境中换用的属性-->
      <properties>
        <jdbc.url>jdbc:mysql://120.55.43.71:3306/ssm_db</jdbc.url>
      </properties>
    </profile>
<!--    定义具体的环境:开发环境-->
    <profile>
      <id>dep_env</id>
      <properties>
        <jdbc.url>jdbc:mysql://localhost:3306/ssm_db</jdbc.url>
      </properties>
    </profile>
  </profiles>
  • 在运行程序的打包时,就可以指定对应的环境从而完成在不同属性环境下的打包:



跳过测试



6.私服

  • 在公共服务器、中央服务器与本地仓库中建立一种关系,使得多个开发人员能够访问到各自上传的资源。

1.私服服务器

  • 1.安装:
  • 2.运行:
    • 复制到需要安装的路径下,解压出来重命名为nexus:进入到D:\nexus\nexus-3.20.1-01\bin目录下执行cmd,输入nexus /run nexus:启动私服服务器
  • 3.访问私服服务器:
    localhost:8081

2.私服资源获取

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

3.登录私服服务器

  • 1.创建hosted仓库:

  • 2.将当前hosted仓库添加:

  • 3.组件资源上传:

4.ideal环境的资源上传与下载

  • 配置本地仓库访问私服的权限:用户名+密码配置

  • 配置本地仓库资源的来源:

  • 也就是当需要用到资源时,从私服服务器的哪个地方下载:先是从中央仓库找,如果中央仓库找不到再从其他剩余仓库找:

  • 在IDEA中配置需要将对应的版本发布配置:

xml 复制代码
    <distributionManagement>
        <repository>
            <id>heima-release</id>
            <url>http://localhost:8081/repository/hiema-release/</url>
        </repository>
        <snapshotRepository>
            <id>heima-snapshots</id>
            <url>http://localhost:8081/repository/heima-snapshots/</url>
        </snapshotRepository>
    </distributionManagement>
  • 其中:对应版本需要通过仓库url发布到对应的仓库上:

  • 发布资源到私服命令:mvn deploy


资源发布的流程

  • 1.在IDEA中配置了对应资源发布仓库的url:
    • 如果是release的版本就会找到<repository></repository>中的url去访问该仓库地址
    • 如果是snapshot的版本就会找到 <snapshotRepository> </snapshotRepository>中的仓库url访问
  • 2.由于有权限限制,于是会根据id去本地仓库中配置的xml文件中找到对应id的<server></server>然后根据配置的用户名和密码去访问私服服务器
  • 3.将资源发布到对应的仓库里面

通过这样的资源发布,可以将该私服服务器挂到一个云服务器上,然后在任何地方,任何一个人都可以将自己开发好的资源发布到该私服上,而其他人也可以在任意地方访问该私服服务器,去下载同一个项目组中发布的资源,从而实现项目资源管理。

*注:上述内容来自黑马程序员的视频学习,仅用作学习交流,不用作商业用途,如有侵权,联系删除。

相关推荐
zzzzls~18 小时前
Python 工程化: 用 Copier 打造“自我进化“的项目脚手架
开发语言·python·copier
言慢行善18 小时前
sqlserver模糊查询问题
java·数据库·sqlserver
韶博雅18 小时前
emcc24ai
开发语言·数据库·python
专吃海绵宝宝菠萝屋的派大星19 小时前
使用Dify对接自己开发的mcp
java·服务器·前端
大数据新鸟19 小时前
操作系统之虚拟内存
java·服务器·网络
Tong Z19 小时前
常见的限流算法和实现原理
java·开发语言
凭君语未可19 小时前
Java 中的实现类是什么
java·开发语言
He少年19 小时前
【基础知识、Skill、Rules和MCP案例介绍】
java·前端·python
cTz6FE7gA19 小时前
数据结构与算法:大厂面试高频题的深度解析
intellij-idea·perl
AI_Claude_code19 小时前
ZLibrary访问困境方案四:利用Cloudflare Workers等边缘计算实现访问
javascript·人工智能·爬虫·python·网络爬虫·边缘计算·爬山算法