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

centos7系统使用docker-compose安装部署jenkins

CentOS7系统使用docker-compose安装部署jenkins,并实现前后端自动构建

记录一次工作中部署jenkins的真实经历,总结了相关经验

1.准备环境

1.java

由于最新的jenkins需要jdk11以上才能支持,而系统里的jdk是1.8的,因此等jenkins安装好后使用jenkins容器里自带的jdk17

在这里插入图片描述

2.maven

centos7安装maven,步骤:

1.下载 apache-maven-3.6.3-bin.tar.gz

2.解压

3.配置环境变量
vim /etc/profile

4.刷新配置文件
source /etc/profile

5.验证
mvn -v

3.node

centos7 使用nvm 下载16以上版本的node可能会遇到如下的报错

在这里插入图片描述

这里直接采用jenkins自动安装node 18

在这里插入图片描述

2.准备docker-compose.yml文件

version : '3'
services:jenkins:user: rootrestart: alwaysimage: jenkins/jenkinscontainer_name: jenkinsenvironment:- TZ=Asia/Shanghaiports:- "10240:8080"- "10241:50000"expose:- "8080"- "50000"volumes:- /data/jenkins/jenkins_home/:/var/jenkins_home/- /data/nginx/html/:/data/nginx/html/- /data/nginx/htmldev/:/data/nginx/htmldev/- /var/run/docker.sock:/var/run/docker.sock- /usr/bin/docker:/usr/bin/docker- /data/maven/apache-maven-3.6.3:/data/maven/apache-maven-3.6.3- /root/.ssh:/root/.ssh
  1. /var/jenkins_home/ 这个是容器里默认的jenkins工作目录,需要挂载出来
  2. /data/nginx/html/和/data/nginx/htmldev/ 分别对应后面前端项目pc端、移动端的dist存放目录,配置于nginx中,挂载出来是由于jenkins配置前端构建的时候需要配置nginx目录
  3. maven挂载刚刚安装的maven

3.执行docker-compose

# 跳转到docker-compose.yml文件目录
cd /data/jenkinsll#执行
docker-compose up -d#查看运行状态
docker ps

4.初始化jenkins

  1. 访问 ip:10240 jenkins后台

    在这里插入图片描述

    查找初始密码

    在这里插入图片描述

  2. 安装插件

    选择安装推荐的插件,这里如果安装失败,后续再手动切换源,安装必要的插件即可

    源:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

    在这里插入图片描述

参考:
docker安装jenkins并配置国内插件镜像地址_jenkins国内镜像-CSDN博客
Jenkins必备安装插件 - 知乎 (zhihu.com)

在这里插入图片描述

  1. 创建管理员账号

    在这里插入图片描述

    一直下一步

    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. 切换中文(此时还有部分界面是英文)

​ 安装locale插件即可

参考:
【jenkins】教你jenkins设置为中文_jenkins 中文插件,2024年最新这操作真香_jenkins设置中文-CSDN博客

5.系统配置

  1. 凭据管理

    在这里插入图片描述

    在这里插入图片描述

    添加全局凭据

    1. git账号密码(拉取代码)

      在这里插入图片描述

    2. gitlab token(用于监听git,自动构建)

      安装gitlab插件

      在这里插入图片描述

      去gitlab生成token,复制

      在这里插入图片描述

      添加gitlab api token凭证

      在这里插入图片描述

  2. 全局工具配置

    1. JDK

      使用jenkins容器自带jdk17

      在这里插入图片描述

    2. maven

      使用本地安装的maven,刚刚已经挂载

      在这里插入图片描述

    3. nodejs

      安装nodejs插件

      在这里插入图片描述

      勾选自动安装,node版本选择18

      在这里插入图片描述

  3. 系统配置

    在这里插入图片描述

    1. 远程部署配置

      安装远程部署插件

      在这里插入图片描述

      配置publish over ssh - SSH Servers

      1. 远程部署客户测试环境

        在这里插入图片描述

      2. 远程部署公司开发环境

        在这里插入图片描述

    2. gitlab连接配置

      在这里插入图片描述

6.新建构建任务

1.后端(含备份、回滚)

1.本机部署

