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

项目管理工具 Maven

目录

1.Maven的概念

1.1​​​​​什么是Maven

1.2什么是依赖管理

1.3什么是项目构建

1.4Maven的应用场景 

 1.5为什么使用Maven

1.6Maven模型 

 2.初识Maven

2.1Maven安装

2.1.1安装准备

 2.1.2Maven安装目录分析

 2.1.3Maven的环境变量

 2.2Maven的第一个项目

2.2.1按照约定创建Maven项目目录

 2.2.2在项目Hello根目录建立pom.xml

2.2.3创建Hello.java文件

2.2.4创建HelloTest.java文件

2.2.5进行maven的项目操作

2.3​​​​​​​Maven的第二个项目

2.3.1按照约定创建Maven项目目录

 2.3.2在项目HelloFriend根目录建立pom.xml

2.3.3创建HelloFriend.java文件

2.3.4创建HelloFriendTest.java文件

2.3.5测试打包HelloFriend项目

2.4Maven仓库配置

2.4.1Maven仓库概念

2.4.2Maven本地仓库配置

 2.5IDEA整合Maven项目

2.5.1IDEA的Maven全局配置

2.5.2IDEA创建Maven的Java项目

2.5.3IDEA创建Maven的Java web项目

2.5.4IDEA导入既有Maven项目

2.6Maven项目视图

3.Maven进阶

3.1pom.xml文件

3.2坐标

3.2.1坐标的概念

3.2.2坐标的意义

3.2.3坐标的含义

3.2.4自己项目的坐标

3.2.5第三方项目坐标

3.3依赖

3.3.1依赖的意义

3.3.2依赖的使用

3.3.3第三方依赖的查找方法

3.4依赖范围

3.5依赖传递和可选依赖

3.5.1依赖传递

3.5.2依赖范围对传递依赖的影响

3.5.3依赖阻断

3.5.4可选依赖

3.6仓库

3.6.1仓库的概念

3.6.2本地仓库

3.6.3中央仓库

3.6.4依赖搜索顺序

3.7生命周期

3.7.1生命周期的概念

3.7.2完整生命周期 

3.8Maven的插件

3.9Maven继承和聚合

3.9.1继承的意义

3.9.2可继承的POM元素 

3.9.3IDEA实现Maven的继承

3.9.4继承的依赖管理

3.9.5聚合管理

3.9.6properties属性的使用

4.maven私服架构

4.1maven私服介绍

4.1.1私服介绍

4.1.2Nexus介绍

4.2maven私服实战

4.2.1nexus安装

4.2.2nexus仓库类型

4.2.3将项目发布到私服

4.2.4从私服下载jar包 

4.2.5第三方jar包发布到私服


1.Maven的概念

1.1​​​​​什么是Maven

  • 翻译为“专家”,“内行”
  • Maven是跨平台项目管理工具。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。
  • 什么是理想的项目构建
    • 高度自动化,跨平台,可重用的组件,标准化的流程
  • 什么是依赖?为什么要进行依赖管理?
    • 自动下载,统一依赖管理
    • A1.0   依托于  B 2.0  依托于    C3.0
  • 有哪些项目信息
    • 项目名称描述等,开发人员信息,开发者信息等

1.2什么是依赖管理

对第三方依赖包的管理,可以连接互联网下载项目所需第三方jar包。

对自己开发的模块的管理,可以像引用第三方依赖包一样引用自己项目的依赖包。

1.3什么是项目构建

        项目构建:是一个从编写源代码到编译、测试、运行、打包、部署的过程。

        传统项目和maven项目构建的两种方式

        传统项目:

        打开Idea编写源代码和配置文件,对源代码进行编译,可以使用Junit进行单元测试,把项目打成war包,部署到Tomcat服务器中运行。

        maven项目:

        maven将项目构建过程进行标准化,每个阶段都可以使用一个命令来完成。

        清理 --> 编译 --> 测试 --> 报告 --> 打包 --> 部署

        好处:

        可以通过命令完成项目构建。(测试:使用mvn tomcat:run的命令来发布运行项目)

        maven对每个构建阶段进行规范,有利于大型团队协作开发。

1.4Maven的应用场景 

        maven的应用场景,开发人员只要按着maven标准的目录结构进行开发即可,然后提交代码。在测试服务器上拉取Java源码,然后可以使用maven的自动化项目构建完成项目的清理、编译、测试、打包和安装部署等。

 1.5为什么使用Maven

  • IDE?Eclipse?IDEA?
    • 手工操作较多,编译、测试、部署等工作都是独立的,很难一步完成
    • 每个人的IDE配置都不同,很容易就出错出现本地代码换个地方编译
  • Ant?
    • 没有一个约定的目录结构
    • 必须明确让ant做什么,什么时候做,然后编译,打包
    • 没有生命周期,必须定义目标及其实现的任务序列
    • 没有集成依赖管理
  • Maven?
    • 拥有约定,知道你的代码在哪里,放到哪里去
    • 拥有一个生命周期,例如执行 mvn install 就可以自动执行编译,测试,打包等构建过程
    • 只需要定义一个pom.xml,然后把源码放到默认的目录,Maven帮你处理其他事情
    • 拥有依赖管理,仓库管理

1.6Maven模型 

 2.初识Maven

2.1Maven安装

2.1.1安装准备

  • 安装jdk1.8或以上版本
  • 下载Maven
      • 地址:Download Apache Maven – Maven
      • 下载地址:Index of /dist/maven/maven-3/3.6.0/binaries
      • 版本:Maven3.6
  • 安装Maven
      • 解压到相应目录即可(无中文路径)

 2.1.2Maven安装目录分析

        bin:含有mvn运行的脚本

        boot:含有plexus-classworlds类加载器框架

        conf:含有settings.xml配置文件

        lib:含有Maven运行时所需要的java类库

        LICENSE.txt, NOTICE.txt, README.txt针对Maven版本,第三方软件等简要介绍

 2.1.3Maven的环境变量

        设置MAVEN_HOME环境变量

                升级时只需要下载最新版本,解压缩重新设置MAVEN_HOME环境变量即可

        设置MAVEN_OPTS环境变量

                -Xms128m -Xmx512m

        配置用户范围的settings.xml

                %MAVEN_HOME%/conf/settings.xml 全局的

                ~/.m2/settings.xml 单个用户的

