maven升级漏洞依赖jar包

news2024/11/23 23:55:41

最近在搞一些漏洞jar包升级,包括springboot、cloud等依赖,期间遇到了一些小坑,特此做这个记录一下。

目录

    • 1. 打印/获取该项目的依赖树
    • 2.判断依赖是否有漏洞
    • 3.版本兼容性查询
    • 4.常规依赖版本升级
    • 5.依赖升级
      • 5.1 jackson升级
      • 5.2 spring相关依赖、springboot、webflux依赖升级(无cloud)
      • 5.3 spring、springboot、springcloud相关依赖升级
      • 5.4 elasticsearch升级
    • 6.总结

1. 打印/获取该项目的依赖树

如果只是想打印当前项目的依赖树,最简单的方法就在在该项目(包含pom)的目录下执行maven命令mvn dependency:tree,要注意的点是:1.执行的目录下必须包含pom文件,且多模块的要在父pom所在目录下执行;2.需要在powershell下执行(idea里支持)
在这里插入图片描述
如果想打印出来并放到一个文件里,那么可以在项目目录下执行该命令

#mvn clean compile -q dependency:resolve -DoutputFile="文件存放目录地址\文件名字" -DappendOutput=true
mvn clean compile -q dependency:resolve -DoutputFile="D:\tree.dot" -DappendOutput=true

执行完上述命令后,就可以到对应目录下找到那个文件,里面就是你项目里的所有依赖。

//大概的样例就是这样子
// groupId:artifactId:依赖类型type:版本号version:依赖作用范围scope
com.fasterxml.jackson.core:jackson-databind:jar:2.13.4.2:compile
com.google.guava:failureaccess:jar:1.0.1:compile
org.springframework:spring-context:jar:5.3.20:compile

这里简单提供一个解析上面txt的文件并转成xml的代码

		<!-- 先添加excel依赖 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>5.0.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.0.0</version>
        </dependency>

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;

import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

public class ExcelUtil {

    public static void main(String[] args) {
		// 前面获取的tree文件
        File file = new File("D:\\tree.dot");
        // 读取文件
        List<String> results = readTxt(file);
        Collections.sort(results);
        List<String[]> rowList = results.stream().sorted().map(result -> result.split(":")).collect(Collectors.toList());
        String[] headerArray = new String[]{"groupId", "artifact_id", "type", "version", "scope"};
        rowList.add(0, headerArray);
        // 将内容写到指定的文件路径
        writeToExcel(rowList,"D:\\tree.xls");
    }

