谨用java.ext.dirs系统属性!
2017-03-22 16:00
399 查看
众所周知,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代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201909/21/11d7b799ed7cd534cf58cbf81698bbda.png)
import com.sun.crypto.provider.AESCipher;//这个类是$JAVA_HOME/ext/lib/sunjce_provider.jar中的
public class Test{
public static void main(String[] args){
AESCipher cipher=new AESCipher();
System.out.println(cipher.getClass());
System.out.println(Test.class.getClassLoader().getParent());
System.out.println(System.getProperty("java.ext.dirs"));
}
}
执行:
javac Test.java
java Test
打印:
执行:
java -Djava.ext.dirs=lib Test
打印:
————————————————————————————————————————————————————————————————————————————————————————
前天给项目加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系统属性!
为了证明,我给弄个示例:
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201909/21/11d7b799ed7cd534cf58cbf81698bbda.png)
import com.sun.crypto.provider.AESCipher;//这个类是$JAVA_HOME/ext/lib/sunjce_provider.jar中的
public class Test{
public static void main(String[] args){
AESCipher cipher=new AESCipher();
System.out.println(cipher.getClass());
System.out.println(Test.class.getClassLoader().getParent());
System.out.println(System.getProperty("java.ext.dirs"));
}
}
执行:
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系统属性!
相关文章推荐
- java.endorsed.dirs 和 java.ext.dirs 系统属性说明
- java.endorsed.dirs 和 java.ext.dirs 系统属性说明
- 在Java中获取系统属性
- 在Java中获取系统属性
- Java应用过程中获取系统属性
- XP系统下Java修改文件或文件夹属性的代码。
- 在Java中获取系统属性的方法
- 在Java中获取系统属性
- 在Java中获取系统属性
- java中察看系统属性
- 在Java中获取系统属性
- java获取系统环境变量和系统属性
- 在Java中获取系统路径属性
- java系统属性取得
- 用JAVA获取系统字体属性!!!
- java中获取系统属性以及环境变量
- 积累:在Java中获取系统属性
- 用JAVA获取系统字体属性!!!
- java系统属性取得
- 获得所有系统属性java.lang.sysytem.getProperties