`
xsh5324
  • 浏览: 71527 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

    博客分类:
  • java
阅读更多

众所周知,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项目的时候非常省事,但是用它的时候请记住这一点!~

 

0
2
分享到:
评论

相关推荐

    Javapath.bat

    用于自动配置java安装后的系统配置路径,安装完成java工具包JDE之后,直接运行本资源脚本,然后输入刚刚安装完成的JDE路径,即可自动配置Windows下环境变量所需要的所有信息。

    java获取系统参数

    `java.ext.dirs`是Java扩展目录的路径,用于存放可选的Java扩展类库。 关于操作系统的信息,有`os.name`(操作系统名称)、`os.arch`(操作系统架构)和`os.version`(操作系统版本)。文件、路径和行的分隔符可...

    9异常,系统属性,Math类.rar

     ●java.ext.dirs:JDK的安装目录;  ●os.name:操作系统名称;  ●user.name:用户登录名称;  ●os.version:操作系统版本;  ●path.separator:当前操作系统的路径分隔符;  ●user.dir:当前用户...

    在Java中获取系统属性.doc

    - `java.ext.dirs`:JDK的扩展目录,包含额外的JAR文件。 - `os.name`:操作系统的名称。 - `user.name`:用户的登录名。 - `os.version`:操作系统的版本。 - `path.separator`:路径分隔符,Windows下为`;`,Unix/...

    linux-java-jar包启动脚本

    linux-java-jar包启动脚本

    jcuda实现的dbscan

    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中System.getProperty的使用

    - `java.ext.dirs`: 扩展目录或目录列表的路径。 - `os.name`: 操作系统名称。 - `os.arch`: 操作系统架构。 - `os.version`: 操作系统版本。 - `file.separator`: 文件分隔符(UNIX系统中通常为“/”)。 - `path....

    luckyframe环境搭建.doc

    - **Eclipse**:Eclipse是一款广泛使用的Java集成开发环境(IDE),用于编写、调试和管理Java应用程序。你可以从官方网站(https://www.eclipse.org/downloads/)下载适合你的操作系统的版本。 - **JDK 8.0**:Java ...

    Java中通过System.getProperties()获取系统参数测试.docx

    - **一个或多个扩展目录的路径** (`java.ext.dirs`):指明了JVM用于加载扩展类的目录路径。 - **用户的账户名称** (`user.name`):显示了当前用户的账户名。 通过以上介绍,我们可以看到`System.getProperties()`...

    java项目路径(相关信息)的取得

    - 示例代码:`System.getProperty("java.ext.dirs")` - 应用场景:加载扩展库。 20. **`os.name`** - 描述:操作系统名称。 - 示例代码:`System.getProperty("os.name")` - 应用场景:根据操作系统做特定...

    windows操作系统中的系统属性.docx

    19. **java.ext.dirs** - 一个或多个扩展目录的路径,用于指定Java扩展包的位置。 20. **os.name** - 操作系统的名称,如“Windows 10”。 21. **os.arch** - 操作系统的架构,例如“amd64”或“x86”。 22. **os....

    在Java中获取系统属性

    - **Java环境信息**:如Java安装目录(`java.home`)、JDK安装目录(`java.ext.dirs`)等。 - **文件系统信息**:如文件分隔符(`file.separator`)、路径分隔符(`path.separator`)等。 - **用户信息**:如用户的主目录(`...

    关于java获取操作系统信息

    #### 10.1 `java.ext.dirs` 返回包含可选扩展包的目录列表。 ### 11. 获取操作系统信息 #### 11.1 `os.name` 返回操作系统的名称,如`Windows 10`、`Linux`或`Mac OS X`。 #### 11.2 `os.arch` 返回操作系统的...

    java获取当前系统信息

    - **扩展目录**:`java.ext.dirs`,列出了包含扩展包的目录列表。 ### 操作系统信息 操作系统相关的属性提供了对运行Java程序的主机操作系统的深入了解: - **操作系统名称**:`os.name`,如“Linux”、“Windows...

    wsdl2java工具

    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% ...

    java获取系统参数规格

    System.out.println("扩展目录:\n" + System.getProperty("java.ext.dirs")); ``` 列出Java扩展目录,这些目录通常包含附加的类库和jar文件。 #### 12. 获取操作系统名称 ```java System.out.println("操作系统名称...

    java设置http代理

    System.out.println("扩展目录路径:" + props.getProperty("java.ext.dirs")); System.out.println("操作系统名称:" + props.getProperty("os.name")); System.out.println("操作系统架构:" + props.getProperty...

    Java 运行时环境版本

    - **`java.ext.dirs`**:指定了一个或多个扩展目录的路径。这些目录包含了JRE提供的额外类库。 #### 操作系统相关信息 - **`os.name`**:显示操作系统名称,例如“Windows 10”、“Linux”等。 - **`os.arch`**:...

    sunjce_provider-1.0.0.jar

    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...

    selenium快速入门示例

    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

Global site tag (gtag.js) - Google Analytics