从Maven初级到高级

一.Maven简介

Maven 是 Apache 软件基金会组织维护的一款专门为 Java 项目提供构建和依赖管理支持的工具。

一个 Maven 工程有约定的目录结构,约定的目录结构对于 Maven 实现自动化构建而言是必不可少的一环,就拿自动编译来说,Maven 必须 能找到 Java 源文件,下一步才能编译,而编译之后也必须有一个准确的位置保持编译得到的字节码文件。 我们在开发中如果需要让第三方工具或框架知道我们自己创建的资源在哪,那么基本上就是两种方式

  1. 通过配置的形式明确告诉它
  2. 基于第三方工具或框架的约定 Maven 对工程目录结构的要求

img

在没有maven前:

image-20231221161726351

在有了maven后:

image-20231221161738633

image-20231221161748321

1.maven特点

(1)标准化的项目结构

不同IDE之间的项目结构不同会导致IDE之间不通用,而maven就解决了这个问题

(2)标准化的构建流程

每一个项目都会经过,编译,测试,打包,发布,利用简单的命令就能完成一些大型项目

image-20231221161423551

img

(3)依赖管理机制:

管理你项目所依赖的第三方资源(因为如果项目较大,那jar包也会很多,得去一个一个的去网上找资源下载jar包,而maven就解决了这个问题,给一个坐标的配置就能轻松导入jar包)

image-20231221161459071

2.maven运行架构

image-20231221161546134

1.项目对象模型:每个jar包的唯一标识
2.仓库:maven去哪调用了这些jar包呢?是去仓库找到了jar包

二.Maven仓库

image-20231221161155181

因为国外的中央仓库访问速度比较慢,还有一些jar包有版权找不到,所以国内或企业就建立了私服远程仓库

三.Maven 开发环境配置

1.下载安装

首页:Maven – Welcome to Apache Maven

下载页面:Maven – Download Apache Maven

img

2. 指定本地仓库

本地仓库默认值:用户家目录/.m2/repository。由于本地仓库的默认位置是在用户的家目录下,而家目录往往是在 C 盘,也就是系统盘。将来 Maven 仓库中 jar 包越来越多,仓库体积越来越大,可能会拖慢 C 盘运行速度,影响系统性能。所以建议将 Maven 的本地仓库放在其他盘符下。配置方式如下:

<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<localRepository>D:\software\maven-repository</localRepository>

本地仓库这个目录,我们手动创建一个空的目录即可。

记住:一定要把 localRepository 标签从注释中拿出来

注意:本地仓库本身也需要使用一个非中文、没有空格的目录。

3.配置阿里云提供的镜像仓库

Maven 下载 jar 包默认访问境外的中央仓库,而国外网站速度很慢。改成阿里云提供的镜像仓库,访问国内网站,可以让 Maven 下载 jar 包的时候速度更快。配置的方式是:

  • 将原有的例子配置注释掉
<!-- <mirror><id>maven-default-http-blocker</id><mirrorOf>external:http:*</mirrorOf><name>Pseudo repository to mirror external repositories initially using HTTP.</name><url>http://0.0.0.0/</url><blocked>true</blocked>
</mirror> -->
  • 加入自己的配置
<mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

4.配置基础 JDK 版本

如果按照默认配置运行,Java 工程使用的默认 JDK 版本是 1.5,而我们熟悉和常用的是 JDK 1.8 版本。修改配置的方式是:将 profile 标签整个复制到 settings.xml 文件的 profiles 标签内。

<profile><id>jdk-1.8</id><activation><activeByDefault>true</activeByDefault><jdk>1.8</jdk></activation><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion></properties>
</profile>

四.Maven 的使用

1.核心概念:坐标

数学中的坐标使用 x、y、z 三个『向量』作为空间的坐标系,可以在『空间』中唯一的定位到一个『』。

img

Maven中的坐标使用三个『向量』在『Maven的仓库』中唯一的定位到一个『jar』包。

  • **groupId:**公司或组织的 id,即公司或组织域名的倒序,通常也会加上项目名称

例如:groupId:com.javatv.maven

  • **artifactId:**一个项目或者是项目中的一个模块的 id,即模块的名称,将来作为 Maven 工程的工程名

例如:artifactId:auth

  • **version:**版本号参数版本之类

例如:version:1.0.0

提示:坐标和仓库中 jar 包的存储路径之间的对应关系,如下

