当前位置: 首页 > news >正文

从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

相关文章:

从Maven初级到高级

一.Maven简介 Maven 是 Apache 软件基金会组织维护的一款专门为 Java 项目提供构建和依赖管理支持的工具。 一个 Maven 工程有约定的目录结构&#xff0c;约定的目录结构对于 Maven 实现自动化构建而言是必不可少的一环&#xff0c;就拿自动编译来说&#xff0c;Maven 必须 能…...

orangepi--开发板配置网络SSH登录

常用指令&#xff1a; ifconfig-------------------------------------查看网络地址 sudo passwd orangepi-------------------------改密码 nmcli dev wifi-------------------------------查看wifi nmcli dev wifi connect xx password xx--------连接网络 ip addr show wla…...

简单通讯录管理系统第4关:简单通讯录管理系统之修改通讯录用户信息

任务描述 本关任务&#xff1a;实现修改通讯录用户电话号码的功能。 编程要求 仔细阅读右侧编辑区内给出的代码框架及注释&#xff0c;在 Begin-End 中实现通讯录管理系统中修改用户信息的功能&#xff0c;具体要求如下&#xff1a; 在 PhoneManage.java 类定义一个 changeP…...

macOS编译ckb-next

macOS x86 成功&#xff0c;下一步&#xff0c;测试&#xff1a;m1、m2、m3 。 1、Homebrew # 三选一 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" # /bin/bash -c "$(curl -fsSL https://raw.gith…...

漏刻有时数据可视化Echarts组件开发(46)散点图颜色判断