设置MAVEN_HOME环境变量,把maven的解压后的路径添加为变量值

        设置Path环境变量,把 %MAVEN_HOME%\bin 添加到Path的变量值末尾,与前面的内容用 ; 隔开,如图:

配置MAVEN_OPTS运行环境变量大小,解决大型项目内存溢出的问题

找到命令改参数治标不治本

-Xms128m  -Xmx512m

 验证配置是否完成

 2.2Maven的第一个项目

2.2.1按照约定创建Maven项目目录

  • src/main/java —— 存放项目的.java文件 
  • src/main/resources —— 存放项目资源文件,如spring, mybatis配置文件 
  • src/test/java —— 存放所有测试.java文件,如JUnit测试类 
  • src/test/resources —— 测试资源文件 
  • target —— 项目输出位置 
  • pom.xml

 2.2.2在项目Hello根目录建立pom.xml

<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/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>cn.tx.maven</groupId><artifactId>Hello</artifactId><version>0.0.1-SNAPSHOT</version><name>Hello</name><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.9</version><scope>test</scope></dependency>		</dependencies>
</project>

2.2.3创建Hello.java文件

        在src/main/java/cn/tx/maven目录下新建文件Hello.java

package cn.tx.maven;
public class Hello {public String sayHello(String name){return "Hello "+name+"!";}
}

2.2.4创建HelloTest.java文件

        在/src/test/java/cn/tx/maven目录下新建测试文件HelloTest.java

package cn.tx.maven;
import org.junit.Test;
import static junit.framework.Assert.*;
public class HelloTest {@Testpublic void testHello(){Hello hello = new Hello();String results = hello.sayHello("maven");assertEquals("Hello maven!",results);		}
}

2.2.5​​​​​​​进行maven的项目操作

  1. 打开cmd命令行,进入Hello项目根目录执行 mvn compile命令,查看根目录变化
  2. cmd 中继续录入mvn clean命令,然后再次查看根目录变化
  3. cmd 中录入 mvn clean compile命令, 查看根目录变化
  4. cmd 中录入 mvn clean test命令,查看根目录变化
  5. cmd 中录入 mvn clean package命令,查看根目录变化
  6. cmd 中录入 mvn clean install 查看仓库会把项目安装到仓库里

2.3​​​​​​​​​​​​​​Maven的第二个项目

2.3.1按照约定创建Maven项目目录

        HelloFriend
        --src
        -----main
        ----------java
        ----------resources
        -----test
        ---------java
        ---------resources
        --pom.xml

 2.3.2在项目HelloFriend根目录建立pom.xml

        在项目HelloFriend根目录建立pom.xml

<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/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>cn.tx.maven</groupId><artifactId>HelloFriend</artifactId><version>0.0.1-SNAPSHOT</version><name>HelloFriend</name><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.9</version><scope>test</scope></dependency>		<dependency><groupId>cn.tx.maven</groupId><artifactId>Hello</artifactId><version>0.0.1-SNAPSHOT</version><scope>compile</scope></dependency>		</dependencies>
</project>

2.3.3创建HelloFriend.java文件

        在src/main/java/cn/tx/maven目录下新建文件HelloFriend.java

package cn.tx.maven;import cn.tx.maven.Hello;public class HelloFriend {public String sayHelloToFriend(String name){Hello hello = new Hello();String str = hello.sayHello(name)+" I am "+this.getMyName();System.out.println(str);return str;}public String getMyName(){return "John";}}

2.3.4创建HelloFriendTest.java文件

        在/src/test/java/cn/tx/maven目录下新建测试文件HelloFriendTest.java

package cn.tx.maven;import static junit.framework.Assert.assertEquals;import org.junit.Test;import cn.tx.maven.Hello;public class HelloFriendTest {@Testpublic void tesHelloFriend(){HelloFriend helloFriend = new HelloFriend();String results = helloFriend.sayHelloToFriend("zhangsan");assertEquals("Hello zhangsan! I am John",results);		}
}

2.3.5测试打包HelloFriend项目

        在HelloFriend目录下执行命令mvn package

        系统报错提示:Could not find artifact cn.tx.maven:Hello:jar:0.0.1-SNAPSHOT,表示无法找到HelloFriend所依赖的Hello 0.0.1-SNAPSHOT.jar

        故此我们需要重新构建第一个项目Hello并安装到数据仓库,在命令行Hello根目录下执行mvn clean install

        对Hello项目进行清理并安装后,对HelloFriend项目再次进行打包

        可以看到本次打包成功,说明HelloFriend项目已经可以加载Hello项目所打包的jar包

2.4Maven仓库配置

2.4.1Maven仓库概念

  • 何为Maven仓库?
    • 用来统一存储所有Maven共享构建的位置就是仓库
  • Maven仓库布局
    • 根据Maven坐标定义每个构建在仓库中唯一存储路径
    • groupId/artifactId/version/artifactId-version.packaging
  • 仓库的分类
    • 本地仓库
      • ~/.m2/repository/ 可修改
      • 每个用户只有一个本地仓库
    • 远程仓库
      • 中央仓库:Maven默认的远程仓库
      • http://repo1.maven.org/maven2
      • 私服:是一种特殊的远程仓库,它是架设在局域网内的仓库

2.4.2Maven本地仓库配置

1.全局本地仓库(所有操作系统用户均影响)

%MAVEN_HOME%\conf\settings.xml文件,修改该文件会影响所有使用该Maven的用户的本地仓库,例如:

 2.用户本地仓库(仅影响使用该配置文件的用户或程序)

        该文件可以在任意目录,例如:

3.修改配置文件设置Maven本地仓库(以全局设置为例)

编辑D:\TOOLS\maven\apache-maven-3.5.4\conf\settings.xml文件

找到如下位置:

        修改为: 

保存退出即可

以上配置表示所有使用该Maven的程序或用户,如未单独配置,则默认加载以上目录的本地库文件;

Ps:课程提供本地库文件为shoprapository.zip,如果遇到打包不成功,jar包无法下载等情况,优先进行本地库配置,避免因网络导致的maven依赖包问题.

 2.5IDEA整合Maven项目

2.5.1IDEA的Maven全局配置

        启动IDEA后找到Settings

