java -cp 與 java -Djava.ext.dirs的區別與坑

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

-classpath,命令格式:# java -classpath <目錄或zip/jar文件的類搜索路徑>,使用";"分隔

-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)那麼該加載器默認加載$JAVA_HOME/lib/ext目錄下的所有jar文件。但如果你手動指定系統屬性且忘了把$JAVA_HOME/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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章