谨用java.ext.dirs系统属性!

本文深入探讨了Java中ExtClassLoader的工作原理及其与系统属性java.ext.dirs的关系。通过具体示例展示了当未正确配置该系统属性时可能遇到的问题,并强调了在非web项目部署时需要注意的关键点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

众所周知,java中系统属性java.ext.dirs指定的目录由ExtClassLoader加载器加载,如果您的程序没有指定该系统属性(-Djava.ext.dirs=sss/lib)那么该加载器默认加载$JAVA_HOME/lib/ext目录下的所有jar文件。但如果你手动指定系统属性且忘了把$JAVA_HOME/lib/ext路径给加上,那么ExtClassLoader不会去加载$JAVA_HOME/lib/ext下面的jar文件,这意味着你将失去一些功能,例如java自带的加解密算法实现。

 

为了证明,我给弄个示例:

 

Java代码   收藏代码
  1. import com.sun.crypto.provider.AESCipher;//这个类是$JAVA_HOME/ext/lib/sunjce_provider.jar中的  
  2.   
  3. public class Test{  
  4.         public static void main(String[] args){  
  5.                 AESCipher cipher=new AESCipher();  
  6.                 System.out.println(cipher.getClass());  
  7.                 System.out.println(Test.class.getClassLoader().getParent());  
  8.                 System.out.println(System.getProperty("java.ext.dirs"));  
  9.         }  
  10. }  

 执行:

    javac Test.java

    java Test

打印:

 
class com.sun.crypto.provider.AESCipher
sun.misc.Launcher$ExtClassLoader@da4b71
D:\Program Files (x86)\Java\jdk1.7.0_60\jre\lib\ext;C:\windows\Sun\Java\lib\ext

 

执行:

    java -Djava.ext.dirs=lib Test

打印:

 

Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/crypto/provider/AESCipher
        at Test.main(Test.java:5)
Caused by: java.lang.ClassNotFoundException: com.sun.crypto.provider.AESCipher
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        ... 1 more


————————————————————————————————————————————————————————————————————————————————————————

 

前天给项目加SSL协议的时候出现了这个问题,在本地测试没有任何问题,但是一上测试环境测试的时候出现握手失败,抓包分析发现客户端连上服务器后给服务端发出了154个byte的数据包,服务端ack后立即给断开连接了。查看服务器日志后发现这样一段错误:“Could not generate DH keypair”,起初怀疑这会不会是JDK有问题,后来经仔细排查发现java的加密算法实现都在jdk扩展库里面,而我们的程序给指定了-Djava.ext.dirs=lib,这一动作导致sun.misc.Launcher$ExtClassLoader扩展类加载器不会加载默认$JAVA_HOME/lib/ext下的包了。

 

不得不承认java.ext.dirs系统属性在部署非web项目的时候非常省事,但是用它的时候请记住这一点!~


 本文转载自ITEYE文章:谨用java.ext.dirs系统属性!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值