<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>

上面坐标对应的 jar 包在 Maven 本地仓库中的位置:

Maven本地仓库根目录\javax\servlet\servlet-api\2.5\servlet-api-2.5.jar

2.pom.xml

**POM:Project Object Model,项目对象模型。**和 POM 类似的是:DOM(Document Object Model),文档对象模型。它们都是模型化思想的具体体现。POM 表示将工程抽象为一个模型,再用程序中的对象来描述这个模型。这样我们就可以用程序来管理项目了。我们在开发过程中,最基本的做法就是将现实生活中的事物抽象为模型,然后封装模型相关的数据作为一个对象,这样就可以在程序中计算与现实事物相关的数据。

POM 理念集中体现在 Maven 工程根目录下 pom.xml 这个配置文件中。所以这个 pom.xml 配置文件就是 Maven 工程的核心配置文件。其实学习 Maven 就是学这个文件怎么配置,各个配置有什么用。

<!-- 当前Maven工程的坐标 -->
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<!-- 当前Maven工程的打包方式,可选值有下面三种: -->
<!-- jar:表示这个工程是一个Java工程  -->
<!-- war:表示这个工程是一个Web工程 -->
<!-- pom:表示这个工程是“管理其他工程”的工程 -->
<packaging>jar</packaging>
<properties><!-- 工程构建过程中读取源码时使用的字符集 --><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 当前工程所依赖的jar包 -->
<dependencies><!-- 使用dependency配置一个具体的依赖 --><dependency><!-- 在dependency标签内使用具体的坐标依赖我们需要的一个jar包 --><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><!-- scope标签配置依赖的范围 --><scope>test</scope></dependency>
</dependencies>

3.Maven生命周期

image-20231221163632707

4.Maven分模块开发与设计

(1)分模块开发的意义

目的:项目的扩展性变强了,方便其他项目引用相同的功能。

image-20231221170726994

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

image-20231221171015452

具体来说:

解耦,模块化和复用性: 将系统分解为模块可以提高代码的模块化程度,每个模块专注于特定的功能或业务逻辑。这种模块化的设计有利于提高代码的复用性,可以更方便地在不同的系统中重用模块。

简化开发和维护: 分模块开发可以让团队成员专注于各自模块的开发工作,减少了开发过程中的复杂性。此外,当系统需要维护或进行扩展时,可以更容易地定位和修改特定模块,而不影响其他部分的代码。

团队协作和并行开发: 通过划分模块,不同的开发人员可以独立负责不同的模块,从而实现并行开发。这有助于提高团队的协作效率,同时也可以缩短软件开发周期。

提高系统的可维护性和可扩展性: 由于各个模块之间的相对独立性,当需要对系统进行扩展或修改时,可以更容易地理解和管理各个模块,降低了对整个系统的影响。

降低风险和便于测试: 各个模块相对独立,对于系统进行单元测试、集成测试和功能测试时可以更加简便,同时在部署和故障排查时可以更容易地定位问题范围。

(2)如何进行分模块开发

首先明白模块之间怎么联系:对于从中央仓库或私服仓库导入的插件或jar先是通过从中央仓库或私服下载到本地仓库中,再导入到该项目,所以多模块开发就是将相应的jar包导入本地仓库供其他模块使用,其groupId便是本地仓库的文件目录,而maven就提供了直接打jar包并放入本地仓库的插件

mvn install

注意事项:

  1. 团队内部开发需要发布模块功能到团队内部可共享的仓库中(私服)

5.依赖管理

(1)依赖范围

上面说到我们使用 Maven 最主要的就是使用它的依赖管理功能,引入依赖存在一个范围,maven的依赖范围包括: compile,provide,runtime,test,system。

  • **compile:**表示编译范围,指 A 在编译时依赖 B,该范围为默认依赖范围。编译范围的依赖会用在编译,测试,运行,由于运行时需要,所以编译范围的依赖会被打包。
  • **provided:**provied 依赖只有当 jdk 或者一个容器已提供该依赖之后才使用。provide 依赖在编译和测试时需要,在运行时不需要。例如:servlet api被Tomcat容器提供了。
  • **runtime:**runtime 依赖在运行和测试系统时需要,但在编译时不需要。例如:jdbc 的驱动包。由于运行时需要,所以 runtime 范围的依赖会被打包。
  • **test:**test 范围依赖在编译和运行时都不需要,只在测试编译和测试运行时需要。例如:Junit。由于运行时不需要,所以 test 范围依赖不会被打包。
  • **system:**system 范围依赖与 provide 类似,但是必须显示的提供一个对于本地系统中 jar 文件的路径。一般不推荐使用。