    public static List<String> readTxt(File file) {
        try (BufferedReader reader = new BufferedReader(new FileReader(file));) {
            //读文件
            List<String> dataList = new ArrayList<>();
            String str;
            while ((str = reader.readLine()) != null) {
                String[] results = str.split(":", 5);
                if (results.length != 5) {
                    continue;
                }
                dataList.add(str);
            }
            return dataList;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return Collections.emptyList();
    }

    public static void writeToExcel(List<String[]> rowList,String excelPath) {
        //1、创建Workbook
        try (Workbook workbook = new HSSFWorkbook();
             FileOutputStream outputStream = new FileOutputStream(excelPath);) {
            Sheet sheet = workbook.createSheet();
            // 行号
            int lineNum = 0;
            for (String[] cells : rowList) {
                Row row = sheet.createRow(lineNum);
                int columnNum = 2;
                for (String cell : cells) {
                    row.createCell(columnNum++).setCellValue(cell.trim());
                }
                lineNum++;
            }
            //向文件中写入数据,将文件持久化到磁盘
            workbook.write(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2.判断依赖是否有漏洞

上maven仓库上搜索对应的artifactId,然后查看Vulnerabilities是否有红色字体,如果有,就表示有漏洞,需要升级到无漏洞的版本(尽可能不要跨大版本升级,否则可能会出现一些版本问题)
在这里插入图片描述

3.版本兼容性查询

很多时候有一些依赖是有版本兼容关系的,如果版本不兼容,则可能会导致一系列不可知的影响,造成编译异常或项目无法启动等问题,所以如何查看各个依赖之间对应版本是否兼容也是极为关键的。
这里提供的方法也只是用来简单的判断,用来做参考。

首先按照上面的方法找到对应的依赖,然后找到要升级的版本,点进去,往下拉,就可以看到一个Compile Dependencies,下面罗列的就有一些最基本的兼容性问题(当然,这个并不是罗列了所有)。以我的理解的话,这里面罗列的应该是一些底层的兼容性,例如spring boot是基于spring的,所以他会罗列一些spring相关的版本,但是不会罗列spring cloud的,因为cloud是基于boot的,所以如果要看cloud和boot的版本对应关系,就得反回来去查cloud的版本。(当然,这个是我自己理解的,不能完全保证正确,有了解的小伙伴也可以和我说一下或者一起讨论一下)
在这里插入图片描述

4.常规依赖版本升级

由于依赖的漏洞版本经常会变化,时不时就要去进行升级,这个时候一般都是在父pom里面对整个项目的依赖进行版本管理,然后在子pom里面只需要定义依赖而不去指定版本,这样子下次需要升级,直接在父pom那里改一下版本就可以完成了对应的依赖版本升级。
下面给一个父pom大概的样例:junit

<?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">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.12.RELEASE</version>
        <!--        <version>2.6.7</version>-->
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>projectName</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <!-- 在properties上定义好对应版本,方便查找 -->
	<properties>
	    <junit.version>4.13.1</junit.version>
	</properties>
	<!-- 在dependencyManagement里面定义好版本,这里只是定义,并不会让项目真正引用 -->
	<dependencyManagement>
		<dependencies>
			<dependency>
		        <groupId>junit</groupId>
	            <artifactId>junit</artifactId>
	            <version>${junit.version}</version>
	            <scope>test</scope>
		    </dependency>
		</dependencies>
	</dependencyManagement>

</project>
        

5.依赖升级

5.1 jackson升级

漏洞依赖版本: com.fasterxml.jackson.core:jackson-databind:2.11.4
要升级的版本: com.fasterxml.jackson.core:jackson-databind:2.13.4.2
问题: 如果单独升级databind的话,就会类似Caused by:java.lang.ClassNotFoundException:com.fasterxml.jackson.core.util.JacksonFeature类找不到的问题导致启动报错。
问题原因: 由于jackson-databind与 jackson-annotation、jackson-core之间是有版本兼容关系,单独升级一个databind无法正常使用。(详细查看第3步版本兼容性查询)
解决方法: 将 jackson-annotation、jackson-core也一起升级到2.13.4版本对应jackson-databind的2.13.4.2版本
pom样例:

<properties>
	<jackson.version>2.13.4</jackson.version>
    <jackson-databind.version>2.13.4.2</jackson-databind.version>
</properties>
<dependencyManagement>
	<dependencies>
		<!--jackson-core start-->
	    <dependency>
	        <groupId>com.fasterxml.jackson.core</groupId>
	        <artifactId>jackson-databind</artifactId>
	        <version>${jackson-databind.version}</version>
	    </dependency>
	    <dependency>
	        <groupId>com.fasterxml.jackson.core</groupId>
	        <artifactId>jackson-core</artifactId>
	        <version>${jackson.version}</version>
	    </dependency>
	    <dependency>
	        <groupId>com.fasterxml.jackson.core</groupId>
	        <artifactId>jackson-annotations</artifactId>
	        <version>${jackson.version}</version>
	    </dependency>
	</dependencies>
</dependencyManagement>

5.2 spring相关依赖、springboot、webflux依赖升级(无cloud)

在升级漏洞版本的时候,个人建议先升级spring及springboot相关的依赖,因为很多漏洞依赖都是由spring引入的,所以当升级了spring底层依赖版本后,大部分的其它子依赖也会一起升级,就不需要再重新在父pom那里去定义一次版本了。

漏洞依赖版本: org.springframework:spring-beans、spring-core:5.2.9.RELEASE,spring-boot:2.2.10.RELEASE
要升级的版本: org.springframework:spring-beans、spring-core:5.3.20,spring-boot:2.6.8
问题: 由于spring底层的依赖是一系列的,如果只是单纯升级spring-beans或spring-core,可能会产生一系列问题,故最好一次性将spring相关依赖一起升级成同一个版本统一管理,并且必须与springboot版本不产生兼容性问题。
解决方法: 通过spring-boot-dependencies依赖来统一管理
pom样例:

<properties>
	<spring.boot.version>2.6.8</spring.boot.version>
</properties>
<dependencyManagement>
	<dependencies>
		<!--spring boot-->
	    <dependency>
	        <groupId>org.springframework.boot</groupId>
	        <artifactId>spring-boot-starter-web</artifactId>
	        <version>${spring.boot.version}</version>
	    </dependency>
	    <!-- 如果有webflux也可以用同一个版本 -->
	    <dependency>
	        <groupId>org.springframework.boot</groupId>
	        <artifactId>spring-boot-starter-webflux</artifactId>
	        <version>${spring.boot.version}</version>
	    </dependency>
	    <!-- 这个的type是pom类型,一定要注意,就是因为一开始忘记加了,导致浪费了好一会时间去排查问题 -->
	    <dependency>
	        <groupId>org.springframework.boot</groupId>
	        <artifactId>spring-boot-dependencies</artifactId>
	        <version>${spring.boot.version}</version>
	        <type>pom</type>
	        <scope>import</scope>
	    </dependency>
	    <dependency>
	        <groupId>org.springframework.boot</groupId>
	        <artifactId>spring-boot-starter-test</artifactId>
	        <version>${spring.boot.version}</version>
	        <scope>test</scope>
	    </dependency>
	</dependencies>
</dependencyManagement>

注:如果升级的springboot版本过高,可能会导致一些配置项读取失败,如spring.profiles.include和spring.profiles.active配置项在高版本也有了一定变化。之前简单的查了一下,在配置项中加spring.config.use-legacy-processing=true,就可以让其用之前的配置来读取配置项。当然也可以改用最新版的配置方式,具体的可以自己查一下,这里就不详述了。

5.3 spring、springboot、springcloud相关依赖升级

漏洞依赖版本: org.springframework:spring-beans、spring-core:5.2.9.RELEASE,spring-boot:2.2.10.RELEASE、spring-cloud:2.2.2.RELEASE
要升级的版本: org.springframework:spring-beans、spring-core:5.3.20,spring-boot:2.6.8,spring-cloud:3.1.3
问题: 在按照上面的方式升级后,启动项目的时候发现了项目无法读取bootstrap.yml里的配置项,报了Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'xxx' in value "${xxx}"。
解决方法: 在启动类对应的模块pom那里加上spring-cloud-starter-bootstrap依赖。参考SpringCloud项目无法读取bootstrap.yml配置文件的解决办法
问题原因: 对于spring cloud项目,必须要基于springcloud才会读取bootstrap.yml,因为bootstrap本身就是从cloud引进来的,而cloud又是基于boot,在cloud项目中,经常性会用到配置中心,故而有了bootstrap来替代application,但又不能完全替代,所以就把它的优先级设置成比application高。(个人理解)。
pom样例:
启动类pom文件添加下面的依赖(注意是添加依赖,而不是添加依赖管理!!)

<!-- spring cloud,基于spring cloud才会读取bootstrap.yml -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

父pom文件:

<properties>
	<!--这里cloud2021.0.3支持2.6.6、2.6.8-->
	<spring.boot.version>2.6.8</spring.boot.version>
	<spring-cloud.version>2021.0.3</spring-cloud.version>
	<spring-cloud-starter-bootstrap.version>3.1.3</spring-cloud-starter-bootstrap.version>
</properties>
<dependencyManagement>
	<dependencies>
		<!--spring boot-->
	    <dependency>
	        <groupId>org.springframework.boot</groupId>
	        <artifactId>spring-boot-starter-web</artifactId>
	        <version>${spring.boot.version}</version>
	    </dependency>
	    <!--spring webflux-->
	    <dependency>
	        <groupId>org.springframework.boot</groupId>
	        <artifactId>spring-boot-starter-webflux</artifactId>
	        <version>${spring.boot.version}</version>
	    </dependency>
	    <!--spring 相关依赖-->
	    <dependency>
	        <groupId>org.springframework.boot</groupId>
	        <artifactId>spring-boot-dependencies</artifactId>
	        <version>${spring.boot.version}</version>
	        <type>pom</type>
	        <scope>import</scope>
	    </dependency>
	    <dependency>
	        <groupId>org.springframework.boot</groupId>
	        <artifactId>spring-boot-starter-test</artifactId>
	        <version>${spring.boot.version}</version>
	        <scope>test</scope>
	    </dependency>
	    <!--spring actuator 能不引入就不引入,如果原来有就加入,没有就直接去掉-->
	    <dependency>
	        <groupId>org.springframework.boot</groupId>
	        <artifactId>spring-boot-starter-actuator</artifactId>
	        <version>${spring.boot.version}</version>
	    </dependency>
	    <!--spring cloud相关依赖版本控制-->
	    <dependency>
	        <groupId>org.springframework.cloud</groupId>
	        <artifactId>spring-cloud-dependencies</artifactId>
	        <version>${spring-cloud.version}</version>
	        <type>pom</type>
	        <scope>import</scope>
	    </dependency>
	    <!--spring cloud读取bootstrap依赖版本控制-->
	    <dependency>
	        <groupId>org.springframework.cloud</groupId>
	        <artifactId>spring-cloud-starter-bootstrap</artifactId>
	        <version>${spring-cloud-starter-bootstrap.version}</version>
	    </dependency>
	<dependencies>
<dependencyManagement>
	

5.4 elasticsearch升级

漏洞依赖版本: org.elasticsearch:elasticsearch:7.7.1
要升级的版本: org.elasticsearch:elasticsearch:7.14.0
问题: 由于项目里还引用了spring-data-elasticsearch,而springboot2.6.8对应其的版本过高,导致项目无法启动,其次升级成7.14.0后,找不到RestClientBuilderCustomizer类和RestClientProperties类
解决方法: 删除spring-data-elasticsearch依赖,并重新引入RestClientBuilderCustomizer类(新版本只是类位置更换了而已),RestClientProperties类替换为ElasticsearchProperties类,并将原来的es配置项从spring.elasticsearch.rest改为spring.elasticsearch(防止读取不到配置)
pom样例:

<properties>
	<elasticsearch.version>7.14.0</elasticsearch.version>
</properties>
<dependencyManagement>
	<dependencies>
		<dependency>
		    <groupId>org.elasticsearch</groupId>
		    <artifactId>elasticsearch</artifactId>
		    <version>${elasticsearch.version}</version>
		</dependency>
		
		<dependency>
		    <groupId>org.elasticsearch.client</groupId>
		    <artifactId>elasticsearch-rest-client</artifactId>
		    <version>${elasticsearch.version}</version>
		</dependency>
		
		<dependency>
		    <groupId>org.elasticsearch.client</groupId>
		    <artifactId>elasticsearch-rest-high-level-client</artifactId>
		    <version>${elasticsearch.version}</version>
		</dependency>
	</dependencies>
</dependencyManagement>

6.总结

以上就是本人在这次依赖升级的一个小总结啦,写这个的目的仅是用于记录,同时帮助一些有需要的人,当然可能我文笔并不是很好,且可能也会有一些问题,欢迎指正!不喜勿喷,谢谢。

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

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

相关文章

机器学习与深度学习的基本概念

目录 机器学习是什么&#xff1f; 机器学习的任务 回归Regression 分类Classification 创造学习Structed Learing 机器学习怎么找这个函数 定义含未知参数的函数 定义loss损失函数 定义优化器optimization 写出一个更复杂的有未知参数的函数 sigmoid 基本推理过程 si…

GitHub上架即下架!《分布式系统人人都是架构师》全彩笔记开源

小编又来给大家分享好书了&#xff1a;高翔龙老师的 《超大流量分布式系统架构解决方案&#xff1a;人人都是架构师2.0》&#xff0c;我在网上没找见开源的PDF版本所以分享一下&#xff01;小编会在文末附电子版免费下载方式。 高翔龙是谁&#xff1f; 云集基础架构负责人&am…

实战演练 | 使用 Navicat 在 MySQL 中存储图像

近年来&#xff0c;Web应用程序中的图像数量一直在稳定增长。还需要在不同尺寸的图像之间进行区分&#xff0c;例如缩略图&#xff0c;网络显示图像等。例如&#xff0c;我最近开发的一个应用程序显示新闻项目&#xff0c;其中每个项目都有缩略图和主要文章图像。另一个应用程序…

Tableau表格取消合并单元格

客户回访&#xff08;Client Review&#xff09; 文章目录前言一、原表格样式二、回访收集到的述求三、表格合并单元格方法&#xff08;一&#xff09;创建“序号”计算字段&#xff08;二&#xff09;将“序号”计算字段改为维度&#xff08;三&#xff09;将“序号”计算字段…

PMP项目管理中的重要角色

PMP及PMBOK有个大问题&#xff0c;就是没有统一的角色职责及流程&#xff0c;考试也是随意性很强&#xff0c;这给考生带来很多困扰。 一个管理体系&#xff0c;首先是人员分工安排。比如&#xff1a;PRINCE2&#xff0c;明确的组织结构&#xff0c;详细的流程活动&#xff0c…

用代码画两棵圣诞树送给你【附详细代码】

大家好&#xff0c;我是宁一 代码的魔力之处在于&#xff0c;可以帮我们实现许多奇奇怪怪、有趣的想法。 比如&#xff0c;用Python的Turtle库&#xff0c;可以帮我们在电脑上画出好看的图像。 下面这张樱花图就是用Turtle库实现的。 这不圣诞节快到啦。 那么就用代码来画一…

基于jsp+mysql+ssm在线音乐网站-计算机毕业设计

项目介绍 随着计算机行业和互联网技术的高速发展&#xff0c;以及互联网在日常生活中的飞速普及&#xff0c;网络已经与我们的生活息息相关&#xff0c;密不可分&#xff0c;我们越来越离不开网络&#xff0c;网络在我们每天的生活中占据非常重要的地位。现在&#xff0c;网络…

【Linux|树莓派】分文件编程以及静态库动态库

一、分文件编程 简单来说树莓派的分文件编程就是将一个项目的代码放在不同的文件里面&#xff0c;然后在主函数添加一个头文件&#xff0c;这样会使#控制字体颜色主程序变得简单。 在编译的时候要将主函数和功能函数一起编译&#xff1a; 注意&#xff1a;include <stdio.h…

01 Java语言简介

0 警告 Java从入门到放弃。 1.1概述 Java 语言是 SUN&#xff08;Stanford University Network&#xff0c;斯坦福大学网络公司&#xff09;于 1995 年推出的一门高级编程语言。 Java 语言是一种面向 Internet 的编程语言。Java 一开始富有吸引力是因为 Java 程序可以在 Web 浏…

面向碳中和的公共建筑室内环境营造再认识

3月26日&#xff5c;清华大学建筑节能学术周——公共建筑节能—工程实践助力实现双碳目标 【3月26日公开论坛】公共建筑节能 – 工程实践助力实现双碳目标 面向碳中和的公共建筑室内环境营造再认识 对“舒适”、“健康”和室内环境营造手段的再认识 1.对“舒适”的再认识 P…

luckysheet 国产超强纯前端在线excel表格功能强大 简单使用记录 异常报错记录及处理

效果预览 官网及在线示例 https://mengshukeji.gitee.io/LuckysheetDocs/zh/guide/ npm地址 https://www.npmjs.com/package/luckysheet 在线效果 https://mengshukeji.gitee.io/luckysheetdemo/ 在线导入效果 https://mengshukeji.gitee.io/luckyexceldemo/ 使用步骤 两…

单片机硬件和软件延时是啥意思?

软件延时和硬件延时是啥意思&#xff1f;做项目时他俩有什么区别&#xff1f; 今天就来讲讲关于硬件延时和软件延时的内容&#xff0c;以及它们的区别。 硬件和软件延时 延时的种类很多&#xff0c;先给大家普及一下延时相关概念和分类。 1.硬件延时 指利用具有计数功能的…

【学习笔记】空间坐标系旋转与四元数

前言 最近在学惯性器件&#xff0c;想着先把理论知识脉络打通&#xff0c;于是便开始学习空间坐标系旋转和四元数&#xff0c;正好结合刚刚结课的课程《机器人控制技术》&#xff0c;记录一下学习心得。 旋转矩阵和齐次变换矩阵部分主要参考自教材 《机器人学导论》 中的第2章 …

SD NAND 的 SDIO在STM32上的应用详解(中篇)

四.SDIO功能框图(重点) SDIO包含2个部分&#xff1a; ● SDIO适配器模块&#xff1a;实现所有MMC/SD/SD I/O卡的相关功能&#xff0c;如时钟的产生、命令和数据的传送。 ● AHB总线接口&#xff1a;操作SDIO适配器模块中的寄存器(由STM32控制SDIO外设)&#xff0c;并产生中断和…

四种区块链底层技术形态的对比解读

新世纪以来&#xff0c;互联网技术快速发展&#xff0c;催生了以平台经济为典型的各种新业态、新模式&#xff0c;深刻影响和改变了人类社会的生产方式、生活方式和社会治理方式。然而在推动经济和社会发展的同时&#xff0c;基于数据点对点传输建立的互联网也越来越多地暴露出…

可以作为艺术作品欣赏的CT三维重建技术。

什么是CT三维重建技术&#xff1a;简而言之就是通过螺旋CT自带的计算机软件&#xff0c;对扫描获得的数据进行后处理&#xff0c;以达到辅助医生对病变和周围组织&#xff0c;及其与血管的关系进行分析和显示的目的&#xff0c;它极大地提高了影像诊断的直观性&#xff0c;准确…

国际学校妈妈哭诉IB太难:中国孩子都不知道怎么答题?

听别人说考国际学校的IB体系相对简单直到我看到IB试题才知道其实IB一点都不容易特别对于中国学生有大量写论文的部分来看看IB的真题有些学生真的很难下笔不知道怎么答题啊&#xff01;商科生物 题目都是非常考验综合能力的&#xff0c;学生需要掌握很多知识点并融会贯通&#x…

大数据学习:使用Vim编辑器

文章目录一、安装Vim编辑器二、切换三种工作模式1、命令模式2、输入模式3、末行模式三、案例演示1、将第一行内容复制粘贴到第二行之后2、删除第二行内容四、末行模式中基本操作1、案例演示任务一&#xff1a;显示行号任务二&#xff1a;取消行号任务三&#xff1a;存盘退出&am…

【教程】Derby数据库安装与使用

前言 环境配置只是开始&#xff0c;代码上的创作才是灵魂。 JDK版本&#xff1a;1.8.0_341 Derby版本&#xff1a;10.14.2.0 一、Derby安装 1. 打开 cmd 键盘按下 Windows R 打开本地 cmd &#xff08;命令提示符&#xff09;或 windows powershell 。 2. 查询 jdk 版本 输…

基于ARM架构openEuler系统通过qemu模拟器自动安装启动ARM架构的openEuler虚拟机

【原文链接】基于ARM架构openEuler系统通过qemu模拟器自动安装启动ARM架构的openEuler虚拟机 文章目录一、基础准备工作二、自动创建基于dhcp自动获取ip地址的openEuler虚拟机三、自动创建配置静态IP地址的openEuler虚拟一、基础准备工作 &#xff08;1&#xff09;下载ARM架构…