series组件 series: [{name: Top 5,type: scatter,coordinateSystem: bmap,data: convertData(data.sort(function (a, b) {return b.value - a.value;}).slice(0, 6)),symbolSize: 20,encode: {value: 2},showEffectOn: render,rippleEffect: {brushType: stroke},label: {fo…...

智能优化算法应用:基于驾驶训练算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于驾驶训练算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于驾驶训练算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.驾驶训练算法4.实验参数设定5.算法结果6.…...

【论文阅读】MCANet: Medical Image Segmentation with Multi-Scale Cross-Axis Attention

文章目录 摘要创新点总结实现效果总结 摘要 链接&#xff1a;https://arxiv.org/abs/2312.08866 医学图像分割是医学图像处理和计算机视觉领域的关键挑战之一。由于病变区域或器官的大小和形状各异&#xff0c;有效地捕捉多尺度信息和建立像素间的长距离依赖性至关重要。本文提…...

机器视觉实战应用:手势、人脸、动作以及手势鼠标构建(一)

CV实战应用手势、人脸、动作以及手势鼠标构建&#xff08;一&#xff09;总起 核心思想 手势识别是一种常见的计算机视觉应用&#xff0c;它可以通过摄像头或者预先录制的视频图像来追踪和识别人类手势。手势识别的应用非常广泛&#xff0c;例如在游戏、虚拟现实、人机交互等…...

python作业题百度网盘,python作业答案怎么查

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python作业题百度网盘&#xff0c;python作业答案怎么查&#xff0c;今天让我们一起来看看吧&#xff01; 1 以下代码的输出结果为&#xff1a; alist [1, 2, 3, 4] print(alist.reverse()) print(alist) A.[4, 3, 2, …...

centos7.9中离线安装nginx开启ssl,arm架构

一、首先需要去国内相关镜像库下载相关依赖rpm&#xff1a; http://mirrors.bfsu.edu.cn/centos-altarch/7.9.2009/os/aarch64/ http://mirror.nju.edu.cn/centos-altarch/7.9.2009/os/aarch64/ http://mirrors.tuna.tsinghua.edu.cn/centos-altarch/7.9.2009/os/aarch64/ htt…...

LENOVO联想笔记本小新Pro 14 IRH8 2023款(83AL)电脑原装出厂Win11系统恢复预装OEM系统

链接&#xff1a;https://pan.baidu.com/s/1M1iSFahokiIHF3CppNpL4w?pwdzr8y 提取码&#xff1a;zr8y 联想原厂系统自带所有驱动、出厂主题壁纸、Office办公软件、联想电脑管家等自带的预装软件程序 所需要工具&#xff1a;16G或以上的U盘 文件格式&#xff1a;ISO 文件…...

blender使用faceit绑定自己的表情动作

blender使用faceit绑定自己的表情控制模型 faceit是个神器&#xff0c;来记录一下如何让表情动起来保持相对位置头部分离&#xff0c;方便后续绑定faceitfaceit的注册rig生成地标Animate可以修正表情烘培之前记得保存使用Faceit的整个流程 faceit是个神器&#xff0c;来记录一下…...

有关List的线程安全、高效读取:不变模式下的CopyOnWriteArrayList类、数据共享通道:BlockingQueue

有关List的线程安全 队列、链表之类的数据结构也是极常用的&#xff0c;几乎所有的应用程序都会与之相关。在java中&#xff0c; ArrayList和Vector都使用数组作为其内部实现。两者最大的不同在与Vector是线程安全的。 而ArrayList不是。此外LinkedList使用链表的数据结构实现…...

OCC服务器和BCC服务器中文件同步

OCC服务器到BCC服务器文件正向同步 需求&#xff1a;编写shell脚本&#xff0c;使用rsync命令来同步目录&#xff0c;把全部需要同步的目录放在配置文件中&#xff0c;设置定时任务自动同步 服务器IP&#xff1a; 服务器类型IP地址OCC服务器192.168.1.188BCC服务器192.168.1…...

工具系列:TimeGPT_(2)使用外生变量时间序列预测

文章目录 TimeGPT使用外生变量时间序列预测导入相关工具包预测欧美国家次日电力价格案例 TimeGPT使用外生变量时间序列预测 外生变量在时间序列预测中非常重要&#xff0c;因为它们提供了可能影响预测的额外信息。这些变量可以包括假日标记、营销支出、天气数据或与你正在预测…...

应用于前端的自然断点法:wasm应用示例

某月某日&#xff0c;虾神本虾接到了这样一个需求&#xff0c;前端获取数据之后&#xff0c;在渲染之前&#xff0c;要对数据进行分类&#xff0c;分类的方法可以选择常用几种&#xff0c;例如等距法、自然断点法、标准差分类法等…… 问&#xff1a;为什么要在前端&#xff1…...

web前端javaScript笔记——(6)数组

对象一般分为内建对象&#xff0c;宿主对象&#xff0c;自定义对象。 数组(Array) 数组也是一个对象 它和我们普通对象功能类似&#xff0c;也是用来存储一些值的 不同的是普通对象是使用字符串作为属性名的&#xff0c;而数组时使用数字来作为索引操作元素案引: 从0开始的…...

vue的props

Vue的props是组件之间传递数据的一种方式&#xff0c;可以在组件中定义props并接收外部传递的数据。 在父组件中使用子组件时&#xff0c;可以使用v-bind指令将数据传递给子组件的props。子组件中可以通过props属性接收并使用这些数据。 父组件中&#xff1a; <template&…...

【51单片机系列】DS18B20温度传感器模块

本文是关于温度传感器的相关内容。 文章目录 一、 DS18B20数字温度传感器介绍1.1、 DS18B20温度传感器的特点1.2、DA18B20内部结构1.3、 DS18B20的温度转换规则1.4、 DS18B20的ROM指令表1.6、 计算温度1.7、 读写时序 二、DS18B20使用示例 一、 DS18B20数字温度传感器介绍 DS1…...

ubuntu20.04 conda环境配置Mask2former记录

建议先看完再按照步骤安装 代码地址&#xff1a;GitHub - facebookresearch/Mask2Former: Code release for "Masked-attention Mask Transformer for Universal Image Segmentation" 一、配置环境 1、创建虚拟环境 conda create -n mask2former python3.8conda …...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...