以上设置完成表示在本idea上,所有项目如未对Maven的配置进行单独配置,则默认均使用该Maven版本和本地库设置;

2.5.2IDEA创建Maven的Java项目

至此Maven的Java项目创建完成

测试Maven的jar包引入

 以上,在IDEA上使用Maven进行Java项目的创建及测试已完成!

2.5.3IDEA创建Maven的Java web项目

配置完毕后会进行web项目的初始化,初始化过程取决于本地库是否已生成及网络情况,推荐使用课程提供的Maven本地库

如果创建项目速度非常慢,并且在Generating project in Batch mode卡住,则进行全局设置如下:

-DarchetypeCatalog=local

以上web项目则创建成功,接下来需要进行一些配置来确定web项目可以正常运行

添加war包的方法:

 

配置web服务器

添加本地tomcat配置 

 

测试项目运行

至此,在IDEA上使用Maven配置的Java web工程已经完成配置 

2.5.4IDEA导入既有Maven项目

        以导入刚才的Maven项目的例子做示范:

        导入引入依赖Hello项目的HelloFriend项目,可以看到Hello项目已经被打成jar包引用到HelloFriend的Maven依赖中

2.6Maven项目视图

        Maven项目视图主要用于查看该maven项目的各项属性,同时也可以进行一些常见的maven的操作,比如打包,清理,测试等等;

3.Maven进阶

3.1pom.xml文件

        就像 Make 的 MakeFile、Ant 的 build.xml 一样,Maven 项目的核心是 pom.xml。POM( Project Object Model,项目对象模型 ) 定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。Gredele

3.2坐标

3.2.1坐标的概念

        在 Maven 中坐标是构件的唯一标识,Maven 坐标的元素包括 groupIdartifactIdversion、packaging、classifier。上述5个元素中,groupId、artifactId、version 是必须定义的,packaging 是可选的 ( 默认为 jar )。

3.2.2坐标的意义

  • Maven世界拥有大量构建,我们需要找一个用来唯一标识一个构建的统一规范
  • 拥有了统一规范,就可以把查找工作交给机器

3.2.3坐标的含义

  • groupId:组织标识,一般为:公司网址的反写+项目名
  • artifactId:项目名称,一般为:项目名-模块名
  • version:版本号 形式为0.0.1-SNAPSHOT:
  • 第一个 0 表示大版本号,第二个 0 表示分支版本号,第三个 0 表示小版本号
  • SNAPSHOT -- 快照版本,ALPHA -- 内侧版本,BETA -- 公测版本,RELEASE -- 稳定版本,GA -- 正式发布
  • packaging:打包的方式,如:pom, jar, maven-plugin, ejb, war, ...
  • clissifier:用来帮助定义构件输出的一些附属构件。

3.2.4自己项目的坐标

3.2.5第三方项目坐标

3.3依赖

3.3.1依赖的意义

        当编写Java代码时,我们总是需要一些库,例如,做单元测试我们需要JUnit库。对于更大的项目,我们可能需要创建自己的库并在不同的部分使用它的项目。不同的项目需要不同版本的库。 保持项目最新的库JAR文件的正确版本不是一个容易的任务。

        每个外部JAR可能还依赖于其他外部JAR文件等。以递归方式下载所有这些外部依赖JAR文件并确保下载正确的版本是一项巨大的任务。

        当项目越来越大,我们将需要越来越多的外部依赖。

        Maven将下载它们并将它们放在您的本地Maven存储库中。

        我们可以在POM文件中的dependencies元素内指定依赖关系。

3.3.2依赖的使用

        例如我们的项目需要进行单元测试,则需要使用到junit-4.9.jar包,使用maven引用该依赖的方式如下:

属性说明: 

  • 三维坐标:引用依赖包的三维坐标,用来定位该依赖包;
  • scope: 控制该依赖包在什么情况下会被加到 classpath 中;

3.3.3第三方依赖的查找方法

        我们在不确定所需引用的第三方依赖包的坐标时,通过maven的中央仓库进行查找,网址: https://mvnrepository.com/;

        以mybatis举例:

3.4依赖范围

Maven项目在开发工程中有三套classpath

  • 主代码:main下面的都是主代码在编译的时候的依赖
  • 测试代码:test下是测试代码编译的时候的依赖
  • 运行时:main代码在运行的时候对包的依赖

依赖范围的使用,通过在引用第三方依赖时的<scope></scope>标签进行设置,例如:

共 6 种 scope,包括:compileprovidedruntimetest、system、import。例如上图的junit,只在测试中使用,则选择test即可,默认为compile

  • Compile:编译依赖范围。默认使用此依赖范围,其下的maven依赖,对于编译,测试,运行classpath都有效。
  • Test:测试依赖范围。只对测试classpath有效,编译主代码或运行项目时无法使用此依赖。典型例子如junit。
  • Provided:已提供依赖范围。其对于编译与测试classpath有效,运行时无效。如在web开发时,只有在编译和测试时才用到servlet-api,将其设置为此范围,在运行时servlet-api由web容器提供,无须依赖。并且在打war包时,此范围的依赖不会打在WEB-INF/lib下。
  • Runtime:运行时依赖范围。与provided相对,运行时classpath有效。典型例子如jdbc编写是接口规范运行是提供具体实现类需要jar包

3.5依赖传递和可选依赖

3.5.1依赖传递

应用场景:

第一直接依赖:  HelloFriend项目依赖Hello项目 

第二直接依赖:  MakeFriend项目依赖HelloFriend项目

3.5.2依赖范围对传递依赖的影响

        传递依赖是会受到依赖范围的影响的,具体来看结果如下:

3.5.3依赖阻断

        我们使用

        例如我们在HelloFriend项目里面的Hello依赖处添加该配置

则makeFriend项目里面就不会再引入Hello的依赖

3.5.4可选依赖

        如果我们需要在依赖中明确的排除掉某一依赖,则可以使用exclusion属性,排除掉引用的依赖,如图: 

3.6仓库

3.6.1仓库的概念

在 Maven 的术语中,仓库是一个位置(place)。

Maven 仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库。

在 Maven 中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。

Maven 仓库能帮助我们管理构件(主要是JAR),它就是放置所有JAR文件(WAR,ZIP,POM等等)的地方。