依赖范围编译测试运行时是否会被打入jar包
compile
provided××
runtime×
test×××
system×

而在实际开发中,我们常用的就是 compiletestprovided

(2)依赖的传递

A 依赖 B,B 依赖 C,那么在 A 没有配置对 C 的依赖的情况下,A 里面能不能直接使用 C?

再以上的前提下,C 是否能够传递到 A,取决于 B 依赖 C 时使用的依赖范围。

  • B 依赖 C 时使用 compile 范围:可以传递
  • B 依赖 C 时使用 test 或 provided 范围:不能传递,所以需要这样的 jar 包时,就必须在需要的地方明确配置依赖才可以。

依赖冲突的优先级

  • 直接依赖:在当前项目中通过依赖配置建立的依赖关系
  • 间接依赖:被资源的资源如果依赖其他资源,当前项目间接依赖其他资源
  • 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的,
    • 该pom文件下相同jar包自下而上
    • 不同家族同层,自上而下

image-20231222145739467

(3)可选依赖

A依赖B,B依赖C,B不想被A依赖可以选择false隐藏

  • 可选依赖指对外隐藏当前所依赖的资源————不透明
<dependency><groupId>com.itheima</groupId><artifactId>maven_B_pojo</artifactId><version>1.0-SNAPSHOT</version><!--可选依赖是隐藏当前工程所依赖的资源,隐藏后对应资源将不具有依赖传递性--><optional>false</optional>
</dependency>

(4)排除依赖

A依赖B,B依赖C,A不想依赖B可以选择在A中排除B

img

  • 排除依赖指主动断开依赖的资源,被排除的资源无需指定版本————不需要
  • 排除依赖资源仅指定GA即可,无需指定V
  • 一般通过使用excludes标签配置依赖的排除:
<dependency>
<dependency><groupId>com.itheima</groupId><artifactId>maven_04_dao</artifactId><version>1.0-SNAPSHOT</version><!--排除依赖是隐藏当前资源对应的依赖关系--><exclusions><exclusion><groupId>log4j</groupId><artifactId>log4j</artifactId></exclusion><exclusion><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId></exclusion></exclusions>
</dependency>

(5)可选依赖和排除依赖的区别

image-20231222150517702

6.聚合

(1)聚合工程

什么叫聚合?

  • 聚合:将多个模块组织成一个整体,同时进行项目构建的过程称为聚合,就是如果B依赖C但是C改了其中影响B的量,那么错误难以排除,但是聚合就可以统一对模块进行构建,编译,等操作,等一个jar改变时直接提醒报错。

  • 聚合工程:通常是一个不具有业务功能的==”空“==工程(有且仅有一个pom文件)

  • 作用:使用聚合工程可以将多个工程编组,通过对聚合工程进行构建,实现对所包含的模块进行同步构建

    • 当工程中某个模块发生更新(变更)时,必须保障工程中与已更新模块关联的模块同步更新,此时可以使用聚合工程来解决批量模块同步构建的问题

image-20231222151018649

(2)聚合工程开发

2.1 创建Maven模块,设置打包类型为pom
<packaging>pom</packaging>

注意事项:

  1. 每个maven工程都有对应的打包方式,默认为jar,web工程打包方式为war
2.2 设置当前聚合工程所包含的子模块名称
<modules><module>../maven_ssm</module><module>../maven_pojo</module><module>../maven_dao</module>
</modules>

注意事项:

  1. 聚合工程中所包含的模块在进行构建时会根据模块间的依赖关系设置构建顺序,与聚合工程中模块的配置书写位置无关。
  2. 参与聚合的工程无法向上感知是否参与聚合,只能向下配置哪些模块参与本工程的聚合。

用一个空模块来进行聚合!

7.继承

(1)概念

Maven工程之间,A 工程继承 B 工程

  • B 工程:父工程
  • A 工程:子工程

本质上是 A 工程的 pom.xml 中的配置继承了 B 工程中 pom.xml 的配置。

通常是一个不具有业务功能的==”空“==工程(有且仅有一个pom文件)与继承一样

(2)作用

