-jar參數運行應用時classpath的設置方法 html
你是否在使用java -jar參數運行打包好的jar應用程序的時候發現應用程序沒法找到classpath下設置好的第三方類庫的內容?不管怎麼設置classpath參數都無濟於事,老是會報ClassNotFound的錯誤?那麼本篇帖子能夠幫助你擺脫煩惱 :)
當用java -jar yourJarExe.jar來運行一個通過打包的應用程序的時候,你會發現如何設置-classpath參數應用程序都找不到相應的第三方類,報ClassNotFound錯誤。實際上這是因爲當使用-jar參數運行的時候,java VM會屏蔽全部的外部classpath,而只以自己yourJarExe.jar的內部class做爲類的尋找範圍。java
解決方案windows
一 BootStrap class擴展方案
Java 命令行提供瞭如何擴展bootStrap 級別class的簡單方法:
-Xbootclasspath: 徹底取代基本核心的Java class 搜索路徑.
不經常使用,不然要從新寫全部Java 核心class
-Xbootclasspath/a: 後綴在覈心class搜索路徑後面.經常使用!!
-Xbootclasspath/p: 前綴在覈心class搜索路徑前面.不經常使用,避免
引發沒必要要的衝突.
語法以下:
(分隔符與classpath參數相似,unix使用:號,windows使用;號,這裏以unix爲例)
java -Xbootclasspath/a:/usrhome/thirdlib.jar: -jar yourJarExe.jar安全
二 extend class 擴展方案
Java exten class 存放在{Java_home}\jre\lib\ext目錄下.當調用Java時,對擴展class路徑的搜索是自動的.總會搜索的.這樣,解決的方案就很簡單了,將全部要使用的第三方的jar包都複製到ext 目錄下.
(自評:不推薦使用,自適應性不好!)測試
三 User class擴展方案
當使用-jar執行可執行Jar包時,JVM將Jar包所在目錄設置爲codebase目錄,全部的class搜索都在這個目錄下開始.因此若是使用了其餘第三方的jar包,一個比較能夠接受的可配置方案,就是利用jar包的Manifest擴展機制.
步驟以下:
1.將須要的第三方的jar包,複製在同可執行jar所在的目錄或某個子目錄下. 好比:jar 包在 /usrhome/yourJarExe.jar 那麼你能夠把全部jar包複製到/usrhome目錄下或/usrhome/lib 等相似的子目錄下.
2.修改Manifest 文件
在Manifest.mf文件里加入以下行
Class-Path:classes12.jar lib/thirdlib.jar
Class-Path 是可執行jar包運行依賴的關鍵詞.詳細內容能夠參考:http://java.sun.com/docs/books/tutorial/ext/index.htmlgoogle
以上三種方法推薦第一種,擴展性好,操做起來也最方便.
另外編寫本身的ClassLoader,來動態載入class,是更加複雜和高級技術.限於篇幅,不贅述.有興趣瞭解能夠去google一下custom classloaderspa
Java的安全機制隨不一樣的JDK版本有不一樣的變化,會影響不少核心CLASS,好比Thread,因此不少大型商業軟件,要求JDK的版本很嚴格.部分緣由也在此.這也要求在發佈本身編寫的應用時候,無論大小,都要說明開發和測試的JDK版本.命令行