举例:构建测试服务器(本地),从git的develop分支拉取代码

  1. 选择自由风格

    在这里插入图片描述

  2. 设置保留构建历史数量

    在这里插入图片描述

  3. 配置参数化构建,为了实现回滚

    在这里插入图片描述

    在这里插入图片描述

  4. 配置源码管理

    在这里插入图片描述

  5. 构建环境

    在这里插入图片描述

  6. 增加构建步骤

    maven

    在这里插入图片描述

    备份

    在这里插入图片描述

    #!/bin/bash 
    case $Status  indeploy)echo "Status:$Status"path="${WORKSPACE}/csms-admin/bak/${BUILD_NUMBER}"      #创建每次要备份的目录if [ -d $path ];thenecho "The files is already  exists "elsemkdir -p  $pathfi\cp -f ${WORKSPACE}/csms-admin/target/*.jar $path        #将打包好的jar包备份到相应目录,覆盖已存在的目标echo "bak ------------ Completing!";;rollback)echo "Status:$Status"echo "Version:$Version"echo "BUILD_NUMBER:$BUILD_NUMBER"v=$Versionif [ $Version -eq 0 ]; thenv=$(($BUILD_NUMBER - 2))  # 如果 $Version 是 0,则赋值为 $BUILD_NUMBER - 2fiecho "回滚到版本--v:${v}"cd ${WORKSPACE}/csms-admin/bak/${v}            #进入备份目录\cp -f *.jar ${WORKSPACE}/csms-admin/target/       #将备份拷贝到程序打包目录中,并覆盖之前的jar包;;*)exit;;
    esac
    

    构建新docker镜像并启动

    在这里插入图片描述

    cd ${WORKSPACE}
    docker stop csms-admin || true
    docker rm csms-admin || true
    docker rmi csms-admin || true
    docker build --build-arg profileActive=test --build-arg port=8889 -t csms-admin .
    docker run -d -p 192.168.100.53:8889:8889 --name csms-admin csms-admin
    

    保留10个版本,删除以前的备份

    在这里插入图片描述

    #!/bin/bash
    #rm_file>14day
    ReservedNum=10                      #保留文件数量
    rm_file_dir=${WORKSPACE}/csms-admin/bak  #需要删除文件的路径cd $rm_file_dir    #进入文件夹
    RootDir=$(pwd) #当前文件路径
    FileNum=$(ls -l | grep '^d' | wc -l)    #查找文件夹数量
    OldFile=$(ls -rt | head -1)         #找出最早文件夹
    if [ $RootDir == $rm_file_dir ];then   #判断所在目录是否正确echo $RootDir                             echo $rm_file_dirwhile (($FileNum>$ReservedNum))  #文件数超过设置变量才执行doecho "Delete File:"$RootDir'/'$OldFile   #打印要删除的文件名称rm -rf $RootDir'/'$OldFile                       #删除文件let "FileNum--"                                      #变量自减操作OldFile=$(ls -rt | head -1)         #更新dmp最早文件done
    elseecho "error file path "                         #所在目录不对打印出路径错误
    fi
    
  7. 构建触发器

    配置gitlab监听,自动构建

    在这里插入图片描述

    在这里插入图片描述

    打开gitlab

    在这里插入图片描述

    在这里插入图片描述

    分别粘贴到gitlab-设置-集成

    在这里插入图片描述

  8. 测试

    在这里插入图片描述

    在这里插入图片描述

    git push自动触发jenkins构建

    查看控制台

    在这里插入图片描述

    查看docker容器运行状态

    docker ps
    

    在这里插入图片描述

    后端启动成功

2.远程部署

