坑的周围环境
1,软硬件:win10系统,idea2022.1,jdk11,vm虚拟机centos7中docker启动Jenkins 2.401,maven3.6.3;
2,需求;使用idea开发jenkins插件,该插件需要引入自定义的jar包;
问题描述
正常开发好jenkins插件之后,安装、重启jenkins,插件正常运行,在需要插件的自定义jar包中一个函数去处理一些文件时,该自定义jar包在加载自己内部类时无法加载出,找不到自己内部类;导致处理一些文件时无效处理;
场景重现
问题原因分析
jenkins是如何加载插件中的类的?
Jenkins 是一个基于 Java 开发的持续集成和持续交付工具,它通过插件的方式扩展其功能。Jenkins 插件包含了许多 Java 类,当 Jenkins 加载插件时,需要通过类加载器将这些类加载到内存中。以下是 Jenkins 加载插件中类的过程:
1,Jenkins 启动时,会创建一个根类加载器(ClassLoader),用于加载 Jenkins 核心代码和系统类库。
2,当 Jenkins 加载插件时,它会创建一个独立的类加载器来加载该插件的所有类。这个类加载器是从根类加载器继承而来,它会首先尝试从本地文件系统加载插件的 jar 文件,如果 jar 文件不存在,则会尝试从网络下载该插件。
3,一旦插件的 jar 文件被加载到内存中,Jenkins 会使用插件类加载器来加载插件中的类。插件类加载器会将插件 jar 文件中的所有类加载到内存中,并将这些类放置在插件类加载器的命名空间中。
4,当插件中的类被引用时,Jenkins 会通过插件类加载器来查找这些类。如果插件类加载器无法找到这些类,则会尝试使用根类加载器来加载它们。
5,如果插件中的类引用了其他插件中的类,那么插件类加载器会使用同样的方式来加载这些依赖的类。
总之,Jenkins 通过使用独立的插件类加载器来加载插件中的所有类,从而实现了插件之间的隔离和互相独立。这种类加载器的机制可以确保每个插件都有自己的类加载器,并且它们之间的类不会发生冲突。
Jenkins 核心类加载器与插件类加载器有何不同?
Jenkins 核心类加载器和插件类加载器是两种不同类型的类加载器,它们的作用和加载的类也有所不同。
1.核心类加载器(Core ClassLoader):Jenkins 核心类加载器是启动 Jenkins 时创建的类加载器。它负责加载 Jenkins 核心代码和系统类库,如 Java 标准类库等。核心类加载器的父加载器是 JVM 的 Bootstrap 类加载器。
2.插件类加载器(Plugin ClassLoader):每个插件都有自己的插件类加载器,用于加