欢迎您光临本小站。希望您在这里可以找到自己想要的信息。。。

java 中PATH, -classpath, -Djava.library.path的区别

java water 5249℃ 0评论

1. PATH是个系统环境变量,指定要执行命令的搜索路径。如

[html] view plain copy

  1. export PATH=A:B:C   

当执行:

[html] view plain copy

  1. > cmd   


时,系统先会在目录A中找寻命令cmd,如果找到,就执行该命令;否者顺序搜索目录B,如此直到找到该命令,或者直接报错当所有目录都遍历完依然找到该命令。

另外:

那CLASSPATH有什么作用呢?编Java程序的时候都知道import的作用吧!
当要用的class,在某一个.jar下是,你需要在编译时引入,jvm自动去找classpath环境变量引入下面的jar包,
这就是CLASSPATH环境变量的作用 

Path=.;C:\j2sdk1.4.2_05\bin;D:\DownLoads\Oracle\bin;D:\DownLoads\oracle\Apache\Perl\5.00503\bin\mswin32-x86;C:\Program Files\Oracle\jre\1.1.7\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;D:\DownLoads;C:\Program Files\Symantec\pcAnywhere\;C:\Program Files\Microsoft SQL Server\80\Tools\BINN

JAVA_HOME=C:\j2sdk1.4.2_05

CLASSPATH=.\;%JAVA_HOME%\lib\tools.jar
(Path没有用到JAVA_HOME变量)

2. -classpath/-cp

指定要执行的class file或者jar包的位置。 但调用一个class定义时,搜索机制与1#相同。

[html] view plain copy

  1. java -classpath A/a.jar:B/b.jar:C/c.class  

classpath路径下,只能是jar或者class 文件,否者会报错,因为他们会被load到JVM中。

上面有个问题,就是如果在两个目录下或两个jar中,两个class file中,存在两个相同的命令或者类名,那么如何选取呢?会选择出现在搜索路径前的目录。

3. -Djava.library.path

类似于c/C++中的运行时环境变量

[html] view plain copy

  1. export LD_LIBRARY_PATH=A:B:C    #path containing *.so  

要想java程序找到共享库还是要在执行java程序的时候指定java.library.path,用eclipse的话可以设置如下:

[html] view plain copy

  1. Properties->Run/Debug settings->Arguments->VM arguments  

  2. —————————————–  

  3. -Djava.library.path=/home/miaoyachun/workspace/JNIC/Release  


这个是传统的方式,google了下有个tricky的方式让程序动态修改java.library.path

[html] view plain copy

  1. private static void loadJNILibDynamically() {  

  2.     try {  

  3.         System.setProperty("java.library.path", System.getProperty("java.library.path")  

  4.                 + ":/home/miaoyachun/workspace/JNIC/Release/");  

  5.         Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths");  

  6.         fieldSysPath.setAccessible(true);  

  7.         fieldSysPath.set(null, null);  

  8.   

  9.         System.loadLibrary("JNIC");  

  10.     } catch (Exception e) {  

  11.         // do nothing for exception  

  12.     }  

  13. }  

因为: java可以通过System.getProperty获得系统变量的值。而java.library.path只是其中的一个,表示系统搜索库文件的路径。

这个类作用是很大的,我们可以获取很多信息。 

System.getProperty()参数大全 

java.version Java Runtime Environment version 
java.vendor Java Runtime Environment vendor 
java.vendor.url Java vendor URL 
java.home Java installation directory 
java.vm.specification.version Java Virtual Machine specification version 
java.vm.specification.vendor Java Virtual Machine specification vendor 
java.vm.specification.name Java Virtual Machine specification name 
java.vm.version Java Virtual Machine implementation version 
java.vm.vendor Java Virtual Machine implementation vendor 
java.vm.name Java Virtual Machine implementation name 
java.specification.version Java Runtime Environment specification version 
java.specification.vendor Java Runtime Environment specification vendor 
java.specification.name Java Runtime Environment specification name 
java.class.version Java class format version number 
java.class.path Java class path 
java.library.path List of paths to search when loading libraries 
java.io.tmpdir Default temp file path 
java.compiler Name of JIT compiler to use 
java.ext.dirs Path of extension directory or directories 
os.name Operating system name 
os.arch Operating system architecture 
os.version Operating system version 
file.separator File separator ("/" on UNIX) 
path.separator Path separator (":" on UNIX) 
line.separator Line separator ("\n" on UNIX) 
user.name User's account name 
user.home User's home directory 
user.dir User's current working directory

事实上Linux下还有个环境变量LD_LIBRARY_PATH,如果lib能在这个path里找到,java.library.path就不用配置了,而且不需要关心lib之间依赖的问题。java.library.path在这方面就弱很多,比如lib依赖其他目录的lib等。

转载请注明:学时网 » java 中PATH, -classpath, -Djava.library.path的区别

喜欢 (2)or分享 (0)

您必须 登录 才能发表评论!