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

classpath 和 java.ext.dirs 的区别

    博客分类:
  • Java
 
阅读更多
先说说我的遭遇:
以下是我到运行脚本
java -cp lib -Djava.ext.dirs=lib com.test.Test

之前一直运行正常,突然一天报如下错(但本地在eclipse里面运行始终正常)

java.io.IOException: javax.net.ssl.SSLKeyException: RSA premaster secret error
java.io.IOException: java.io.IOException: javax.net.ssl.SSLKeyException: RSA premaster secret error

开始怀疑是jdk问题,重装jdk还是不行。
因为用到httpclient,以为是版本问题,所以修改httpclient为4.0版本,并设置为信任任何网站,还是提示错误,大致是没有访问权限的意思。

无耐之下,开始研究服务器跟本地的区别(因为只有在服务器上才出错,本地是可以的)。jdk比较过了,一样的版本。没道理啊,下载服务器代码本地部署一份(因为本地用ubuntu,所以部署跟服务器一模一样),问题来了,线上到代码在本地也不行了。奇怪。。。。。继续缩小排查范围。比较跟之前在本地能正常运行的程序(因为代码一样,只有部署有稍微差别)。
抱着试一试到态度修改来以下代码:
java -cp lib -Djava.ext.dirs=lib com.test.Test

修改后为:
java -cp lib/test.jar com.test.Test

竟然运行OK啦,奇怪?????算了,先保证能运行再说!
可是问题又来了,我的log4j.xml不能打包到jar里啊,这样修改不方便,怎么加入到运行参数呢???
search。。。。。in。。。。baidu。。。。。。
得到解决方案:
-Dlog4j.configuration=file:/lib/log4j.xml

在修改后的代码追加以上代码,日志打印OK。

研究至此已经解决了本次遇到到问题。但是一想,如果我有多个jar呢?
经过尝试“classpth”是不支持通配符“*”的,所以目前能想到的唯一办法是一个一个追加到后面。

如果有多个配置文件呢?
......

算了,想想都可怕,原来失去”Djava.ext.dirs“这么可怕。。。。。。

抽时间还是算好好研究研究"-cp"和”-Djava.ext.dirs“的加载规则吧。



分享到:
评论
5 楼 lgh1992314 2017-12-06  
scugxl 写道
这个java.ext.dirs属于加载的JRE/LIB/EXT这个目录下的jar包,-cp只能使用jar包不能指定文件夹,你这个可以算法应该是在这个EXT目录下的。

-cp <目录和 zip/jar 文件的类搜索路径>
-classpath <目录和 zip/jar 文件的类搜索路径>
           用 ; 分隔的目录, JAR 档案
           和 ZIP 档案列表, 用于搜索类文件。

文件夹下的只能是类而不可以是jar包(无法加载)。
4 楼 Oneforher 2016-08-10  
java -Djava.ext.dirs 加载Lib后,%JAVA_HOME%\jre\lib\ext 下面的jar包就不会加载啦
3 楼 cxw1128 2015-11-11  
java -Djava.ext.dirs=/home/ice/StoreManager/lib:.: org.jn.iipg.icetoavro.StoreServer

应该是这样的吧
2 楼 scugxl 2015-01-28  
这个java.ext.dirs属于加载的JRE/LIB/EXT这个目录下的jar包,-cp只能使用jar包不能指定文件夹,你这个可以算法应该是在这个EXT目录下的。
1 楼 chenjinbo1983 2013-04-27  
这样试试
java  -Djava.ext.dirs=lib com.test.Test 