仓库的类型有:

  • 本地(local)
  • 中央(central)
  • 远程(remote)

3.6.2本地仓库

        Maven 的本地仓库,在安装 Maven 后并不会创建,它是在第一次执行 maven 命令的时候才被创建。

        运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。

        默认情况下,不管Linux还是 Windows,每个用户在自己的用户目录下都有一个路径名为 .m2/respository/ 的仓库目录

        Maven 本地仓库默认被创建在 %USER_HOME% 目录下。要修改默认位置,在 %Maven_HOME%\conf 目录中的 Maven 的 settings.xml 文件中定义另一个路径。

3.6.3中央仓库

        Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量常用的库。

        中央仓库包含了绝大多数流行的开源Java构件,以及源码、作者信息、SCM、信息、许可证信息等。一般来说,简单的Java项目依赖的构件都可以在这里下载到。

        中央仓库的关键概念:
                这个仓库由 Maven 社区管理。
                不需要配置。
                需要通过网络才能访问。

3.6.4依赖搜索顺序

3.7生命周期

3.7.1生命周期的概念

        Maven的生命周期是对所有的构建过程进行抽象和统一。Maven的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,生命周期只是定义了一系列的阶段,并确定这些阶段的执行顺序。而在执行这些阶段时,实际的工作还是由插件来完成的。这种思想与设计模式中的模板方法非常相似。

Maven有三套相互独立的生命周期:

  • Clean
      • clean生命周期的目的是清理项目
  • Default
      • default生命周期的目的是构建项目
  • site
      • site生命周期的目的是建立项目站点。

3.7.2完整生命周期 

生命周期

clean

default

site

阶段(phase),执行顺序由上至下

pre-clean

validate

pre-site

clean

initialize

site

post-clean

generate-sources

post-site

process-sources

site-deploy

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

        用户在mvn命令后可以指定三个生命周期中的任何阶段,则Maven会按以下逻辑执行:首先会得到该阶段所属生命周期,从该生命周期中的第一个阶段开始按顺序执行,直至该阶段本身。例如执行mvn clean命令会依次执行clean生命周期中的pre-clean阶段及clean阶段。mvn命令后可以指定多个阶段,Maven会按照输入的顺序依次执行,每次执行都会按照之前描述的逻辑执行。

        之前提到实际的工作还是由插件来完成的,这意味着插件需要和阶段绑定起来。Maven已经事先将很多核心插件绑定到对应的阶段,这样用户几乎不用配置就有构建Maven项目。Maven的内置绑定如下:

生命周期

阶段(phase)

插件目标

clean

clean

maven-clean-plugin:clean

default

process-resources

maven-resources-plugin:resources

compile

maven-compiler-plugin:compile

generate-test-resources

maven-resources-plugin:testResouces

test-compile

maven-compiler-plugin:testCompile

test

maven-surefire-plugin:test

package

打包类型是jar时:maven-jar-plugin:jar;

打包类型是war时:maven-war-plugin:war

install

maven-install-plugin:install

deploy

maven-deploy-plugin:deploy

site

site

maven-site-plugin:site

site-deploy

maven-site-plugin:deploy

3.8Maven的插件

3.9Maven继承和聚合

3.9.1继承的意义

        继承就是避免重复,maven的继承也是这样,它还有一个好处就是让项目更加安全。比如我们在项目开发的过程中,可能多个模块独立开发,但是多个模块可能依赖相同的公共模块,比如说每个模块都需要javaseo-utils,在编译的时候,maven-compiler-plugin插件也要被引入,maven仓库地址以及发布目录都是相同的配置。我们可以使用Maven的继承功能,把公共的配置信息写到父模块中,子模块只要继承了该父模块,也会继承父模块的配置信息。

3.9.2可继承的POM元素 

groupId :项目组 ID ,项目坐标的核心元素;

version :项目版本,项目坐标的核心元素;

description :项目的描述信息;

organization :项目的组织信息;

inceptionYear :项目的创始年份;

url :项目的 url 地址

develoers :项目的开发者信息;

contributors :项目的贡献者信息;

distributionManagerment :项目的部署信息;

issueManagement :缺陷跟踪系统信息;

ciManagement :项目的持续继承信息;

scm :项目的版本控制信息;

mailingListserv :项目的邮件列表信息;

properties :自定义的 Maven 属性;

dependencies :项目的依赖配置;

dependencyManagement :醒目的依赖管理配置;

repositories :项目的仓库配置;

build :包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等;

reporting :包括项目的报告输出目录配置、报告插件配置等。

3.9.3IDEA实现Maven的继承

        创建父类项目

        创建子类项目core

        以同样的方式创建manage和portal项目: 

        至此,一个由parent统一管理core,manage和portal的mavan项目就创建好了;

        观察父子项目的pom文件配置

3.9.4继承的依赖管理

        父类直接引用依赖,如果在父类的dependencies内直接引用依赖,则子类都会继承该依赖,以mybatis为例:

        父类通过dependencyManagement管理依赖,子类不会默认继承该依赖,但是当子类使用该依赖时无需考虑版本信息,直接继承父类dependencyManagement中设置的版本号(Version),以log4j为例: 

3.9.5聚合管理

        我们在平时的开发中,项目往往会被划分为好几个模块,比如common公共模块、system系统模块、log日志模块、reports统计模块、monitor监控模块等等。这时我们肯定会出现这么一个需要,我们需要一次构件多个模块,而不用每个模块都去mvn;

        以上面得父子项目为例,当我们对parent进行mvn install时,会对core,manage和portal项目均进行install操作:

3.9.6properties属性的使用

        通过 properties元素用户可以定义一个或多个 maven 属性,然后在 maven 的其他地方使用 ${属性名称} 的方式引用该属性,这种做法的意义在于消除重复和统一管理。比如,需要在多个地方重复声明同样的 SpringFramework 版本,现在只需要在一个地方声明就可以。

4.maven私服架构

4.1maven私服介绍

4.1.1私服介绍

        正式开发,不同的项目组开发不同的工程。maven-dao 工程开发完毕,发布到私服maven-service 从私服下载 dao

        公司在自己的局域网内搭建自己的远程仓库服务器,称为私服, 私服服务器即是公司内部的 maven 远程仓库, 每个员工的电脑上安装 maven 软件并且连接私服服务器,员工将自己开发的项目打成 jar 并发布到私服服务器,其它项目组从私服服务器下载所依赖的构件(jar)。

        私服还充当一个代理服务器,当私服上没有 jar 包会从互联网中央仓库自动下载

