Thread.currentThread().setContextClassLoader为什么不生效与java.lang.NoClassDefFoundError之Java类加载的Parent fir...

2023-05-16

众所周知,Java的类加载机制采用了双亲委派模型,导致在进行类加载的时候会有多个加载器,这种复杂的机制,有时候会导致‘ Exception in thread main java.lang.NoClassDefFoundError’这个异常,虽然可能你认为相应的类和jar包就在某个类加载器中。下面的文字,会试图尝试解释为什么会发生这种情况。
 
下面提供了一个简单的java程序来帮助理解问题的发生。
 
 默认的JVM的类加载委派模型
 
默认的类加载委派模式是从下向上的,也就是双亲委派。这意味着JVM会从下往上来委托类加载器去查找和加载用户的类,如果父加载器没能加载相应的类,这时才会尝试在当前线程上下文的类加载器中去加载,一般而言是子加载器。

 

NoClassDefFoundError这种异常时有发生,比如,用户自己的jar包打的不对,再比如,依赖的第三方jar包或者容器注入的类型,这些情况都有可能导致问题的发生。
 
在以上这些场景中:
  • JVM将程序的部分类型在父加载器中加载了(比如系统或者父加载器)
  • JVM将程序的其他部分想要在子加载器中加载(比如容器或者用户自定义加载器)
当在父加载器中加载的类尝试去通过子加载器加载相应的类时会发生什么?当然是NoClassDefFoundError!
因为父加载器对子加载器一无所知。只有当引用的类在是父加载器或当前线程上下文加载器中,才可能会去加载,否则就会抛出java.lang.NoClassDefFoundError。
 
下面的代码将会展示这些问题:
 
样例Java程序
 
为了演示,程序被如下分割:
  • 主程序NoClassDefFoundErrorSimulator会被打包在MainProgram.jar
  • 日志输出程序JavaEETrainingUtil也被打包在MainProgram.jar
  • caller类CallerClassA被打包在caller.jar
  • 被引用的类ReferencingClassA被打包在referencer.jar
然后执行下面的任务:
  • 创建一个子加载器(java.net.URLClassLoader)
  • 将caller.jar和referencher.jar分配给上面创建的子加载器
  • 将当前线程上下文加载器更改为上面的子加载器
  • 尝试从当前线程上下文加载器加载和创建CallerClassA类的实例
  • 日志输出用来帮助理解类加载器的变化和线程上下文加载器的状态
下面将展示错误的打包方式和默认的类加载委派模型是如何产生NoClassDefFoundError这个异常的。
 