举例:构建开发服务器(另一台服务器),采用在本机打包、备份,然后通过ssh连接远程开发服务器,传送jar包并执行的方式

  1. 复制一个构建任务

    在这里插入图片描述

    在这里插入图片描述

  2. 修改所有的profile环境,注释docker步骤

    在这里插入图片描述

    在这里插入图片描述

  3. git触发器配置

    (同上)

  4. 增加Send files or execute commands over SSH 步骤

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    #!/bin/bashJAR_HOME='/data/jenkins/jenkins_home/workspace/csms-dev-develop/csms-admin/target'
    WEB_HOME='/data/csms/csms-admin'#停止原来的服务
    ps -ef | grep csms-admin | grep -v grep | awk '{print $2}' | xargs kill -9#替换原来的jar包
    cd ${JAR_HOME}
    mv csms-admin-dev.jar csms-admin.jar
    cp -f csms-admin.jar ${WEB_HOME}#重启服务
    cd ${WEB_HOME}
    nohup sh startup.sh &
    

    startup.sh

    
    #!/bin/bash
    #1,获取myjar的进程号
    PID=$(ps -ef|grep csms-admin| grep -v grep | awk '{print $2}')
    #2,启动myjar的函数
    start(){nohup /data/java/jdk1.8.0_321/bin/java -Dspring.profiles.active=dev -jar -Xms1024m -Xms2048m csms-admin.jar &
    }
    #3,判断1中获取的PID是否存在,即判断myjar有没有启动if [ -z "$PID" ]
    then
    #4,日志echo "Start the csms-admin directly "
    #5,myjar之前没有启动的话,这里直接调用start函数start
    else
    #6,myjar之前启动过且进程依然存活,则kill掉,然后调用start函数echo "kill the existing csms-admin process firstly."kill -9 $PIDecho " $PID has been killed"start
    fi
    

2.前端

由于nginx部署在开发服务器(非jenkins所在服务器),所以前端部署都为远程部署