4.1.2Nexus介绍

        Nexus 是 Maven 仓库管理器, 通过 nexus 可以搭建 maven 仓库,同时 nexus 还提供强大的仓库管理功能,构件搜索功能等。

4.2maven私服实战

4.2.1nexus安装

1.解压资料中的nexus-2.12.0-01-bundle.zip文件,存放到一个不含中文的目录下。
查看conf
文件下的nexus.properties配置文件,可以修改对应的配置

2.nexus的安装命令:使用管理员运行cmd命令窗口,切换目录nexus\nexus-2.12.0-01\bin目录下,执行nexus.bat install进行安装。执行nexus.bat start 启动服务 执行nexus.bat stop停止服务

3.nexus的卸载命令:使用管理员运行cmd命令窗口,切换目录nexus\nexus-2.12.0-01\bin目录下,执行nexus.bat uninstall进行卸载

4.访问图形化界面:打开浏览器,输入http://localhost:端口号/nexus访问

5.点击log in,进行登录。用户名:admin 密码:admin123

4.2.2nexus仓库类型

        nexus提供了不同的仓库类型

1.hosted,宿主仓库, 部署自己的 jar 到这个类型的仓库,包括 releases 和 snapshot 两部分, Releases 公司内部发布版本仓库、 Snapshots 公司内部测试版本仓库
2.proxy,代理仓库, 用于代理远程的公共仓库,如 maven 中央仓库,用户连接私服,私服自动去中央仓库下载 jar 包或者插件。
3.group,仓库组,用来合并多个 hosted/proxy 仓库,通常我们配置自己的 maven 连接仓库组。Group仓库组也是可以自己进行定制的。

        4.virtual(虚拟):兼容 Maven1 版本的 jar 或者插件 

4.2.3将项目发布到私服

        需要在客户端即部署要部署的工程电脑上配置 maven 环境,并修改
settings.xml 文件, 配置连接私服的用户和密码 。

        此用户名和密码用于私服校验,因为私服需要知道上传的账号和密码是否和私服中的账号和密码一致。

        在servers节点下进行配置

<!-- 定义稳定版本的id名称,用户名密码 -->
<server><id>releases</id><username>admin</username><password>admin123</password>
</server>
<!-- 定义开发版本的id名称,用户名密码 -->
<server><id>snapshots</id><username>admin</username><password>admin123</password>
</server>

        配置项目 pom.xml,配置私服仓库的地址,本公司的自己的 jar 包会上传到私服的宿主仓库,根据工程的版本号决定上传到哪个宿主仓库,如果版本为 release 则上传到私服的 release 仓库,如果版本为snapshot 则上传到私服的 snapshot 仓库。

<distributionManagement><repository><id>releases</id><url>http://localhost:8079/nexus/content/repositories/releases/</url></repository><snapshotRepository><id>snapshots</id><url>http://localhost:8079/nexus/content/repositories/snapshots/</url></snapshotRepository>
</distributionManagement>

        注意:这里的 id 标签的值要和 settings.xml配置文件中的id值保持一致。

        在该工程中执行deploy命令,发布项目到私服上。

        查看私服结果

        可以发布RELEASES稳定版本的jar包到私服。 

        查看私服结果 

4.2.4从私服下载jar包 

        在settings.xml配置文件配置私服的镜像文件

<mirror><!-- id名称 --><id>nexusmaven</id><!-- 表示拦截所有的请求,都重定向到私服,从私服下载jar包,私服没有再去中央仓库下载 --><mirrorOf>*</mirrorOf>  <name>nexus maven</name><!-- 私服的组地址 --><url>http://localhost:8079/nexus/content/groups/public/</url>      
</mirror>

        进行测试

        先把自己的某个项目发布到私服中,然后删除掉本地仓库中的jar包,再使用其他项目去依赖该jar包,查看是否从私服中下载。

        在其他项目中引入该坐标依赖。

<!--依赖demo1这个项目-->
<dependencies><dependency><groupId>cn.tx.maven</groupId><artifactId>txmaven_demo10413</artifactId><version>1.0-RELEASES</version></dependency>
</dependencies>

        还有一种方式,可以配置仓库的方式,可以修改自己项目的pom配置文件,添加仓库的配置。

<repositories><repository><id>nexus</id><name>nexusmaven</name><url>http://localhost:8079/nexus/content/groups/public/</url><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository>
</repositories>
<pluginRepositories><pluginRepository><id>public</id><url>http://localhost:8079/nexus/content/groups/public/</url><name>pluginRepositories</name></pluginRepository>
</pluginRepositories>

        上面的方式不是特别的理想,需要在每一个项目的pom文件中都添加相同的配置,比比较麻烦。可以在settings.xml配置文件中添加配置,完成统一的设置。

<!-- 下载jar包配置 --><profile> <!--profile的id --><id>dev</id><repositories><repository> <!--仓库id,repositories可以配置多个仓库,保证id不重复 --><id>nexus</id> <!--仓库地址,即nexus仓库组的地址 --><url>http://localhost:8079/nexus/content/groups/public/</url> <!--是否下载releases构件 --><releases><enabled>true</enabled></releases> <!--是否下载snapshots构件 --><snapshots><enabled>true</enabled></snapshots></repository></repositories><pluginRepositories> <!-- 插件仓库,maven的运行依赖插件,也需要从私服下载插件 --><pluginRepository> <!-- 插件仓库的id不允许重复,如果重复后边配置会覆盖前边 --><id>public</id><name>Public Repositories</name><url>http://localhost:8079/nexus/content/groups/public/</url></pluginRepository></pluginRepositories></profile>

        激活配置

<activeProfiles><activeProfile>dev</activeProfile>
</activeProfiles>

        进行测试

4.2.5第三方jar包发布到私服

把jar包安装到本地仓库

mvn install:install-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.1.37 -Dfile=fastjson-1.1.37.jar -Dpackaging=jar

把jar包上传到私服

先在settings.xml配置文件中配置用户名密码

<server><id>thirdparty</id><username>admin</username><password>admin123</password>
</server>

        上传到私服