**  JavaEETrainingUtil  source code can be found from the article part #2

 1 #### NoClassDefFoundErrorSimulator.java
 2 package org.ph.javaee.training3;
 3 
 4 import java.net.URL;
 5 import java.net.URLClassLoader;
 6 
 7 import org.ph.javaee.training.util.JavaEETrainingUtil;
 8 
 9 /**
10  * NoClassDefFoundErrorSimulator
11  * @author Pierre-Hugues Charbonneau
12  *
13  */
14 public class NoClassDefFoundErrorSimulator {
15        
16         /**
17          * @param args
18          */
19         public static void main(String[] args) {
20               
21                System.out.println("java.lang.NoClassDefFoundError Simulator - Training 3");
22                System.out.println("Author: Pierre-Hugues Charbonneau");
23                System.out.println("http://javaeesupportpatterns.blogspot.com");
24               
25                // Local variables
26                String currentThreadName = Thread.currentThread().getName();
27                String callerFullClassName = "org.ph.javaee.training3.CallerClassA";
28               
29                // Print current ClassLoader context & Thread
30                System.out.println("\nCurrent Thread name: '"+currentThreadName+"'");
31                System.out.println("Initial ClassLoader chain: "+JavaEETrainingUtil.getCurrentClassloaderDetail());
32               
33                try {
34                        // Location of the application code for our child ClassLoader
35                        URL[] webAppLibURL = new URL[] {new URL("file:caller.jar"),new URL("file:referencer.jar")};
36                       
37                        // Child ClassLoader instance creation              
38                        URLClassLoader childClassLoader = new URLClassLoader(webAppLibURL);
39                       
40                        /*** Application code execution... ***/
41                       
42                        // 1. Change the current Thread ClassLoader to the child ClassLoader
43                        Thread.currentThread().setContextClassLoader(childClassLoader);
44                        System.out.println(">> Thread '"+currentThreadName+"' Context ClassLoader now changed to '"+childClassLoader+"'");
45                        System.out.println("\nNew ClassLoader chain: "+JavaEETrainingUtil.getCurrentClassloaderDetail());
46                       
47                        // 2. Load the caller Class within the child ClassLoader...
48                        System.out.println(">> Loading '"+callerFullClassName+"' to child ClassLoader '"+childClassLoader+"'...");
49                        Class<?> callerClass = childClassLoader.loadClass(callerFullClassName);
50                       
51                        // 3. Create a new instance of CallerClassA
52                        Object callerClassInstance = callerClass.newInstance();                    
53                       
54                } catch (Throwable any) {
55                        System.out.println("Throwable: "+any);
56                        any.printStackTrace();
57                }
58               
59                System.out.println("\nSimulator completed!");
60         }
61 }  

 1 #### CallerClassA.java
 2 package org.ph.javaee.training3;
 3 
 4 import org.ph.javaee.training3.ReferencingClassA;
 5 
 6 /**
 7  * CallerClassA
 8  * @author Pierre-Hugues Charbonneau
 9  *
10  */
11 public class CallerClassA {
12        
13         private final static Class<CallerClassA> CLAZZ = CallerClassA.class;
14        
15         static {
16                System.out.println("Class loading of "+CLAZZ+" from ClassLoader '"+CLAZZ.getClassLoader()+"' in progress...");
17         }
18        
19         public CallerClassA() {
20                System.out.println("Creating a new instance of "+CallerClassA.class.getName()+"...");
21               
22                doSomething();
23         }
24        
25         private void doSomething() {
26               
27                // Create a new instance of ReferencingClassA
28                ReferencingClassA referencingClass = new ReferencingClassA();             
29         }
30 }  

 1 #### ReferencingClassA.java
 2 package org.ph.javaee.training3;
 3 
 4 /**
 5  * ReferencingClassA
 6  * @author Pierre-Hugues Charbonneau
 7  *
 8  */
 9 public class ReferencingClassA {
10        
11         private final static Class<ReferencingClassA> CLAZZ = ReferencingClassA.class;
12        
13         static {
14                System.out.println("Class loading of "+CLAZZ+" from ClassLoader '"+CLAZZ.getClassLoader()+"' in progress...");
15         }
16        
17         public ReferencingClassA() {
18                System.out.println("Creating a new instance of "+ReferencingClassA.class.getName()+"...");
19         }
20        
21         public void doSomething() {
22                //nothing to do...
23         }
24 }  
问题重现
 
为了复现问题,简单的将caller和referencing分别打包并且赋给不同的加载器。现在,可以先以正确的jar包部署来执行程序: 
  • 主程序和工具包被部署在父加载器 (SYSTEM classpath)
  • CallerClassA 和ReferencingClassA被部署在子加载器中

 1 ## Baseline (normal execution)
 2 <JDK_HOME>\bin>java -classpath MainProgram.jar org.ph.javaee.training3.NoClassDefFoundErrorSimulator
 3 
 4 java.lang.NoClassDefFoundError Simulator - Training 3
 5 Author: Pierre-Hugues Charbonneau
 6 http://javaeesupportpatterns.blogspot.com
 7 
 8 Current Thread name: 'main'
 9 Initial ClassLoader chain:
10 -----------------------------------------------------------------
11 sun.misc.Launcher$ExtClassLoader@17c1e333
12 --- delegation ---
13 sun.misc.Launcher$AppClassLoader@214c4ac9 **Current Thread 'main' Context ClassLoader**
14 -----------------------------------------------------------------
15 
16 >> Thread 'main' Context ClassLoader now changed to 'java.net.URLClassLoader@6a4d37e5'
17 
18 New ClassLoader chain:
19 -----------------------------------------------------------------
20 sun.misc.Launcher$ExtClassLoader@17c1e333
21 --- delegation ---
22 sun.misc.Launcher$AppClassLoader@214c4ac9
23 --- delegation ---
24 java.net.URLClassLoader@6a4d37e5 **Current Thread 'main' Context ClassLoader**
25 -----------------------------------------------------------------
26 
27 >> Loading 'org.ph.javaee.training3.CallerClassA' to child ClassLoader 'java.net.URLClassLoader@6a4d37e5'...
28 Class loading of class org.ph.javaee.training3.CallerClassA from ClassLoader 'java.net.URLClassLoader@6a4d37e5' in progress...
29 Creating a new instance of org.ph.javaee.training3.CallerClassA...
30 Class loading of class org.ph.javaee.training3.ReferencingClassA from ClassLoader 'java.net.URLClassLoader@6a4d37e5' in progress...
31 Creating a new instance of org.ph.javaee.training3.ReferencingClassA...
32 
33 Simulator completed!  