相关推荐

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

    JAVA的类加载器的工作原理.pdf

    Extension 类加载器将加载类的请求先委托给它的父加载器,也就是 Bootstrap,如果没有成功加载的话,再从 jre/lib/ext 目录下或者 java.ext.dirs 系统属性定义的目录下加载类。Extension 加载器由 sun.misc.Launcher...

    java classloader classpath 张孝祥

    - **扩展类加载器**(Extension ClassLoader):由`sun.misc.Launcher$ExtClassLoader`实现,它用来加载&lt;JAVA_HOME&gt;/lib/ext目录下的类库或被-Djava.ext.dirs指定的路径中的所有类库。 - **应用类加载器**...

    Java类加载器(ClassLoader)1

    - 从java.ext.dirs系统属性指定的目录或JRE的lib/ext子目录加载类库。 - 如果用户将JAR文件放入此目录,将自动由扩展类加载器加载。 3. 应用程序类加载器(Application ClassLoader,System ClassLoader): - ...

    Java Class Loader总结.doc

    4. 如果Bootstrap ClassLoader找不到所需的类,请求会传递给Extension ClassLoader,它负责加载JRE的扩展类库,这些类通常位于`java_home/lib/ext`目录下或-Djava.ext.dirs指定的路径。 5. 如果Extension ...

    JAVA启动参数大全1.pdf

    2. Extension路径是`JRE_HOME/lib/ext`目录下的JAR文件,可以在运行完Bootstrap路径后被搜索,用`System.getProperty("java.ext.dirs")`获取。 3. User路径包括当前目录、CLASSPATH和-classpath指定的路径,是最后被...

    Java类加载器学习总结.pdf

    2. **扩展类加载器(Extension Class Loader)**:由Java编写,具体为`sun.misc.Launcher$ExtClassLoader`,它是引导类加载器的子加载器,负责加载%JAVA_HOME%\jre\lib\ext目录下的类库或java.ext.dirs系统变量指定...

    java中ClassLoader

    2. Extension ClassLoader:称为扩展类加载器,负责加载 Java 的扩展类库,默认加载 JAVA_HOME/jre/lib/ext/ 目下的所有 jar 文件,以及将 -Djava.ext.dirs 指定的目录下的 jar 文件加载进去。 3. App ClassLoader...

    java 类加载器 class loader

    2. 扩展类加载器(Extension ClassLoader):加载JDK的`jre/lib/ext`目录下的JAR文件或系统属性`java.ext.dirs`指定的目录下的类库。 3. 应用程序类加载器(Application ClassLoader):也称为系统类加载器,负责...

    大学课程讲义-Java基础-反射.pptx

    * 扩展类加载器(Extension ClassLoader):负责jdk_home/lib/ext目录下的jar包或-D java.ext.dirs指定目录下的jar包装入工作。 * 系统类加载器(System ClassLoader):负责java -classpath或-D java.class.path所...

    java的ClassLoader类加载器机制

    扩展类加载器(Extension ClassLoader)负责加载 JRE 的扩展目录(JAVA_HOME/jre/lib/ext 或者由 java.ext.dirs 系统属性指定的)中 JAR 的类包。这为引入除 Java 核心类以外的新功能提供了一个标准机制。扩展类加载...

    JAVA的类加载器的工作原理.docx

    Extension类加载器将加载类的请求先委托给它的父加载器,也就是Bootstrap,如果没有成功加载的话,再从jre/lib/ext目录下或者java.ext.dirs系统属性定义的目录下加载类。 System类加载器(或者叫作Application类...

    Java类加载机制

    2. **扩展类加载器(Extension Class Loader)**:该类加载器负责加载位于 `java.ext.dirs` 系统属性指定目录下的 jar 包中的类库。这些类库提供了扩展的功能,比如 JAXP 和 JDBC 等。 3. **应用类加载器...

    Java中类的生命周期.doc

    2. **扩展类加载器**: 用来加载`&lt;JAVA_HOME&gt;/lib/ext`目录中的类库或者被`java.ext.dirs`系统变量指定的路径中的所有类库。 3. **系统类加载器**: 也称为应用类加载器,用来加载用户类路径(Classpath)所指定的类。...

    测试普通Java程序ClassLoader等级关系的Demo程序

    2. **Extension ClassLoader**:扩展类加载器,加载JRE的扩展目录(jre/lib/ext)下的jar包或者由java.ext.dirs系统属性指定的目录中的类库。 3. **System ClassLoader**(也称为App ClassLoader或ClassLoader):...

    ClassLoader 详解.doc

    其主要任务是加载JRE的扩展目录下的JAR包,如JAVA_HOME/jre/lib/ext目录或由java.ext.dirs系统属性指定的路径。这种方式允许开发者添加JVM扩展功能,而无需修改核心类库。Extension ClassLoader的父加载器是...

Global site tag (gtag.js) - Google Analytics