<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    forget and forget

    能吃能睡是福;能忘是大福......

    posts - 39, comments - 26, trackbacks - 0, articles - 10
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    當(dāng)用java -jar yourJarExe.jar來(lái)運(yùn)行一個(gè)經(jīng)過(guò)打包的應(yīng)用程序的時(shí)候,你會(huì)發(fā)現(xiàn)如何設(shè)置-classpath參數(shù)應(yīng)用程序都找不到相應(yīng)的第三方類(lèi),報(bào) ClassNotFound錯(cuò)誤。實(shí)際上這是由于當(dāng)使用-jar參數(shù)運(yùn)行的時(shí)候,java VM會(huì)屏蔽所有的外部classpath,而只以本身yourJarExe.jar的內(nèi)部class作為類(lèi)的尋找范圍。

    **解決方案**

    一 BootStrap class擴(kuò)展方案

    Java 命令行提供了如何擴(kuò)展bootStrap 級(jí)別class的簡(jiǎn)單方法.
    -Xbootclasspath:?????完全取代基本核心的Java class 搜索路徑.
    ?????????????????????????????????? 不常用,否則要重新寫(xiě)所有Java 核心class
    -Xbootclasspath/a: 后綴在核心class搜索路徑后面.常用!!
    -Xbootclasspath/p: 前綴在核心class搜索路徑前面.不常用,避免
    ?????????????????????????????????? 引起不必要的沖突.

    語(yǔ)法如下:
    ?(分隔符與classpath參數(shù)類(lèi)似,unix使用:號(hào),windows使用;號(hào),這里以u(píng)nix為例)
    ?java -Xbootclasspath/a:/usrhome/thirdlib.jar: -jar yourJarExe.jar

    二 extend class 擴(kuò)展方案

    Java exten class 存放在{Java_home}\jre\lib\ext目錄下.當(dāng)調(diào)用Java時(shí),對(duì)擴(kuò)展class路徑的搜索是自動(dòng)的.總會(huì)搜索的.這樣,解決的方案就很簡(jiǎn)單了,將所有要使用的第三方的jar包都復(fù)制到ext 目錄下.

    三 User class擴(kuò)展方案

    當(dāng)使用-jar執(zhí)行可執(zhí)行Jar包時(shí),JVM將Jar包所在目錄設(shè)置為codebase目錄,所有的class搜索都在這個(gè)目錄下開(kāi)始.所以如果使用了其他第三方的jar包,一個(gè)比較可以接受的可配置方案,就是利用jar包的Manifest擴(kuò)展機(jī)制.
    步驟如下:

    ?1.將需要的第三方的jar包,復(fù)制在同可執(zhí)行jar所在的目錄或某個(gè)子目錄下.?比如:jar 包在 /usrhome/yourJarExe.jar 那么你可以把所有jar包復(fù)制到/usrhome目錄下或/usrhome/lib 等類(lèi)似的子目錄下.

    ?2.修改Manifest 文件

    ?在Manifest.mf文件里加入如下行

    ?Class-Path:classes12.jar lib/thirdlib.jar

    ?Class-Path 是可執(zhí)行jar包運(yùn)行依賴(lài)的關(guān)鍵詞.詳細(xì)內(nèi)容可以參考?http://java.sun.com/docs/books/tutorial/ext/index.html


    以上三種方法推薦第一種,擴(kuò)展性好,操作起來(lái)也最方便.
    另外編寫(xiě)自己的ClassLoader,來(lái)動(dòng)態(tài)載入class,是更加復(fù)雜和高級(jí)技術(shù).限于篇幅,不贅述.有興趣了解可以去google一下custom classloader

    Java的安全機(jī)制隨不同的JDK版本有不同的變化,會(huì)影響很多核心CLASS,比如Thread,所以很多大型商業(yè)軟件,要求JDK的版本很?chē)?yán)格.部分原因也在此.這也要求在發(fā)布自己編寫(xiě)的應(yīng)用時(shí)候,不管大小,都要說(shuō)明開(kāi)發(fā)和測(cè)試的JDK版本.


    本文所述方法測(cè)試基于j2sdk 1.4.2_04-b05

    ----------------------------------------------------------------------------------------------

    附:背景知識(shí)

    自JDK 1.2以后,JVM采用了委托(delegate)模式來(lái)載入class.采用這種設(shè)計(jì)的原因可以參考http://java.sun.com/docs/books/tutorial/ext/basics/load.html

    歸納來(lái)講:是基于JVM sandbox(沙盒)安裝模型上提供應(yīng)用層的可定制的安全機(jī)制.


    Java虛擬機(jī)(JVM)尋找Class的順序

    1. Bootstrap classes

    屬于Java 平臺(tái)核心的class,比如java.lang.String等.及rt.jar等重要的核心級(jí)別的class.這是由JVM Bootstrap class loader來(lái)載入的.一般是放置在{java_home}\jre\lib目錄下

    2. Extension classes

    基于Java擴(kuò)展機(jī)制,用來(lái)擴(kuò)展Java核心功能模塊.比如Java串口通訊模塊comm.jar.一般放置在{Java_home}\jre\lib\ext目錄下

    3. User classes

    開(kāi)發(fā)人員或其他第三方開(kāi)發(fā)的Java程序包.通過(guò)命令行的-classpath或-cp,或者通過(guò)設(shè)置CLASSPATH環(huán)境變量來(lái)引用.JVM通 過(guò)放置在{java_home}\lib\tools.jar來(lái)尋找和調(diào)用用戶(hù)級(jí)的class.常用的javac也是通過(guò)調(diào)用tools.jar來(lái)尋找用 戶(hù)指定的路徑來(lái)編譯Java源程序.這樣就引出了User class路徑搜索的順序或優(yōu)先級(jí)別的問(wèn)題.

    ?3.1 缺省值:調(diào)用Java或javawa的當(dāng)前路徑(.),是開(kāi)發(fā)的class所存在的當(dāng)前目錄
    ?3.2 CLASSPATH環(huán)境變量設(shè)置的路徑.如果設(shè)置了CLASSPATH,則CLASSPATH的值會(huì)覆蓋缺省值
    ?3.3 執(zhí)行Java的命令行-classpath或-cp的值,如果制定了這兩個(gè)命令行參數(shù)之一,它的值會(huì)覆蓋環(huán)境變量CLASSPATH的值
    ?3.4 -jar 選項(xiàng):如果通過(guò)java -jar 來(lái)運(yùn)行一個(gè)可執(zhí)行的jar包,這當(dāng)前jar包會(huì)覆蓋上面所有的值.換句話(huà)說(shuō),-jar 后面所跟的jar包的優(yōu)先級(jí)別最高,如果指定了-jar選項(xiàng),所有環(huán)境變量和命令行制定的搜索路徑都將被忽略.JVM APPClassloader將只會(huì)以jar包為搜索范圍.
    有關(guān)可執(zhí)行jar有許多相關(guān)的安全方面的描述,可以參考http://java.sun.com/docs/books/tutorial/jar/ 來(lái)全面了解.

    這也是為什么應(yīng)用程序打包成可執(zhí)行的jar包后,不管你怎么設(shè)置classpath都不能引用到第三方j(luò)ar包的東西了.

    主站蜘蛛池模板: 亚洲色偷偷综合亚洲AV伊人蜜桃| 久久精品国产亚洲av麻豆 | 亚洲av成人一区二区三区观看在线 | 成人久久久观看免费毛片| 成人免费无码视频在线网站| 亚洲狠狠色丁香婷婷综合| 亚洲综合av永久无码精品一区二区| 99视频精品全部免费观看| 综合偷自拍亚洲乱中文字幕| 久久精品国产亚洲沈樵| 国国内清清草原免费视频99| 无套内谢孕妇毛片免费看看| 亚洲免费视频网站| 免费精品国产自产拍观看| 久操免费在线观看| 老牛精品亚洲成av人片| 综合自拍亚洲综合图不卡区| www.亚洲色图.com| 猫咪免费人成网站在线观看| 新最免费影视大全在线播放| 亚洲欧洲另类春色校园网站| 亚洲人成精品久久久久| 免费毛片在线播放| 一区二区三区四区免费视频 | 日本免费一区二区久久人人澡| 一本色道久久88—综合亚洲精品 | 亚洲精品无码人妻无码| 亚洲AV午夜成人片| 免费播放春色aⅴ视频| 成年人网站免费视频| 在线观看肉片AV网站免费| 男人的天堂av亚洲一区2区| 666精品国产精品亚洲 | 久久精品亚洲福利| 免费被黄网站在观看| 国产成人免费在线| 你是我的城池营垒免费观看完整版| 亚洲国产日韩a在线播放| 亚洲酒色1314狠狠做| 国产亚洲精品岁国产微拍精品 | 色在线亚洲视频www|