在基准测试中,主程序可以正常运行,CallerClassA和他引用的类都可以被加载和实例化。
 
现在再次尝试运行程序,但是以一种错误的打包和部署方式来进行:
  • 主程序和工具类都被部署在父加载器(SYSTEM classpath)
  • CallerClassA和ReferencingClassA被部署在子加载器
  • CallerClassA (caller.jar)也被部署在父加载器

 1 ## Problem reproduction run (static variable initializer failure)
 2 <JDK_HOME>\bin>java -classpath MainProgram.jar;caller.jar org.ph.javaee.training3.NoClassDefFoundErrorSimulator
 3 
 4 java.lang.NoClassDefFoundError Simulator - Training 3
 5 Author: Pierre-Hugues Charbonneau
 6 http://javaeesupportpatterns.blogspot.com
 7 
 8 Current Thread name: 'main'
 9 Initial ClassLoader chain:
10 -----------------------------------------------------------------
11 sun.misc.Launcher$ExtClassLoader@17c1e333
12 --- delegation ---
13 sun.misc.Launcher$AppClassLoader@214c4ac9 **Current Thread 'main' Context ClassLoader**
14 -----------------------------------------------------------------
15 
16 >> Thread 'main' Context ClassLoader now changed to 'java.net.URLClassLoader@6a4d37e5'
17 
18 New ClassLoader chain:
19 -----------------------------------------------------------------
20 sun.misc.Launcher$ExtClassLoader@17c1e333
21 --- delegation ---
22 sun.misc.Launcher$AppClassLoader@214c4ac9
23 --- delegation ---
24 java.net.URLClassLoader@6a4d37e5 **Current Thread 'main' Context ClassLoader**
25 -----------------------------------------------------------------
26 
27 >> Loading 'org.ph.javaee.training3.CallerClassA' to child ClassLoader 'java.net.URLClassLoader@6a4d37e5'...
28 Class loading of class org.ph.javaee.training3.CallerClassA from ClassLoader 'sun.misc.Launcher$AppClassLoader@214c4ac9' in progress...// Caller is loaded from the parent class loader, why???
29 Creating a new instance of org.ph.javaee.training3.CallerClassA...
30 Throwable: java.lang.NoClassDefFoundError: org/ph/javaee/training3/ReferencingClassA
31 java.lang.NoClassDefFoundError: org/ph/javaee/training3/ReferencingClassA
32         at org.ph.javaee.training3.CallerClassA.doSomething(CallerClassA.java:27)
33         at org.ph.javaee.training3.CallerClassA.<init>(CallerClassA.java:21)
34         at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
35         at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
36         at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
37         at java.lang.reflect.Constructor.newInstance(Unknown Source)
38         at java.lang.Class.newInstance0(Unknown Source)
39         at java.lang.Class.newInstance(Unknown Source)
40         at org.ph.javaee.training3.NoClassDefFoundErrorSimulator.main(NoClassDefFoundErrorSimulator.java:51)
41 Caused by: java.lang.ClassNotFoundException: org.ph.javaee.training3.ReferencingClassA
42         at java.net.URLClassLoader$1.run(Unknown Source)
43         at java.net.URLClassLoader$1.run(Unknown Source)
44         at java.security.AccessController.doPrivileged(Native Method)
45         at java.net.URLClassLoader.findClass(Unknown Source)
46         at java.lang.ClassLoader.loadClass(Unknown Source)
47         at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
48         at java.lang.ClassLoader.loadClass(Unknown Source)
49         ... 9 more
50 
51 Simulator completed!  
发生什么了?
  • 主程序和工具类都正常的从父加载器加载成功 (sun.misc.Launcher$AppClassLoader)
  • 线程上下文加载器被更改为包含caller和reference的子加载器。
  • 但是我们会看到CallerClassA 会被父加载器加载 (sun.misc.Launcher$AppClassLoader) ,并没有被子加载器加载
  • 由于ReferencingClassA 没有被部署在父加载器, 所以他不能在当前加载器中加载,又由于父加载器对子加载器的无知,所以也不可能被子加载器加载。然后就报错NoClassDefFoundError。
 

 

