使用URLClassLoader報錯not class found exception
使用ClassLoader時需要了解ClassLoader的雙親委任模型,不同型別的classloader及載入順序為:
1. bootstraploader:
bootstrap載入器,是c++編寫的,在java虛擬機器啟動後初始化,用於載入%java_home%/jre/lib及%java_home%/jre/classes指定的類。
2.ExtClassLoader
是由java程式碼編寫的,由bootstraploader載入並在載入時將其父載入器設定為bootstraClassloader。主要用於載入%JAVA_HOME%/jre/ext路徑下的所有classes目錄一級java.ext.dirs系統變數指定的路徑中的類庫。
3.AppClassloader:
是由java程式碼編寫的,由ExtClassLoader進行載入並將其父載入器設定為ExtClassLoader。classloader的getSystemClassLoader方法獲得的就是改載入器。改載入器主要用於載入classpath指定路徑下的jar或者class類。這也是java程式預設的類載入器。
雙親委派模型
每個類載入器都有自己的載入快取,當一個類被載入後會將該類放入快取,下載載入時直接返回該類。雙親委派模型載入類時主要執行以下幾個步驟:
1.classloader首先從自己載入的類中查詢該類是否已經載入,若查詢到該類則直接返回
2.若classloader沒有查詢到要載入的類,則classloader會將該類傳遞給父級classloader,委託父級載入器載入該類,父級classloader在自己的快取中查詢該類,若找到則返回該類,否則再委託自己的父級載入器。以此類推直至找到該類或到bootstrapclassolader。
3.若上述過程沒有查詢到需要載入的類,再由classloader自身進行該類的載入並放入載入快取。
為什麼要使用雙親委派模型
1.名稱空間
在java虛擬機器中,已classloader加類的全限定名來作為類在JVM中的唯一標識。
雙親委派模型保證了classloader之間的互動性,上級類載入器載入的類在所有子級類載入器中是共享的。
問題分析及解決
上述問題產生的背景是使用classloader動態載入jar及class,在載入jar時使用的是Appclassloader,而載入class時使用的是通過Thread.currentTread.contextClassLoader獲取的普通類載入器。導致載入的jar及class不在同一上下文中。從而出現CNF錯誤。
所以在使用classloader載入jar或類時,出現上述問題需要注意使用的classloader的上下文是否相同
關於雙親委派模型的概念摘自https://blog.csdn.net/wangyang1354/article/details/49448007/
java新手,僅以此文做問題記錄,同時希望能夠幫到有需要的朋友,文中若描述有誤歡迎斧正
相關文章
- Lumen 報錯 : Class 'League\Flysystem\Adapter\Local' not foundAPT
- Symfony\Component\Debug\Exception\FatalThrowableError Class 'Lcobucci\JWT\Builder' not foundExceptionErrorJWTUI
- linux 報錯 jpype._jexception.RuntimeExceptionPyRaisable: java.lang.RuntimeException: Class not foundLinuxExceptionAIJava
- Ubuntu 20.04 安裝 php-xml 模組(報錯:Class 'DOMDocument' not found )UbuntuPHPXML
- Eclipse 啟動專案錯誤:class not foundEclipse
- gorm忽略報錯: record not foundGoORM
- composer安裝完成輸入命令報錯:Fatal error: Class ‘Phar‘ not found in C:\\ProgramData\\ComposerSetup\\bin\\compoError
- 【linux報錯】-bash: xhost: command not foundLinux
- 【maven】Maven報錯 zip END header not foundMavenHeader
- python virtualenv報錯-bash: virtualenv: command not foundPython
- Java報錯:Exception in thread "main" java.lang.UnsupportedClassVersionErrorJavaExceptionthreadAIError
- Mac之telnet報錯-bash: telnet: command not foundMac
- React Native 報錯 'config.h' file not foundReact Native
- 設定Ruby報錯bad response Not Found 404
- RocketMQ報錯:rocketmq.remoting.exception.RemotingTooMuchRequestException: sendDefaultImpl call timeoutMQREMExceptionOOM
- 執行composer install報錯:Symfony\Component\Process\Exception\ProcessTimedOutExceptionException
- go tool compile 報錯 could not import sync (file not found)GoCompileImport
- cgo: C compiler "gcc" not found 報錯安裝gccGoCompileGC
- vue中報錯:[vuex] module namespace not found in mapActions(): comment/Vuenamespace
- sourcetree github clone 報錯 hg clone fails with “repository not found“GithubAI
- AS執行main()方法報錯:SourceSet with name ‘main‘ not foundAI
- 執行npm run dev 後報錯 Mix: not foundNPMdev
- npm install報錯, npm ERR! code MODULE_NOT_FOUNDNPM
- Flutter 安裝搭建報錯 Android sdkmanager tool not foundFlutterAndroid
- Appcrawler 執行報錯 Exception in thread "main" java.lang.NullPointerExceptionAPPExceptionthreadAIJavaNull
- 案例2問答機器人報TypeError: Class com.hankcs.hanlp.HanLP is not found機器人ErrorHanLP
- MybatisPlus自帶方法報錯BindingException: Invalid bound statement (not found)MyBatisException
- /system/bin/sh: screenrecord: inaccessible or not found 報錯解決方案
- jmeter報錯“Uncaught exception in thread Thread[AWT-EventQueue-0,6,main]“JMeterExceptionthreadAI
- 11.2.0.1bug引發的報錯:ORA-07445: exception encounteredException
- 編寫自定義 Laravel 擴充套件包測試用例,phpunit 錯誤提示 “class not found”Laravel套件PHP
- Sqlserver使用遊標迴圈查詢所有sqlserver error日誌帶有Exception的報錯SQLServerErrorException
- [Symfony Component Process Exception RuntimeException] The Process class relies on proc_open, whichException
- BOOST應用 無法解析的外部符號 "void __cdecl boost::throw_exception(class std::exception const &)"符號Exception
- 【ASM】Oracle RAC css啟動報錯"Duplicate voting file found"ASMOracleCSS
- SQLServer2012搭建AlwaysOn報錯:Certificate not found. State 89SQLServer
- npm install報錯not found: python2的結局方法NPMPython
- webpack 5 報錯 entry “mian“ not found did you spescify the correct option?Web