mvn deploy:deploy-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.1.37 -Dpackaging=jar -Dfile=fastjson-1.1.37.jar -Durl=http://localhost:8079/nexus/content/repositories/thirdparty/ -DrepositoryId=thirdparty

-DartifactId=fastjson 名称不与本地仓库一致

-Dfile=fastjson-1.1.37.jar 用全路径

相关文章:

项目管理工具 Maven

目录 1.Maven的概念 1.1​​​​​什么是Maven 1.2什么是依赖管理 1.3什么是项目构建 1.4Maven的应用场景 1.5为什么使用Maven 1.6Maven模型 2.初识Maven 2.1Maven安装 2.1.1安装准备 2.1.2Maven安装目录分析 2.1.3Maven的环境变量 2.2Maven的第一个项目 2.2.1按照约…...

Nginx的反向代理(超详细)

正向代理与反向代理概念 1.概念&#xff1a; 反向代理服务器位于用户与目标服务器之间&#xff0c;但对用户而言&#xff0c;反向代理服务器就相当于目标服务器&#xff0c;即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时&#xff0c;用户不需要知道目标服务…...

当中国“智算心跳”与全球共振:九章云极DataCanvas首秀MWC 2025

3月3日&#xff0c;西班牙巴塞罗那&#xff0c;全球通信与科技领域的盛会“2025世界移动通信大会&#xff08;MWC 2025&#xff09;”正式拉开帷幕。中国人工智能基础设施领军企业九章云极DataCanvas公司以全球化战略视野与硬核技术实力&#xff0c;全方位、多维度地展示了在智…...

通义万相 2.1 携手蓝耘云平台:开启影视广告创意新纪元

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

springboot项目使用中创InforSuiteAS替换tomcat

springboot项目使用中创InforSuiteAS替换tomcat 学习地址一、部署InforSuiteAS1、部署2、运行 二、springboot项目打包成war包 特殊处理1、pom文件处理1、排除内嵌的tomcat包2、新增tomcat、javax.servlet-api3、打包格式设置为war4、打包后的项目名称5、启动类修改1、原来的不…...

有关Java中的IO(1) --字节流和File类

学习目标 ● 掌握常用的File类常用的方法 ● 掌握字节字符流的基本使用方法 1.File 1.1为什么要了解File ● 因为数据很重要所以我们要把数据永久化/持久化存储。 ● 之前开发都把数据存入了内存 ● 存储内存优势: 性能快 ● 弊端&#xff1a; 程序结束&#xff0c;数据消失…...

基于DeepSeek(本地部署)和RAGFlow构建个人知识库

总结自视频&#xff08;很强的小姐姐视频&#xff0c;讲解清晰明了&#xff09;&#xff1a;【知识科普】【纯本地化搭建】【不本地也行】DeepSeek RAGFlow 构建个人知识库_哔哩哔哩_bilibili 1. 背景 deepseek官方网页版也虽然很强&#xff0c;能够满足绝大部分需求&#xf…...

微信小程序文件缓存处理的完善方案

以下是微信小程序文件缓存处理的 完善方案&#xff0c;涵盖存储管理、缓存策略、清理机制和异常处理&#xff0c;确保高效、可靠的文件缓存系统&#xff1a; 一、文件缓存架构设计 1. **存储分层**&#xff1a;- **内存缓存**&#xff1a;存储高频访问的小文件&#xff08;Bas…...

Tailwind CSS 问题:npm error could not determine executable to run

问题与处理策略 问题描述 npx tailwindcss init -p在使用 Tailwind CSS 的前端项目中&#xff0c;执行上述指令&#xff0c;即初始化 Tailwind CSS 时&#xff0c;报如下错误 npm error could not determine executable to run# 报错npm 错误无法确定要运行的可执行文件问题…...

CAD2025电脑置要求

Windows 系统 操作系统&#xff1a;64 位 Microsoft Windows 11 和 Windows 10 version 1809 或更高版本。 处理器 基本要求&#xff1a;2.5-2.9GHz 处理器&#xff0c;不支持 ARM 处理器。 推荐配置&#xff1a;3GHz 以上处理器&#xff08;基础&#xff09;&#xff0c;4GHz …...

javascript字符串截取有哪些

在 JavaScript 中&#xff0c;字符串截取主要通过以下方法实现&#xff0c;每种方法有不同的特性&#xff0c;适用于不同场景&#xff1a; 1. slice(startIndex, endIndex) 功能&#xff1a;从 startIndex 到 endIndex&#xff08;不包含&#xff09;截取子字符串。特性&#…...

使用CSS Grid布局时,如何避免元素重叠?

使用CSS Grid布局时&#xff0c;如何避免元素重叠&#xff1f; 文章目录 使用CSS Grid布局时&#xff0c;如何避免元素重叠&#xff1f;1. 引言2. 元素重叠的常见原因2.1 显式定位错误2.2 使用 grid-auto-flow: dense2.3 网格区域定义不明确2.4 内容尺寸超出预期 3. 解决策略3.…...

ALG(Alloy+Loki+Grafana)轻量级日志系统

ALG(AlloyLokiGrafana)轻量级日志系统 前提要求 GrafanaMinioNginxPrometheus Grafana日志收集系统旧版是PLG(ProtailLokiGrafana), Protail收集日志, Loki存储, Grafana展示, 后续的Protail不维护了, Grafana推出了Alloy代替Pritial, 除了收集日志外, 还集成管理Prometheus各种…...

Golang的网络流量控制

# Golang的网络流量控制 什么是网络流量控制&#xff1f; 网络流量控制是指针对网络数据传输过程中的流量进行管理和调控的一种技术手段。通过网络流量控制&#xff0c;我们可以对网络中的数据传输速率、带宽使用情况、数据包丢失率等进行监控和调整&#xff0c;以达到优化网络…...

MRI学习笔记-Meta分析之SDM-PSI

软件介绍 软件下载&#xff1a;https://www.sdmproject.com/software/ 软件教程&#xff1a; https://zhoubolin.netlify.app/posts/sdm-psi/sdm-psi Meta-analysis of Voxel-Based Neuroimaging Studies using Seed-based d Mapping with Permutation of Subject Images (…...

Spring Boot 项目中 Redis 常见问题及解决方案

