将JAR文件放入jre/lib/ext目录中遇到的麻烦

问题描述:

在新项目中因为MYSQL数据库的版本为5.6,对应的jdbc驱动包为5.1.40。但是引用后一直提示jar包版本不符合,看了很久一直没找到问题、最后没办法只能全局搜看还有没有其它JDBC驱动包。结果发现不知道什么时候在jre/lib/ext的目录下放了一个mysql-connect-jdbc.5.18.jar的包,把改jar删除问题解决。

     在网上搜了下造成这个问题的主要原因为:JAVA类加载时采用树形的委托机制,默认有三个类加载器,bootstrap:主要加载jdk中jre/lib/rt.jar中的类,ExtClassLoader加载jre/lib/ext/*.jar,AppClassLoader加载classpath指定的jar或者目录,

这三个类加载器bootstrap是处在树的根节点,然后是ExtClassLoader,接着是子节点AppClassLoader。
bootstrap不是一个java类,其他两个都是java类,他们执行顺序是,bootstrap最先加载,然后ExtClassLoader加载。再AppClassLoader。
他们是采取向上委托的,即,如果AppClassLoader需要加载类时,首先它自己不加载,它向ExtClassLoader询问,ExtClassLoader也不加载,直接向bootstrap询问。这时,bootstrap是根节点,它没有上级,它直接去它的目录加载,如果加载成功,那就ok了,如果没有加载成功,那bootstrap会退回到ExtClassLoader,ExtClassLoader去它目录加载,如果加载成功,那就ok,如果没有成功,退回到AppClassLoader,AppClassLoader去它目录加载,如果加载成功那ok,如果不成功,如果AppClassLoader还有子的类加载器,AppClassLoader也不会退回到他的子加载器,AppClassLoader会直接抛异常。
      “如果将JAR文件放入jre/lib/ext目录中,那么jre/lib/ext目录下是ExtClassLoader类加载器加载的,它会优先与AppClassLoader加载,所以导致项目启动后一直加载的是jre/lib/ext目录中的JDBC驱动。

 

另外在《Java核心编程》安全一章中有如下miao描述

警告:如果将JAR文件放入jre/lib/ext目录中,并且在它的类中有一个类需要调用既不是系统类也不是扩展类,那么就会遇到麻烦。扩展类加载器并不使用类路径。在使用扩展目录来解决文件的冲突之前,要牢记这种情况

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/bin/java -javaagent:/Applications/IntelliJ IDEA CE.app/Contents/lib/idea_rt.jar=63141:/Applications/IntelliJ IDEA CE.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/cat.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/crs-agent.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/rt.jar:/Users/shenglei/Library/Mobile Documents/com~apple~CloudDocs/💻Code/🍀/i/out/production/i Task1 Exception in thread "main" java.lang.IllegalArgumentException: Error decoding percent encoded characters at sun.net.www.ParseUtil.decode(ParseUtil.java:216) at sun.misc.URLClassPath$FileLoader.<init>(URLClassPath.java:1366) at sun.misc.URLClassPath$3.run(URLClassPath.java:574) at sun.misc.URLClassPath$3.run(URLClassPath.java:569) at java.security.AccessController.doPrivileged(Native Method) at sun.misc.URLClassPath.getLoader(URLClassPath.java:568) at sun.misc.URLClassPath.getLoader(URLClassPath.java:533) at sun.misc.URLClassPath.getNextLoader(URLClassPath.java:498) at sun.misc.URLClassPath.getResource(URLClassPath.java:252) at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:363) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:362) at java.lang.ClassLoader.loadClass(ClassLoader.java:419) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352) at java.lang.ClassLoader.loadClass(ClassLoader.java:352) at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:304) at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:401) FATAL ERROR in native method: processing of -javaagent failed 进程已结束,退出代码134 (interrupted by signal 6: SIGABRT)
06-06

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值