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.将资源发布到对应的仓库里面

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

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

相关推荐
扯淡的闲人3 小时前
Visual Studio Code的使用简介
ide·vscode·编辑器
七夜zippoe3 小时前
Java 技术支撑 AI 系统落地:从模型部署到安全合规的企业级解决方案(二)
java·人工智能·安全
IAM四十二4 小时前
基于 Embedding 实现一个本地相册搜索功能
人工智能·python·llm
孤狼程序员4 小时前
异常处理小妙招——1.别把“数据库黑话”抛给用户:论异常封装的重要性
java·数据库·mysql
java干货4 小时前
还在 @AfterEach 里手动 deleteAll()?你早就该试试这个测试数据清理 Starter 了
java·数据库·oracle
弗锐土豆5 小时前
编程基础-eclipse创建第一个程序
java·eclipse·helloworld·创建工程
Akshsjsjenjd6 小时前
Ansible 核心功能:循环、过滤器、判断与错误处理全解析
java·数据库·ansible
THMAIL6 小时前
机器学习从入门到精通 - 降维艺术:PCA与t-SNE带你玩转高维数据可视化
人工智能·python·决策树·随机森林·机器学习·分类·bootstrap
看月亮的方源6 小时前
B站小土堆-pytorch深度学习快速入门笔记
pytorch·python