目录 缓存穿透缓存雪崩缓存击穿Redis 连接池耗尽Redis 序列化问题总结 1. 缓存穿透 问题描述 缓存穿透是指查询一个不存在的数据&#xff0c;由于缓存中没有该数据&#xff0c;请求会直接打到数据库上&#xff0c;导致数据库压力过大。 解决方案 缓存空值&#xff1a;即使…...

3-9 WPS JS宏单元格复制、重定位应用(拆分单表到多表)

************************************************************************************************************** 点击进入 -我要自学网-国内领先的专业视频教程学习网站 *******************************************************************************************…...

Java集合面试篇

目录 1.概念 1.1.数组与集合的区别&#xff0c;用过哪些&#xff1f; 1.2.说说Java中的集合&#xff1f; 1.3.Java中的线程安全的集合是什么&#xff1f; 1.4.集合遍历的方法有哪些&#xff1f; 2.List 2.1.list可以一边遍历一边修改元素吗&#xff1f; 2.2.Arraylist和…...

C++入门——命名空间

C入门——命名空间 本期内容&#xff0c;我们正式进入C专栏。前几期内容中&#xff0c;我们用C语言实现了一些数据结构&#xff0c;包括顺序表&#xff0c;单链表&#xff0c;双向循环链表&#xff0c;栈和队列等等&#xff0c;为C的学习打下了基础。从现在开始&#xff0c;让…...

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)示例3: 行选择

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…...

pytest结合allure

Allure 一、文档二、指令三、装饰器3.1 allure.step装饰器3.2 allure.description装饰器3.3 allure.title装饰器3.4 allure.link、allure.issue 和 allure.testcase装饰器3.5 allure.epic、allure.feature 和 allure.story装饰器3.6 allure.severity装饰器 一、文档 allure文档…...

C++入门基础

文章目录 C核心特性详解&#xff08;基础增强版&#xff09;一、第一个C程序&#xff1a;Hello World完整代码解析新手常见问题 二、命名空间&#xff08;详解版&#xff09;1. 为什么需要命名空间&#xff1f;2. 命名空间使用场景3. 嵌套命名空间4. 匿名命名空间 三、输入输出…...

《大语言模型的原理发展与应用》:此文为AI自动生成

《大语言模型的原理发展与应用》&#xff1a;此文为AI自动生成 一、引言&#xff1a;大语言模型&#xff0c;AI 时代的 “新引擎” 在当今数字化浪潮中&#xff0c;大语言模型宛如一颗璀璨的明星&#xff0c;照亮了人工智能发展的道路&#xff0c;成为推动各领域变革的核心驱…...

SpringCloud系列教程(十三):Sentinel流量控制

SpringCloud中的注册、发现、网关、服务调用都已经完成了&#xff0c;现在就剩下最后一部分&#xff0c;就是关于网络控制。SpringCloud Alibaba这一套中间件做的非常好&#xff0c;把平时常用的功能都集成进来了&#xff0c;而且非常简单高效。我们下一步就完成最后一块拼图Se…...

[MySQL初阶]MySQL(4)基本查询

标题&#xff1a;[MySQL初阶]MySQL&#xff08;4&#xff09;基本查询 水墨不写bug 文章目录 一. 数据表设计二、对数据表的操作1. Create 操作&#xff08;插入数据&#xff09;查看最近受影响的行数&#xff1a; 2. Retrieve 操作&#xff08;读取数据&#xff09;&#xff0…...

使用Open WebUI下载的模型文件(Model)默认存放在哪里?

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Ollama部署LLM专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2025年2月21日21点21分 &#x1f004;️文章质量&#xff1a;95分 文章目录 使用CMD安装存放位置 默认存放路径 Open WebUI下…...

Maven 私服的搭建与使用(一)

一、引言 在 Java 项目开发中&#xff0c;Maven 作为强大的项目管理和构建工具&#xff0c;极大地提高了开发效率&#xff0c;而 Maven 私服在开发过程中也扮演着至关重要的角色。私服是一种特殊的远程仓库&#xff0c;架设在局域网内&#xff0c;代理广域网上的远程仓库&…...

java每日精进 3.06 【多数据源】

数据库连接池&#xff08;Database Connection Pool&#xff09; 基本信息 是一种用于管理数据库连接的技术。它通过预先创建一定数量的数据库连接&#xff0c;并将其缓存在池中&#xff0c;供多个客户端或应用程序使用&#xff0c;从而减少了每次请求时连接数据库的开销。 …...

Leetcode 3469. Find Minimum Cost to Remove Array Elements

Leetcode 3469. Find Minimum Cost to Remove Array Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3469. Find Minimum Cost to Remove Array Elements 1. 解题思路 这一题我没啥特别好的思路&#xff0c;就只能动态规划了&#xff0c;倒是也能过&#xff0c;不过总…...

多线程-CompletableFuture

简介 CompletableFuture&#xff1a;异步任务编排工具。java 8中引入的一个类&#xff0c;位于juc包下&#xff0c;是Future的增强版。它可以让用户更好地构建和组合异步任务&#xff0c;避免回调地狱。 在CompletableFuture中&#xff0c;如果用户没有指定执行异步任务时的线…...

常用限流算法解析与实现

‌一、固定窗口计数器法‌ ‌原理‌&#xff1a;在固定时间窗口&#xff08;如1秒&#xff09;内统计请求次数&#xff0c;超过阈值则触发限流。 ‌Java实现‌&#xff1a; public class FixedWindowCounter { private static final long WINDOW_MS 1000; // 1秒窗口 priv…...

Swift系列02-Swift 数据类型系统与内存模型

Swift 是一门现代的、安全的编程语言&#xff0c;其类型系统和内存模型设计对性能和安全性有着重要影响。本文将深入探讨 Swift 的数据类型系统与内存模型&#xff0c;帮助你更好地理解并利用这些特性来优化你的 iOS 应用。本文主要包含&#xff1a; 值类型和引用类型&#xf…...

如何不重启,生效windows环境变量

场景 使用php 进行composer 时&#xff0c;composer 要求php7.2以上&#xff0c;我常用的是7.1&#xff0c;不想来回修改&#xff0c;还是重启电脑 临时修改 打印当前环境变量 echo %PATH%临时修改当前环境变量&#xff08;如果需要指定的值&#xff0c;可将全部复制出来&a…...