在父工程中统一管理项目中的依赖信息,具体来说是管理依赖信息的版本。

image-20231222151404679

需求一:这三个项目都需要spring包

需求二:前两个需要test

它背后的需求是:

  • 在每一个 module 中各自维护各自的依赖信息很容易发生出入,不易统一管理。
  • 使用同一个框架内的不同 jar 包,它们应该是同一个版本,所以整个项目中使用的框架版本需要统一。
  • 使用框架时所需要的 jar 包组合(或者说依赖信息组合)需要经过长期摸索和反复调试,最终确定一个可用组合。这个耗费很大精力总结出来的方案不应该在新的项目中重新摸索。

(3)继承关系开发

3.1 创建Maven模块,设置打包类型为pom
<packaging>pom</packaging>

注意事项:

  1. 建议父工程打包方式设置为pom
3.2 在父工程的pom文件中配置依赖关系(子工程将沿用父工程中的依赖关系)
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.10.RELEASE</version></dependency>……
</dependencies>
3.3 在父工程的pom文件中配置子工程中可选的依赖关系

此为可选依赖当继承此工程时,如果加上该名jar包而不写版本便是该工程版本,完成需求二

<dependencyManagement><dependencies><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.16</version></dependency>……</dependencies>
</dependencyManagement>
3.4 在子工程中配置当前工程所继承的父工程

完成需求一

<!--定义该工程的父工程-->
<parent><groupId>com.itheima</groupId><artifactId>maven_parent</artifactId><version>1.0-SNAPSHOT</version><!--填写父工程的pom文件,根据实际情况填写,加速找到--><relativePath>../maven_parent/pom.xml</relativePath>
</parent>
3.5 在子工程中配置使用父工程中可选依赖的坐标
<dependencies><dependency><!--不需要加版本,因为是继承的工程--><groupId>com.alibaba</groupId><artifactId>druid</artifactId></dependency>
</dependencies>

注意事项:

  1. 子工程中使用父工程中的可选依赖时,仅需要提供群组id和项目id,无需提供版本,版本由父工程统一提供,避免版本冲突
  2. 子工程中还可以定义父工程中没有定义的依赖关系

8.聚合与继承的区别

聚合和继承的作用?

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

五.属性管理

1.属性

属性具体来说就是一个变量,定义属性有什么好处?通过改变一个来统一改变简化开发

image-20231222153357338

(1) 属性配置与使用

1.1 定义属性

可以通过控制父类继承再控制全部

<!--定义自定义属性-->
<properties><spring.version>5.2.10.RELEASE</spring.version><junit.version>4.12</junit.version>
</properties>
1.2 引用属性
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version>
</dependency>

(2)资源文件引用属性

2.1 定义属性
<!--定义自定义属性-->
<properties><spring.version>5.2.10.RELEASE</spring.version><junit.version>4.12</junit.version><jdbc.url>jdbc:mysql://127.0.0.1:3306/ssm_db</jdbc.url>
</properties>
2.2 配置文件中引用属性
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=${jdbc.url}
jdbc.username=root
jdbc.password=root
2.3 开启资源文件目录加载属性的过滤器

就是让此resources下的文件去识别pom文件中的变量能够使用${}

<build><resources><resource><directory>${project.basedir}/src/main/resources</directory><filtering>true</filtering></resource></resources>
</build>
2.4 配置maven打war包时,忽略web.xml检查
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.2.3</version><configuration><failOnMissingWebXml>false</failOnMissingWebXml></configuration>
</plugin>

(3)其他属性(了解)

自上而下的优先级

  • 属性列表
    • 自定义属性(常用)
    • 内置属性
    • Setting属性
    • Java系统属性
    • 环境变量属性

image-20231222154136528

image-20231222154215313

可以通过上述命令去找到变量都有啥。

2. 版本管理

项目开发的版本可以分为哪几种?

(1)工程版本

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

(2)发布版本

  • alpha版
  • beta版
  • 纯数字版

六.多环境配置与应用

1. 多环境配置作用

  • maven提供配置多种环境的设定,帮助开发者使用过程中快速切换环境

image-20231222154516322

2. 多环境配置步骤

(1) 定义多环境