1.PC端远程部署
  1. 自由风格

    同上

  2. 丢弃旧的构建

    同上

  3. 源码管理

    同上

  4. 构建触发器

    同上

  5. 构建环境

    在这里插入图片描述

  6. 构建步骤

    在这里插入图片描述

    npm install
    rm -rf ${WORKSPACE}/dist
    npm run build:dev
    #本机部署则去掉下面的ssh步骤,这里加上下面的语句
    #rm -rf /data/csms/csms-web/html
    #mkdir -p /data/csms/csms-web/html
    #cp -rf ${WORKSPACE}/dist /data/csms/csms-web/html
    
  7. 增加Send files or execute commands over SSH 步骤

    在这里插入图片描述

    #!/bin/bashDIST_HOME='/data/jenkins/jenkins_home/workspace/csms-vue-test-dev-pc'
    HTML_HOME='/data/csms/csms-web/test/html'#覆盖原来的dist
    cp -rf ${DIST_HOME}/dist/* ${HTML_HOME}/dist
    
2.移动端远程部署
  1. 构建步骤

    在这里插入图片描述

  2. ssh

    在这里插入图片描述

    #!/bin/bashDIST_HOME='/data/jenkins/jenkins_home/workspace/csms-vue-test-dev'
    HTML_HOME='/data/csms/csms-app/test/html'#覆盖原来的dist
    cp -rf ${DIST_HOME}/mobiled_dist/* ${HTML_HOME}/mobiled_dist
    
  3. 其他步骤同PC

7.在jenkins上编写maven的setting文件

有的时候需要临时改下maven的setting文件,或者想编写多份setting文件给不同的构建任务去使用,可以在jenkins上直接进行配置

  1. 添加配置文件

    在这里插入图片描述

参考:
PS:这里没有这个选项的,需要下载插件Jenkins 配置文件管理插件 Config File Provider_jenkins config file provider-CSDN博客

在这里插入图片描述

在这里插入图片描述

  1. 全局配置

    在这里插入图片描述

    在这里插入图片描述

  2. 到构建任务里配置

    在这里插入图片描述

    在这里插入图片描述

8.后端项目Dockerfile示例

本文的后端项目对应的Dockerfile,可参考使用,一般放在项目的根目录下

# 基础镜像
FROM openjdk:8-jre# 维护者信息
MAINTAINER asusENV LANG=zh_CN.UTF8
ENV LC_ALL=zh_CN.UTF8# 设置容器时区为当前时区
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \&& echo 'Asia/Shanghai' >/etc/timezone# /tmp 目录作为容器数据卷目录,SpringBoot内嵌Tomcat容器默认使用/tmp作为工作目录,任何向 /tmp 中写入的信息不会记录进容器存储层
# 在宿主机的/var/lib/docker目录下创建一个临时文件并把它链接到容器中的/tmp目录
VOLUME /tmp# 复制主机文件至镜像内,复制的目录需放置在 Dockerfile 文件同级目录下
ADD csms-admin/target/csms-admin-*.jar csms.jar# 动态参数
ARG profileActive=dev
ENV profileActive ${profileActive}ARG port=8881
ENV port ${port}# 容器启动执行命令
ENTRYPOINT ["java", "-Xms256M","-Xmx1224M","-Xmn256M","-Xss256K","-Duser.timezone=GMT+8", "-Djava.security.egd=file:/dev/./urandom", "-Dspring.profiles.active=${profileActive}", "-jar", "/csms.jar"]# 声明容器提供服务端口
EXPOSE ${port}

PS:上面展示的自动构建是每次都删除原来的镜像和容器,重新构建镜像,其实也可以Dockerfile里不ADD jar包,然后将容器里放jar包的目录在 run 这个镜像容器的时候挂载出来,这样只需要构建一次镜像,创建一次容器,后面jar包更新了,只需要重启容器即可。

9.Jenkins新增用户并根据项目分配权限

参考:

jenkins增加用户,并配置权限,保姆式教学_jenkins创建用户并添加权限-CSDN博客

Jenkins—jenkins新增用户且配置权限-CSDN博客

10.踩坑记录

1.由于lombok版本过低导致Maven编译失败

在构建任务中,jdk指定的是jenkins里自带的jdk17,项目中maven编译指定的jdk是1.8,这里是下图报错的根本原因,但是之前其他构建任务也是这样配置的,还是正常编译,最终在网上查询相关博客,改了lombok版本才得以解决
参考:项目install的时候报错“module jdk.compiler does not “opens com.sun.tools.javac.processing“ to unnamed modul
在这里插入图片描述
在这里插入图片描述
修改lombok版本为最新版本(能支持jdk17)
在这里插入图片描述

相关文章:

centos7系统使用docker-compose安装部署jenkins

CentOS7系统使用docker-compose安装部署jenkins,并实现前后端自动构建 记录一次工作中部署jenkins的真实经历,总结了相关经验 1.准备环境 1.java 由于最新的jenkins需要jdk11以上才能支持,而系统里的jdk是1.8的,因此等jenkins安…...

传染病报卡内容——丙型

--丙型 select a.morbiditdate 发病日期, diagnosedate 诊断日期, a.deathdate 死亡日期, a.casetypequality 病例分类,a.hcvrna "HCR_RNA定量" from zl_sdmb.t_报卡记录 t, c1_infectiousv1_6 a where t.id a.fileid and t.卡片种类 传…...

本地快速部署大语言模型开发平台Dify并实现远程访问保姆级教程

文章目录 前言1. Docker部署Dify2. 本地访问Dify3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 前言 本文主要介绍如何在Linux Ubuntu系统使用Docker快速部署大语言模型应用开发平台Dify,并结合cpolar内网穿透工具实现公网环境远程访问…...

《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 02 Clos拓扑

本章回答以下问题: 什么是 Clos 拓扑,它与“接入 - 汇聚 - 核心”拓扑有何不同?Clos 拓扑的特征是什么?Clos 拓扑对数据中心网络的影响是什么? Clos拓扑 云原生数据中心基础设施的先行者们想要构建一种支持大规模水平扩展网络。 基本的Clos拓扑如图…...

VUE3版本新特性

VUE3版本新特性 VUE3和VUE2的区别路由的使用vite安装项目新特性使用 1.VUE3和VUE2的区别 2020年9月18日,Vue.js发布版3.0版本,代号:One Piece 于 2022 年 2 月 7 日星期一成为新的默认版本! Vue3性能更高,初次渲染快55%, 更新渲染快133% 。…...

【Oracle篇】Oracle数据库坏块处理:rman修复坏块实践与案例分析(第七篇,总共八篇)

💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨ 💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️…...

学懂C#编程:从一个简单的例子理解事件处理

在C#中,事件是一种特殊的委托类型,用于在对象上发生某些事情时通知订阅者。事件的处理通常包括定义事件,创建触发事件的条件,以及订阅该事件的事件处理程序。 以下是一个简单的C#事件处理示例: using System;// 定义…...

深入理解指针(2)

4. const 修饰指针 4.1 const修饰变量 变量是可以修改的,如果把变量的地址交给⼀个指针变量,通过指针变量的也可以修改这个变量。 但是如果我们希望⼀个变量加上⼀些限制,不能被修改,怎么做呢?这就是const的作⽤。 …...

C#.Net筑基-集合知识全解

01、集合基础知识 .Net 中提供了一系列的管理对象集合的类型,数组、可变列表、字典等。从类型安全上集合分为两类,泛型集合 和 非泛型集合,传统的非泛型集合存储为Object,需要类型转。而泛型集合提供了更好的性能、编译时类型安全…...

AI PPT生成器,一键在线智能生成PPT工具

PPT作为商业沟通和教育培训中的重要工具,PPT制作对于我们来说并不陌生。但是传统的PPT制作不仅耗时,而且想要做出精美的PPT,需要具备一定的设计技能。下面小编就来和大家分享几款AI PPT工具,只要输入主题,内容就可以在…...

stm32学习笔记---零基础入门介绍2

目录 STM32介绍 STM32家族系列 ARM介绍 ARM内核型号种类 我们学习用的STM32 片上资源/外设(Peripheral) 命名规则 系统结构 引脚定义 STM32的启动配置 STM32最小系统电路和其他部分电路 最小系统板的实物图 附:安装软件准备 声明…...

搭建取图系统app源码开发,满足广泛应用需求

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前言 图片已成为信息传递的重要媒介,广泛应用于各个领域。为满足日益增长的图片需求,搭建一款高效的取图系统,可以为用户提供便捷、全面的…...

语音质量评价方法之MOS

引言 在语音增强、语音合成、语音转换、声音转换、语音克隆、语音修复等等领域,常常要对输出的语音进行评价。对语音的质量评价一般关注两个方面,即主观评价和客观评价。主观评价就是人凭借听觉感受对语音进行打分,客观评价比较广泛&#xf…...

gorm简介

【1】ORM: 即Object-Relational Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它们就可以了。 【2】GORM gorm是go语言的一个orm…...

MySQL:SELECT list is not in GROUP BY clause 报错 解决方案

一、前言 一大早上测试环境,发现测试环境的MySQL报错了。 SELECT list is not in GROUP BY clause and contains nonaggregated column二、解决方案 官方文档中提到: 大致意思: 用于GROUP BY的SQL / 92标准要求满足以下条件: SE…...

IPython的使用技巧

1、解释说明 IPython是一个强大的Python交互式shell,它提供了丰富的功能,如自动补全、历史记录、内置帮助等。IPython使得在命令行下编写和测试Python代码变得更加方便和高效。 2、使用示例 安装IPython: pip install ipython启动IPython…...

Spring Boot 多线程例子

在Spring Boot中,多线程可以通过Java的并发工具来实现。以下是一些常见的多线程实现方法: 1. 使用Async注解和CompletableFuture: 首先,需要在Spring Boot应用的主类上添加EnableAsync注解,以启用异步支持。 java Spr…...

java干货 线程池的分析和使用

文章目录 一、了解线程池1.1 什么是线程池1.2 为什么需要线程池 二、四种线程池的使用2.1 newFixedThreadPool2.2 newCachedThreadPool2.3 newSingleThreadExecutor2.4 newScheduledThreadPool 三、自定义线程池3.1 线程池七大核心参数3.2 线程池内部处理逻辑 一、了解线程池 …...

文本张量入门

张量,英文为Tensor,是机器学习的基本构建模块,是以数字方式表示数据的形式。 张量的基本类型: 创建一个标量(0维张量),也就是一个单独的数字 scalar torch.tensor(7) scalar.ndim # 返回张量的维度 0 # …...

js文字如何轮播?

<div class"td-style"> <span class"td-text">内容1内容1内容1内容1内容1内容1</span> </div> css&#xff1a; <style> .td-style { width: 160px; height: 72px; overflow: hidden; white-…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...