众所周知,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自带的加解密算法实现。
为了证明,我给弄个示例:
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项目的时候非常省事,但是用它的时候请记住这一点!~
相关推荐
用于自动配置java安装后的系统配置路径,安装完成java工具包JDE之后,直接运行本资源脚本,然后输入刚刚安装完成的JDE路径,即可自动配置Windows下环境变量所需要的所有信息。
`java.ext.dirs`是Java扩展目录的路径,用于存放可选的Java扩展类库。 关于操作系统的信息,有`os.name`(操作系统名称)、`os.arch`(操作系统架构)和`os.version`(操作系统版本)。文件、路径和行的分隔符可...
●java.ext.dirs:JDK的安装目录; ●os.name:操作系统名称; ●user.name:用户登录名称; ●os.version:操作系统版本; ●path.separator:当前操作系统的路径分隔符; ●user.dir:当前用户...
- `java.ext.dirs`:JDK的扩展目录,包含额外的JAR文件。 - `os.name`:操作系统的名称。 - `user.name`:用户的登录名。 - `os.version`:操作系统的版本。 - `path.separator`:路径分隔符,Windows下为`;`,Unix/...
linux-java-jar包启动脚本
6. 然后javac -Djava.ext.dirs="JCuda-All-0.8.0-bin-linux-x86_64" CudaGdbscan.java和javac -Djava.ext.dirs="JCuda-All-0.8.0-bin-linux-x86_64" Test.java分别编译; 7. 最后运行java -Djava.ext.dirs="JCuda-...
- `java.ext.dirs`: 扩展目录或目录列表的路径。 - `os.name`: 操作系统名称。 - `os.arch`: 操作系统架构。 - `os.version`: 操作系统版本。 - `file.separator`: 文件分隔符(UNIX系统中通常为“/”)。 - `path....
- **Eclipse**:Eclipse是一款广泛使用的Java集成开发环境(IDE),用于编写、调试和管理Java应用程序。你可以从官方网站(https://www.eclipse.org/downloads/)下载适合你的操作系统的版本。 - **JDK 8.0**:Java ...
- **一个或多个扩展目录的路径** (`java.ext.dirs`):指明了JVM用于加载扩展类的目录路径。 - **用户的账户名称** (`user.name`):显示了当前用户的账户名。 通过以上介绍,我们可以看到`System.getProperties()`...
- 示例代码:`System.getProperty("java.ext.dirs")` - 应用场景:加载扩展库。 20. **`os.name`** - 描述:操作系统名称。 - 示例代码:`System.getProperty("os.name")` - 应用场景:根据操作系统做特定...
19. **java.ext.dirs** - 一个或多个扩展目录的路径,用于指定Java扩展包的位置。 20. **os.name** - 操作系统的名称,如“Windows 10”。 21. **os.arch** - 操作系统的架构,例如“amd64”或“x86”。 22. **os....
- **Java环境信息**:如Java安装目录(`java.home`)、JDK安装目录(`java.ext.dirs`)等。 - **文件系统信息**:如文件分隔符(`file.separator`)、路径分隔符(`path.separator`)等。 - **用户信息**:如用户的主目录(`...
#### 10.1 `java.ext.dirs` 返回包含可选扩展包的目录列表。 ### 11. 获取操作系统信息 #### 11.1 `os.name` 返回操作系统的名称,如`Windows 10`、`Linux`或`Mac OS X`。 #### 11.2 `os.arch` 返回操作系统的...
- **扩展目录**:`java.ext.dirs`,列出了包含扩展包的目录列表。 ### 操作系统信息 操作系统相关的属性提供了对运行Java程序的主机操作系统的深入了解: - **操作系统名称**:`os.name`,如“Linux”、“Windows...
set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib% set Output_Path=.\source //输出目录 set Package= com.test.webservice.client %Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% -p%Package% ...
System.out.println("扩展目录:\n" + System.getProperty("java.ext.dirs")); ``` 列出Java扩展目录,这些目录通常包含附加的类库和jar文件。 #### 12. 获取操作系统名称 ```java System.out.println("操作系统名称...
System.out.println("扩展目录路径:" + props.getProperty("java.ext.dirs")); System.out.println("操作系统名称:" + props.getProperty("os.name")); System.out.println("操作系统架构:" + props.getProperty...
- **`java.ext.dirs`**:指定了一个或多个扩展目录的路径。这些目录包含了JRE提供的额外类库。 #### 操作系统相关信息 - **`os.name`**:显示操作系统名称,例如“Windows 10”、“Linux”等。 - **`os.arch`**:...
Solving the problem was a matter of putting the sunjce_provider.jar in one of the folders specified in the java.ext.dirs parameter. Hard to find, easy to solve. 把sunjce_provider.jar 放到JDKclasspath...
cd D:\selenium快速入门示例 D: set JAVA_HOME=E:\tools\java\jdk1.8.0_181x64 set PATH=%JAVA_HOME%\bin;%PATH% javac -encoding utf-8 -Djava.ext.dirs=....java -Djava.ext.dirs=. SogouTest1 pause