<!--定义多环境-->
<profile<!--定义具体的环境:生产环境--><profile><!--定义环境对应的唯一名称--><id>env_dep</id><!--定义环境中专用的属性值--><properties><jdbc.url>jdbc:mysql://127.0.0.1:3306/ssm_db</jdbc.url></properties><!--设置默认启动--><activation><activeByDefault>true</activeByDefault></activation></profile><!--定义具体的环境:开发环境--><profile><id>env_pro</id>……</profile>
</profiles>

(2) 使用多环境(构建过程)

【命令】:
mvn 指令 –P 环境定义id【范例】:
mvn install –P pro_env

3.跳过测试(了解)

因为在构建过程中你只想测试某个功能即使你知道有些功能没有完善会报错,因此跳过测试这些错误直接打jar包就是跳过测试

(1)应用场景

  • 功能更新中并且没有开发完毕
  • 快速打包
  • ……

(2)跳过测试命令

  • mvn install –D skipTests

注意事项:

  1. 执行的项目构建指令必须包含测试生命周期,否则无效果。例如执行compile生命周期,不经过test生命周期。

(3)细粒度控制跳过测试

<plugin><artifactId>maven-surefire-plugin</artifactId><version>2.22.1</version><configuration><skipTests>true</skipTests><!--设置跳过测试--><includes><!--包含指定的测试用例--><include>**/User*Test.java</include></includes><excludes><!--排除指定的测试用例--><exclude>**/User*TestCase.java</exclude></excludes></configuration>
</plugin>

七.私服

1.私服介绍

(1)介绍

  • 团队开发现状分析

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

  • Nexus

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

image-20231222154946330

(2)Nexus安装与启动

  • 启动服务器(命令行启动)

    • nexus.exe /run nexus
  • 访问服务器(默认端口:8081)

    • http://localhost:8081
  • 修改基础配置信息

    • 安装路径下etc目录中nexus-default.properties文件保存有nexus基础配置信息,例如默认访问端口。
  • 修改服务器运行配置信息

    • 安装路径下bin目录中nexus.vmoptions文件保存有nexus服务器启动对应的配置信息,例如默认占用内存空间。

(3)私服资源操作流程分析

image-20231222155235551

2. 私服仓库分类

image-20231222155256591

  • 宿主仓库:是用于存储和管理开发团队自主研发的软件包、库和资源的地方。它提供了版本控制、权限管理和发布功能,使团队成员可以上传、下载和管理这些软件包和资源。宿主仓库可以包含自己开发的代码、库和工具,以及第三方的软件包,方便团队内部统一管理和使用。

  • 代理仓库:充当了中间缓存的角色,用于在使用外部或公共的远程仓库时加快访问速度。代理仓库会缓存从远程仓库下载的软件包,以便下次请求时可以直接从缓存中获取,从而提高软件包下载的效率。这样可以减少对远程仓库的依赖,加快构建过程,并提供离线访问的能力

  • 仓库组是一个逻辑组合,将多个宿主仓库和代理仓库组合成一个统一的仓库。仓库组可以由多个宿主仓库和代理仓库组成,并提供单一的访问点。这样,开发人员可以从仓库组中获取所需的软件包和资源,而无需关心具体的底层仓库。仓库组能够简化依赖管理,并提供对多个仓库的透明访问。

3.资源上传与下载

往私服上传资源是否需要身份认证?在哪里设置认证信息?

image-20231222155523590

(1)从私服中下载依赖

【第一步】在maven的settings.xml中<mirrors>标签中配置,此时就需要注释掉aliyun的配置。

<mirror><id>nexus-heima</id><mirrorOf>*</mirrorOf><url>http://localhost:8081/repository/maven-public/</url>
</mirror>

【第二步】在nexus中设置允许匿名下载,如果不允许将不会从私服中下载依赖

image-20231222155831117

如果私服中没有对应的jar,会去中央仓库下载,速度很慢。可以配置让私服去阿里云中下载依赖。

image-20231222155847433

(2)上传依赖到私服中

【第一步】配置本地仓库访问私服的权限(在maven的settings.xml的servers标签中配置)

<server><!--id任意,多个server的id不重复就行,后面会用到--><id>heima-nexus</id><username>admin</username><password>123456</password><!--填写自己nexus设定的登录秘密-->
</server>

【第一步】配置当前项目访问私服上传资源的保存位置(项目的pom.xml文件中配置)