Ubuntu20.04本地配置IsaacLab 4.2.0的G1训练环境(二):训练与推理

Ubuntu20.04本地配置IsaacLab4 4.2.0的G1训练环境&#xff08;二&#xff09;&#xff1a;训练与推理 训练推理 写在前面&#xff0c;本文档的实现需要IsaacLab的成功安装&#xff0c;可参考&#xff08;一&#xff09;。 训练 在IsaacLab目录下&#xff0c;isaaclab的conda虚…...

设计模式说明

23种设计模式说明 以下是常见的 23 种设计模式 分类及其核心思想、应用场景和简单代码示例&#xff0c;帮助你在实际开发中灵活运用&#xff1a; 一、创建型模式&#xff08;5种&#xff09; 解决对象创建问题&#xff0c;降低对象耦合。 1. 单例模式&#xff08;Singleton&…...

K8s 1.27.1 实战系列(四)验证集群及应用部署测试

一、验证集群可用性 1、检查节点 kubectl get nodes ------------------------------------------------------ NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane 3h48m v1.27.1 k8s-node1 Ready <none> …...

Artec Leo+Ray II 三维扫描仪成功为VR展数字化30吨重设备-沪敖3D

挑战&#xff1a;在贸易展上展示重达30吨的机械设备&#xff0c;同时克服设备搬运和展示的难题&#xff0c;减轻物流负担。。 解决方案&#xff1a;Artec Leo、Artec Ray II、Artec Studio、Blender、Unity、Microsoft HoloLens、HTC VIVE PRO 效果&#xff1a;在虚拟展厅中&am…...

Redis 各数据类型使用场景详解

1. 字符串&#xff08;String&#xff09; 场景 1&#xff1a;计数器&#xff08;如文章阅读量&#xff09; 问题&#xff1a; 高并发下对同一数值进行增减操作时&#xff0c;需保证原子性&#xff0c;避免竞态条件导致数据不一致。 频繁读写可能成为性能瓶颈。 解决方案&a…...

spark写数据库用连接池找不到driver类

最近遇到一个很离谱的bug&#xff0c;在写spark代码把数据写到mysql的时候考虑到连接的开销&#xff0c;所以用了HikariCP连接池&#xff0c;但是无语的是程序执行死活加载不到mysql的Driver类&#xff0c;但是解压了jar看到mysql-conn包就在lib下面&#xff0c;版本也是5.x的没…...

上传文件到对象存储是选择前端还是后端

对于云上对象存储的上传方式选择&#xff08;前端直传或后端代理上传&#xff09;&#xff0c;需综合考虑安全性、性能、成本、业务需求等因素。 1. 推荐前端直传的场景 适用条件&#xff1a; 大文件上传&#xff08;如视频、大型数据集&#xff09;高并发场景&#xff08;如…...

NanoMQ ds笔记250306

NanoMQ多版本下载地址 https://www.emqx.com/zh/downloads/nanomq NanoMQ官方文档 https://nanomq.io/docs/zh/latest/ NanoMQ 是一个专为物联网边缘计算设计的轻量级、高性能 MQTT 消息代理&#xff08;Message Broker&#xff09;&#xff0c;由中国的开源物联网公司 EMQ 开…...

sqlmap:从基础用法到漏洞利用实战

1. sqlmap基础认知 sqlmap是一款开源的渗透测试工具&#xff0c;能自动检测和利用SQL注入漏洞&#xff0c;支持MySQL、Oracle、PostgreSQL等多种数据库管理系统。其设计旨在简化SQL注入检测流程&#xff0c;助力安全人员在复杂网络环境中快速定位与评估漏洞风险。它通过发送精…...

DFS学习笔记

题目描述 X 国王有一个地宫宝库。是 nm 个格子的矩阵。每个格子放一件宝贝。每个宝贝贴着价值标签。 地宫的入口在左上角&#xff0c;出口在右下角。 小明被带到地宫的入口&#xff0c;国王要求他只能向右或向下行走。 走过某个格子时&#xff0c;如果那个格子中的宝贝价值…...

C++ STL string容器全解析

一、引言 在 C 编程的广阔领域中&#xff0c;字符串处理是一项极为基础且频繁的操作。从简单的文本解析&#xff0c;到复杂的文件读取与处理&#xff0c;字符串几乎无处不在。而 C 中的 string 容器&#xff0c;就像是一把瑞士军刀&#xff0c;为我们处理字符串提供了强大而便…...

React基础之项目创建

项目创建 create-react-app 项目名(小写) 运行 pnpm run start 在React中&#xff0c;使用的语法格式是jsx&#xff0c;也就是js与html相结合的形式 import logo from ./logo.svg; import ./App.css; function App() { return ( <div className"App"> <head…...

迷你世界脚本道具接口:Item

道具接口&#xff1a;Item 彼得兔 更新时间: 2023-04-26 10:26:18 继承自 Actor 具体函数名及描述如下: 序号 函数名 函数描述 1 getItemName(...) 获取道具名称 2 getItemId(...) 获取actor对应的道具ID&#xff0c;如球类等 3 getDropItemNum(...) …...

Unity摄像机跟随物体

功能描述 实现摄像机跟随物体&#xff0c;并使物体始终保持在画面中心位置。 实现步骤 创建脚本&#xff1a;在Unity中创建一个新的C#脚本&#xff0c;命名为CameraFollow。 代码如下&#xff1a; using UnityEngine;public class CameraFollow : MonoBehaviour {public Tran…...

计算机毕业设计SpringBoot+Vue.js青年公寓服务平台(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

vue实现日历签到效果

在工作任务进行时&#xff0c;有一个签到日历的功能需求要实现&#xff0c;经过文档查询和样式优化实现了需求&#xff0c;在此记录一下。 技术背景&#xff1a;vue2vant(样式控件&#xff09; less 一个公共样式文件 html实现部分&#xff1a; <div class"calenderB…...

(十 八)趣学设计模式 之 观察者模式!

目录 一、 啥是观察者模式&#xff1f;二、 为什么要用观察者模式&#xff1f;三、 观察者模式的实现方式四、 观察者模式的优缺点五、 观察者模式的应用场景六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&#xff0c;…...