java ext.dirs_关于-Djava.ext.dirs使用及JAVA 命令参数详解System.setProperty

大家在linux环境下使用命令行执行java程序时,经常要使用到大量外部的jar包或class文件,一般我们有哪些方式可以用呢?

  • -classpath,命令格式:# java -classpath ,使用";"分隔
  • -cp ,这个命令一看就是-classpath的缩写,当然用途是一样的

例如:
java -cp “.\a.jar;.\b.jar” -jar myjar.jar MainClass # java -cp .;c:\dir1\lib.jar Test

-Djava.ext.dirs,命令格式:# java -Djava.ext.dirs=

下面说一下区别:
-cp 和 -classpath 一样,是指定java类运行所依赖其他类的路径,通常是类库,jar包之类,需要全路径到jar包,
window上使用分号“;” 分隔,linux上是使用冒号“:”分隔。不支持通配符,也不支持文件夹的方式,需要列出所有jar包,
用点“.”代表当前路径,这个如果要引用好多jar包,要一个个加入到路径里,那写起来就头疼。

如:java -cp .;c:\classes\myClass.jar;d:\classes\1.jar packname.mainclassname。

-Djava.ext.dirs是通过设置系统属性的方式也加载jar包的,这个级别就有点高了,和-classpath的区别在于-Djava.ext.dirs会覆盖Java本身的ext设置,java.ext.dirs指定的目录由ExtClassLoader加载器加载,
如果您的程序没有指定该系统属性 -Djava.ext.dirs=sss/lib 那么该加载器默认加载 J A V A H O M E / l i b / e x t 目录下的所有 j a r 文件。但如果你手动指定系统属性且忘了把 J A V A H O M E / l i b / e x t 路径给加上,那么 E x t C l a s s L o a d e r 不会去加载 JAVA_HOME/lib/ext目录下的所有jar文件。 但如果你手动指定系统属性且忘了把JAVA_HOME/lib/ext路径给加上,那么ExtClassLoader不会去加载 JAVAHOME/lib/ext目录下的所有jar文件。但如果你手动指定系统属性且忘了把JAVAHOME/lib/ext路径给加上,那么ExtClassLoader不会去加载JAVA_HOME/lib/ext下面的jar文件,这意味着你将失去一些功能,

例如java自带的加解密算法实现。具体说是jre的ext目录:D:\java\jdk1.8.0_40\jre\lib\ext。一般情况下普通程序运行并无差异,因为可以看到ext目录下也就几个jar,但是如果使用java.security相关类时,也就是使用加密解决相关的算法,就会发现-Djava.ext.dirs会导致library找不到相关类而报错。如报错:
NoSuchAlgorithmException: Cannot find any provider supporting RSA
这个错误当然也有可能是security\java.security文件中配置错误引起 。

当然也有解决方法:
1、将ext下相关jar包复制到新的ext director。
2、在-D.java.ext.dirs中配置多个目录。可以使用冒号分隔(windows下使用分号)。比如:-Djava.ext.dirs=directoryA:directoryB


JAVA 命令参数详解:
1、-D= set a system property 设置系统属性。

java -D参数简化加入多个jar
java命令引入jar时可以-cp参数,但时-cp不能用通配符(多个jar时什么烦要一个个写,不能*.jar),面通常的jar都在同一目录,且多于1个。前些日子找到(发现)-Djava.ext.dirs太好。
如: java -Djava.ext.dirs=lib MyClass

可以在运行前配置一些属性,比如路径什么的。
java -Dconfig=“d:/config/config.xml” Abc
这样在Abc中就可以通过System.getProperty(“config”);获得这个值了。
在虚拟机的系统属性中设置属性名/值对,运行在此虚拟机之上的应用程序可用
当虚拟机报告类找不到或类冲突时可用此参数来诊断来查看虚拟机从装入类的情况。

另外,javac -d <目录> 指定存放生成的类文件的位置

Key					Meaning
file.separator		Character that separates components of a file path. This is "/" on UNIX and "\" on Windows.
java.class.path		Path used to find directories and JAR archives containing class files. Elements of the class path are separated by a platform-specific character specified in the path.separator property. java.home			Installation directory for Java Runtime Environment (JRE)
java.vendor			JRE vendor name
java.vendor.url		JRE vender URL
java.version		JRE version number
line.separator		Sequence used by operating system to separate lines in text files
os.arch				Operating system architecture
os.name				Operating system name
os.version			Operating system version
path.separator		Path separator character used in java.class.path
user.dir			User working directory
user.home			User home directory
user.name			User account name   

所谓的
system porperty,system 指的是 JRE (runtime)system,不是指 OS。

System.setProperty(“net.jxta.tls.principal”, “client”);
System.setProperty(“net.jxta.tls.password”, “password”);
System.setProperty(“JXTA_HOME”,System.getProperty(“JXTA_HOME”,“client”));
可以利用系统属性来加载多个驱动

java -djava.ext.dirs和--class-path是两个Java命令行选项,都用于指定Java虚拟机运行时查找类文件的路径。 Java的类库是由许多Java类文件组成的,这些类文件需要被Java虚拟机加载并执行。当我们编写Java程序时,我们需要通过某种方式告知Java虚拟机去哪里查找这些类文件。 -djava.ext.dirs选项用于指定Java虚拟机搜索Java扩展(Java Extension)类库的路径。Java扩展类库是指Java虚拟机内置的一些功能库,比如Java Database Connectivity(JDBC)类库,Java Naming and Directory Interface(JNDI)类库等。Java扩展类库通常存放在JRE的ext文件夹中,但是有时候我们可能需要自己定义一些Java扩展类库,那么就需要使用-djava.ext.dirs选项来告知Java虚拟机去哪里查找这些类文件。 --class-path选项用于指定Java虚拟机搜索Java应用程序类库的路径。Java应用程序类库是指我们编写的Java程序所依赖的一些类库,比如在编写Spring框架的应用程序时需要依赖Spring框架的类库。在编写Java应用程序时,我们需要告知Java虚拟机去哪里查找这些类库,那么就需要使用--class-path选项来指定Java应用程序类库的路径。 综上所述,Java -djava.ext.dirs和--class-path选项都用于指定Java虚拟机运行时查找类文件的路径,但是-djava.ext.dirs选项用于指定Java扩展类库的路径,而--class-path选项用于指定Java应用程序类库的路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值