<distributionManagement><repository><!--和maven/settings.xml中server中的id一致,表示使用该id对应的用户名和密码--><id>heima-nexus</id><!--如果jar的版本是release版本,那么就上传到这个仓库,根据自己情况修改--><url>http://localhost:8081/repository/heima-releases/</url></repository><snapshotRepository><!--和maven/settings.xml中server中的id一致,表示使用该id对应的用户名和密码--><id>heima-nexus</id><!--如果jar的版本是snapshot版本,那么就上传到这个仓库,根据自己情况修改--><url>http://localhost:8081/repository/heima-snapshots/</url></snapshotRepository>
</distributionManagement>

注意:要和maven的settings.xml中server中定义的<id>heima-nexus</id>对应

【第三步】发布资源到私服命令

mvn deploy

heima-nexus
admin
123456


【第一步】配置当前项目访问私服上传资源的保存位置(项目的pom.xml文件中配置)```xml
<distributionManagement><repository><!--和maven/settings.xml中server中的id一致,表示使用该id对应的用户名和密码--><id>heima-nexus</id><!--如果jar的版本是release版本,那么就上传到这个仓库,根据自己情况修改--><url>http://localhost:8081/repository/heima-releases/</url></repository><snapshotRepository><!--和maven/settings.xml中server中的id一致,表示使用该id对应的用户名和密码--><id>heima-nexus</id><!--如果jar的版本是snapshot版本,那么就上传到这个仓库,根据自己情况修改--><url>http://localhost:8081/repository/heima-snapshots/</url></snapshotRepository>
</distributionManagement>

注意:要和maven的settings.xml中server中定义的<id>heima-nexus</id>对应

【第三步】发布资源到私服命令

mvn deploy

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/224286.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【内存泄漏】内存泄漏及常见的内存泄漏检测工具介绍

内存泄漏介绍 什么是内存泄漏 内存泄漏是指程序分配了一块内存&#xff08;通常是动态分配的堆内存&#xff09;&#xff0c;但在不再需要这块内存的情况下未将其释放。内存泄漏会导致程序浪费系统内存资源&#xff0c;持续的内存泄漏还导致系统内存的逐渐耗尽&#xff0c;最…

财务数据智能化:用AI工具高效制作财务分析PPT报告

Step1: 文章内容提取 WPS AI 直接打开文件&#xff0c;在AI对话框里输入下面指令&#xff1a; 假设你是财务总监&#xff0c;公司考虑与茅台进行业务合作、投资或收购&#xff0c;请整合下面茅台2021年和2022年的财务报告信息。整理有关茅台财务状况和潜在投资回报的信息&…

React 路由跳转

1. push 与 replace 模式 默认情况下&#xff0c;开启的是 push 模式&#xff0c;也就是说&#xff0c;每次点击跳转&#xff0c;都会向栈中压入一个新的地址&#xff0c;在点击返回时&#xff0c;可以返回到上一个打开的地址&#xff0c; 就像上图一样&#xff0c;我们每次返…

ssh工具 向指定的ssh服务器配置公钥

此文分享一个python脚本,用于向指定的ssh服务器配置公钥,以达到免密登录ssh服务器的目的。 效果演示 🔥完整演示效果 👇第一步,显然,我们需要选择功能 👇第二步,确认 or 选择ssh服务器 👇第三步,输入ssh登录密码,以完成公钥配置 👇验证,我们通过ssh登录…

【数据结构】什么是堆?

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 堆的概念及结构 堆的定义如下: n个元素的序列{k1,k2,...,kn}当且仅当满足以下关系时,称之为堆. 或 把这个序列对应的一维数组(即以一维数组作此序列的存储结构)看成是一个…

医保购药小程序:智能合约引领医疗数字革新

在医疗领域&#xff0c;医保购药小程序通过引入智能合约技术&#xff0c;为用户提供更为高效、安全的购药体验。本文将通过简单的智能合约代码示例&#xff0c;深入探讨医保购药小程序如何利用区块链技术中的智能合约&#xff0c;实现医保结算、购药监控等功能&#xff0c;为医…

概率中的 50 个具有挑战性的问题 [05/50]:正方形硬币

一、说明 我最近对与概率有关的问题产生了兴趣。我偶然读到了弗雷德里克莫斯特勒&#xff08;Frederick Mosteller&#xff09;的《概率论中的五十个具有挑战性的问题与解决方案》&#xff09;一书。我认为创建一个系列来讨论这些可能作为面试问题出现的迷人问题会很有趣。每篇…

Chrome浏览器http自动跳https问题

现象&#xff1a; Chrome浏览器访问http页面时有时会自动跳转https&#xff0c;导致一些问题。比如&#xff1a; 开发阶段访问dev环境网址跳https&#xff0c;后端还是http&#xff0c;导致接口跨域。 复现&#xff1a; 先访问http网址&#xff0c;再改成https访问&#xf…

如何实现https密钥对登录方式

先安装docker yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo systemctl start docker.service systemctl enable docker.service yum install -y docker…

C++的面向对象学习(6):运算符的重载

文章目录 前言&#xff1a;什么是运算符重载&#xff1f;针对自定义的类与对象类型。一、加号的运算符重载1.引入背景2.所以运算符重载的作用&#xff1a;3.实现对象间的相加代码&#xff1a;号运算符重载①在类中实现加号运算符重载②设计全局函数实现加号运算符重载③改写函数…

JuiceSSH结合内网穿透实现公网远程访问本地Linux虚拟机

文章目录 1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? cpolarJuiceSSH 实现手机端远程连接Linux虚拟机(内网穿透,手机端连接Linux虚拟机) …

释放云服务器ECS实例

目录 云服务器ECS 释放设置 云服务器ECS 当你不想继续使用云服务器ECS&#xff0c;可以直接释放这个实例&#xff0c;但是需要注意的是实例释放后数据无法恢复&#xff0c;免费领取的实例也不能再次领取&#xff0c;一定谨慎进行ECS实例的释放&#xff0c;具体释放限制和建议…

C++ 比 C语言的新增的特性 1

1. C是C的增强 1.1 C是静态类型的语言&#xff0c;具有严格的数据类型检查 1.1.1 c 因为const修饰的变量不允许修改&#xff0c;但是只给了警告&#xff0c;不严谨 const int a10;a20; //报错int *p&a;*p20;//a的值&#xff1f; test1.c:6:9: warning: initialization dis…

【网络安全 | MD5截断比较】PHP、Python脚本利用

前言 在解题中&#xff0c;当遇到类似 substr(md5(a),-6,6) 7788这样的MD5截断比较的题目时&#xff0c;只有求出a的值才能进行接下来的操作。 一个一个去猜是不可能的&#xff0c;通常使用脚本解决&#xff0c;文末给出实战案例。 PHP循环脚本 <?phpfor($i1;$i<9…

【网络奇遇记】揭秘计算机网络的性能指标:速率|带宽|吞吐量|时延

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 速率1.1 数据量1.2 速率 二. 带宽三. 吞吐量四. 时延4.1 发送时延4.2 传播时延…

SpringMVC之跨域请求

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 SpringMVC之跨域请求 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、什么是同源策略…

【C# 技术】 C# 常用排序方式——常规数据排序

C# 常用排序方式——常规数据排序 前言 在最近的项目中经常会对C#中的数据进行排序&#xff0c;对于基本数据类型&#xff0c;其排序方式比较简单&#xff0c;只需要调用内置算法即可实现&#xff0c;但对于自定义数据类型以及自定义排序规则的情况实现起来就比较麻烦&#…

这款APP,在离线环境下也能查看倾斜模型、点云等数据

《四维轻云-离线版》APP是基于移动端开发的轻量化地理空间数据应用平台&#xff0c;实现了用户对空间数据场景的制作和应用。 目前&#xff0c;已涵盖的数据类型包括倾斜模型(.osgb)、激光点云(.las)、正射影像(dom)、数字高程模型(dem)、矢量数据(shp)、人工模型&#xff08;…

IntelliJ IDEA 2023.3 安装教程

引言 IntelliJ IDEA&#xff0c;通常简称为 IDEA&#xff0c;是由 JetBrains 开发的一款强大的集成开发环境&#xff0c;专为提升开发者的生产力而设计。它支持多种编程语言&#xff0c;包括 Java、Kotlin、Scala 和其他 JVM 语言&#xff0c;同时也为前端开发和移动应用开发提…

TCP:IP原理

TCP/IP 原理 TCP/IP 协议不是 TCP 和 IP 这两个协议的合称&#xff0c;而是指因特网整个 TCP/IP 协议族。从协议分层模型方面来讲&#xff0c;TCP/IP 由四个层次组成&#xff1a;网络接口层、网络层、传输层、应用层。 网络访问层(Network Access Layer) 网络访问层(Network …