关键点在于理解为什么CallerClassA会被父加载器加载。答案就在于默认的类加载委派模型,尽管子加载器和父加载器都包含caller的jar包,但默认的委派模型是父优先,这就导致caller只会在父加载器中被加载。但同时caller引用的ReferencingClassA却被部署在了子加载器,所以java.lang.NoClassDefFoundError自然会发生。
 正如你所见,由于默认的类加载委托模型的存在,代码的打包或者第三方的api都会导致这个问题的发生。所以,很重要的事情就是,你需要检视你的类加载器链条,确定是否有相同的代码或类库被重复部署在不同的父加载器和子加载器中。
 
建议和策略
 
如下是给出的建议和策略:
  • 仔细检视异常java.lang.NoClassDefFoundError并确定到底是哪个类导致问题
  • 检视受影响的程序的打包方式,看看是否能找到是相应的类存在重复或者错误的部署方式。(SYSTEM class path, EAR file, Java EE container itself etc.).
  • 如果找到了,那就需要将响应的类库从受影响的类加载器中移除。(有时会很复杂)
  • 启用jvm的属性verbose,比如–verbose:class很有帮助,会帮助你定位类是从哪个加载器中加载的。

翻译自:https://javaeesupportpatterns.blogspot.com/2012/08/javalangnoclassdeffounderror-parent.html

转载于:https://www.cnblogs.com/029zz010buct/p/10366808.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Thread.currentThread().setContextClassLoader为什么不生效与java.lang.NoClassDefFoundError之Java类加载的Parent fir... 的相关文章

  • IDM下载百度资源出现403的解决方法

    测试发现是受cookie的影响 xff0c 百度为了防止用外部下载工具突破限速加入了cookie验证 xff0c 因为一般的下载工具请求下载的时候不会附加cookie信息 IDM就是这样 xff0c 它请求下载文件时只知道文件的下载地址 x
  • 一些黄页 网站

    1 http www chinabig com http www chinabig com v07 product product sitemap htm 10 2 www ypinfo com 3 www chinapages com 转
  • 【免费内网穿透】公网环境下,Windows系统远程桌面控制树莓派

    系列文章 免费内网穿透 公网环境下 xff0c Windows系统远程桌面控制树莓派 无需公网IP 为远程桌面树莓派配置固定的公网TCP端口地址 远程桌面控制树莓派 xff0c 我们可以用xrdp协议来实现 xff0c 它内部使用的是win
  • 如何两个月刷400道leetcode

    前言 随着互联网寒潮的到来 越来越多的互联网公司提高了面试的难度 xff0c 其中之一就是加大了面试当中手撕算法题的比例 这里说的算法题不是深度学习 xff0c 机器学习这类的算法 xff0c 而是排序 xff0c 广度优先 xff0c 动
  • DE1-SOC开发板使用学习

    1 Yocto build utility 工具是什么 xff1f Linux Console with framebuffer是什么 xff1f 2 文档里面有几个Linux发布版本的 xff0c 分别是ubuntu和LXDE版本 LXD
  • 在shell脚本的第一行中,必须写#!/bin/bash吗?

    可以不写 执行时手工执行 bin sh xxxx sh 效果是一样的 bin sh 表示本脚本由 bin 路径的sh程序来解释 跟命令行下 xff03 通常用作注释 xff0c 但是 xff03 xff01 放在一起就标志着这是一个shel
  • android架构中最底层是什么层,Android体系架构

    Android开发入门教程一丶了解手机通讯技术发展史1 第一代通讯技术 第一代通讯技术 简单来说就是大哥大 其原理是通过 模拟信号进行传输 1 说话的时候产生声波震动 2 声波震动会让大哥大中的铜片产生震动 3 铜片震动会让其电容产生变化
  • linux桌面lxde 安装_Archlinux LXDE 桌面环境安装配置

    安装 LXDE LXDE 是模块化的 你可以从下面的列表中挑选你需要的包 xff0c 所有的包都可以通过pacman下载安装得到 他们大多数都在extra和community仓库中 如果你要安装像 LXAppearance 和 LXNM 这
  • PX4 FMU启动流程 2. 二、 nsh_initscript

    PX4 FMU启动流程 2 二 nsh initscript PX4 FMU启动流程 2 二 nsh initscript 转载请注明出处 2014 11 27 冷月追风
  • Eigen库

    MatrixXd表示任意size的矩阵 xff0c 元素类型为double VectorXd表示任意size的向量 xff0c 元素类型为double 创建3 1的向量v xff0c 并赋值为1 2 3 VectorXd v 3 v lt
  • 亲爱的热爱的百度云全集资源

    网盘链接 转载于 https www cnblogs com awesome share p 11234341 html
  • 解决Docker容器 iptables问题---docker: Error response from daemon: driver failed programming external conne...

    一 问题现象 最近在研究Docker容器日志管理时 xff0c 启动容器出现iptables相关报错 xff0c 具体问题如下 运行容器 root 64 node 11 docker run d p 24224 24224 p 24224
  • 内网穿透远程查看内网监控摄像头

    在现代社会中 xff0c 大家总是奔波于家和公司之间 大部分时间用于工作中 xff0c 也就很难及时知晓家中的动态情况 xff0c 对于家中有老人 小孩或宠物的 xff08 甚至对居住环境安全不放心的 xff09 xff0c 这已然是个棘手
  • 2022/6/15 docker安装与项目部署(入门教程)

    目录 一丶docker简介 二丶Docker私库简介 xff08 Dockerhub xff09 三丶Docker优势 四丶docker安装 4 1 使用官方安装脚本自动安装 xff08 仅适用于公网环境 xff09 4 2 手动安装 4
  • vim实现批量注释和批量删除注释

    批量注释 1 进入文档 xff0c vim test txt 后 xff0c 按住ctrl 43 v进入VISUAL BLOCK模式 xff0c 上下选择需要注释的行 2 按大写键 xff0c 再按i xff0c 或者直接按shift 43
  • 20191003

    A 把字典树建出来 xff0c 问题就转化成要选择m个节点 xff0c 使得它们能覆盖所有叶子节点 xff0c 且不存在两个节点使得一个是另一个的祖先 于是可以在字典树上跑树形dp xff0c 复杂度 O n 2m 或 O nm 2 xff
  • 20191004

    A 解 1 我们发现只需要关心处于结果字符串前 k 位的字符 因此考虑从后往前处理 对于一个询问区间 xff0c 我们暴力连边 xff0c 用并查集维护 xff0c x 的父亲等于 y 相当于位于 x 的字符是从位于 y 的字符处复制过来的
  • git 如何解决 (master|MERGING)

    git 如何解决 master MERGING git reset hard head 回退版本信息 git pull origin master 转载于 https www cnblogs com 651434092qq p 110188
  • linux ping 指定次数

    ping 192 168 0 1 c4 转载于 https www cnblogs com sea stream p 10345600 html
  • java 解决 java.lang.Integer cannot be cast to java.lang.String

    1 在执行代码打印map的value时 xff0c 提示错误java lang Integer cannot be cast to java lang String xff0c 这个错误很明显是类型转换错误 查看表字段的数据 解决方案 1

随机推荐

  • DBoW2应用

    图像对应的bag of words向量 v t 假设词典总共有 W 个单词 xff0c 那么每一幅图像能够用一个 W 维的向量表示 xff08 t 1 t 2 t 3 t W xff09 其中 t i 61 frac n id n nd l
  • 平衡车终于成功了

    说来惭愧2017 12 0118 13 27 并非原创 xff0c 代码资料也是从论坛搜刮的 自己做了适配性的调整 这个小车断断续续造了将近1个月 xff01 1 include 34 Wire h 34 96 2 include lt U
  • 彻底解决 Jenkins Slaver 节点无法执行 Git-LFS 命令

    最新配置新增一台iMac当作持续集成构建的Slaver节点 xff0c 添加节点很顺利 xff0c 但是拉取代码的时候发现无法正常 出现以下提示 xff1a hudson plugins git GitException Command 3
  • FreeRTOS

    在嵌入式领域中 xff0c 嵌入式实时操作系统正得到越来越广泛的应用 采用嵌入式实时操作系统 RTOS 可以更合理 更有效地利用CPU的资源 xff0c 简化应用软件的设计 xff0c 缩短系统开发时间 xff0c 更好地保证系统的实时性和
  • 使用固定的公网TCP端口地址远程桌面【内网穿透】

    文章目录 1 为远程桌面保留一个TCP地址2 配置远程桌面隧道2 1 登录cpolar web ui2 2 修改远程桌面隧道信息2 3 查看公网地址 3 使用固定TCP地址远程桌面总结 在上一篇文章中 xff0c 我们通过cpolar映射远
  • [Openwrt 项目开发笔记]:Openwrt平台搭建(一)补遗

    Openwrt项目开发笔记 系列文章传送门 xff1a http www cnblogs com double win p 3888399 html 正文 xff1a 昨晚上熬夜写了 Openwrt项目开发笔记 Openwrt平台搭建 xf
  • Mac下IDEA启动Springboot项目慢

    经过百度以及google查询发现 xff0c 启动时调用了java net InetAddress getLocalHost 方法 以此排查调用此方法慢的问题 网上的解决方法都是修改hosts xff0c 后来有人提出 xff0c 慢的原因
  • 关于varnish缓存

    目录 引言 xff1a 缓存的概念一 varnish缓存 1 简介2 总体结构 2 1 两个主进程2 2 Varnish的日志2 3 VCL varnish配置缓存策略的工具二 Varnish的工作模式 more 1 状态引擎的处理流程2
  • varnish6.X安装

    目录 1 rpm方式2 编译安装 2 1 依赖包2 2 编译Varnish 本文提供了两种安装方式 xff0c 但建议使用编译安装 官方链接 xff1a https varnish cache org 部署文档 xff1a https va
  • 安装ANSYS19.0的正确方法(附下载)

    安装ANSYS19 0的正确方法 卸载干净旧版本ANSYS 安装或重新安装之前必须先卸载干净 xff0c 安装过旧版本ANSYS的也要确保卸载干净 电脑环境准备参考以下内容 ANSYS 卸载后重装需要注意的问题 百度经验 https jin
  • 软件设计师 - 错题笔记

    2018 年 5 月 上午题 1 浮点数 浮点数对接时 xff0c 先对阶 xff0c 将小阶向大阶对齐 xff0c 同时尾数右移 n 位 xff08 n 为阶差的绝对值 xff09 2 流水线吞吐率 1 t 单位时间流水线处理的任务数 流
  • CAtia_打开提示:许可证过期怎么办

    CAtia 许可证过期怎么办 xff1a 进计算机管理 xff0c 点开服务和应用程序 xff0c 点服务 xff0c 找到DS License Server xff0c 在启动此服务的地方点启动 xff0c 从而开启DS License
  • 小米手机 fastboot 方式刷入 TWRP recovery 教程,以红米4X(santoni)为例

    最新版TWRP下载链接 xff1a https twrp me xiaomi xiaomiredmi4x html platform tools下载地址 xff1a https developer android google cn stu
  • 远程登录DSM,显示“您没有权限使用本项服务?

    远程登录DSM xff0c 显示 您没有权限使用本项服务 xff1f https www chiphell com thread 825297 1 1 html 有可能你单位用的是多wan接入 一般synology不让多个ip同一帐号同时接
  • 无人机寻迹要两个单片机吗_基于OpenMV的循迹无人机设计

    基于OpenMV的循迹无人机设计 发表时间 xff1a 2020 08 24 基于OpenMV机器视觉模块进行目标识别算法的研究 利用图像的滤波 二值化等算法对摄像头采集的图像进行预处理 利用边缘检测和形状识别算法获得引导线的路线信息 xf
  • linux 流量查看工具 iftop 配置

    linux 流量查看工具 iftop 配置 iftop是LINUX下查看网络流量的软件 iftop 官方网站 http www ex parrot com pdw iftop 1 iftop如何安裝 xff1a 首先查看自己的系统是否安裝
  • 技术系统进化法则是_技术系统进化论,模式七、系统由宏观向微观进化

    阿奇舒勒TRIZ理论三个核心思想 xff1a 1 无论是一个简单产品还是复杂的技术系统 xff0c 其核心技术的发展都是遵循着客观的规律发展演变的 xff0c 即具有客观的进化规律和模式 xff1b 2 各种技术难题和矛盾的不断解决是推动这
  • 吉他谱

    其实我是个诗人 01 得不到你 02 多想在平庸的生活拥抱你 03 往后余生 04 成都 转载于 https www cnblogs com zhangmingyan p 11603872 html
  • Openssl配置CA证书及https访问

    一 创建根秘钥对 1 创建目录 cd mkdir root ca cd root ca mkdir certs crl newcerts private chmod 700 private touch index txt echo 1000
  • Thread.currentThread().setContextClassLoader为什么不生效与java.lang.NoClassDefFoundError之Java类加载的Parent fir...

    众所周知 xff0c Java的类加载机制采用了双亲委派模型 xff0c 导致在进行类加载的时候会有多个加载器 xff0c 这种复杂的机制 xff0c 有时候会导致 Exception in thread main java lang No