校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 輕松玩轉Java配置的Classpath

輕松玩轉Java配置的Classpath

熱門標簽:商丘百應電話機器人有沒有效果 淮南騰訊地圖標注 騰訊地圖標注商戶改名注冊入駐 電話機器人的特色和創新 怎樣把地圖標注出來 開封便宜外呼系統報價 黃石智能營銷電銷機器人效果 漯河辦理400電話 地圖標注人員兼職

  和Java類路徑(classpath)打交道的過程中,開發者偶爾會遇到麻煩。這是因為,類裝載器實際裝入的是哪一個類有時并不顯而易見,當應用程序的classpath包含大量的類和目錄時,情況尤其嚴重。本文將提供一個工具,它能夠顯示出被裝入類文件的絕對路徑名。

  一、Classpath基礎

  Java虛擬機(JVM)借助類裝載器裝入應用程序使用的類,具體裝入哪些類根據當時的需要決定。CLASSPATH環境變量告訴類裝載器到哪里去尋找第三方提供的類和用戶定義的類。另外,你也可以使用JVM命令行參數-classpath分別為應用程序指定類路徑,在-classpath中指定的類路徑覆蓋CLASSPATH環境變量中指定的值。

  類路徑中的內容可以是:文件的目錄(包含不在包里面的類),包的根目錄(包含已打包的類),包含類的檔案文件(比如.zip文件或者.jar文件)。在Unix家族的系統上,類路徑的各個項目由冒號分隔,在MS Windows系統上,它們由分號分隔。

  類裝載器以委托層次的形式組織,每一個類裝載器有一個父類裝載器。當一個類裝載器被要求裝載某個類時,它在嘗試自己尋找類之前會把請求先委托給它的父類裝載器。系統類裝載器,即由安裝在系統上的JDK或JRE提供的默認類裝載器,通過CLASSPATH環境變量或者-classpath這個JVM命令行參數裝入第三方提供的類或者用戶定義的類。系統類裝載器委托擴展類裝載器裝入使用Java Extension機制的類。擴展類裝載器委托自舉類裝載器(bootstrap class loader)裝入核心JDK類。

  你可以自己開發特殊的類裝載器,定制JVM如何動態地裝入類。例如,大多數Servlet引擎使用定制的類裝載器,動態地裝入那些在classpath指定的目錄內發生變化的類。

  必須特別注意的是(也是令人吃驚的是),類裝載器裝入類的次序就是類在classpath中出現的次序。類裝載器從classpath的第一項開始,依次檢查每一個設定的目錄和壓縮文件,嘗試找出待裝入的類文件。當類裝載器第一次找到具有指定名字的類時,它就把該類裝入,classpath中所有余下的項目都被忽略。

  看起來很簡單,對吧?

  二、可能出現的問題

  不管他們是否愿意承認,初學者和富有經驗的Java開發者都一樣,他們都曾經在某些時候(通常是在那些最糟糕的情形下)被冗長、復雜的classpath欺騙。應用程序所依賴的第三方類和用戶定義類的數量逐漸增長,classpath也逐漸成了一個堆積所有可能的目錄和檔案文件名的地方。此時,類裝載器首先裝載的究竟是哪一個類也就不再顯而易見。如果classpath中包含重復的類入口,這個問題尤其突出。前面已經提到,類裝載器總是裝載第一個它在classpath中找到的具有合適名字的類,從實際效果看,它“隱藏”了其他具有合適名字但在classpath中優先級較低的類。

  如果不小心,你很容易掉進這個classpath的陷阱。當你結束了一天漫長的工作,最后為了讓應用程序使用最好、最新的類,你把一個目錄加入到了classpath,但與此同時,你卻忘記了:在classpath的另一個具有更高優先級的目錄下,存放著該類的另一個版本!

   三、一個簡單的classpath工具

  優先級問題是扁平路徑聲明方法與生俱來固有的問題,但它不是只有Java的classpath才有的問題。要解決這個問題,你只需站到富有傳奇色彩的軟件巨構的肩膀上:Unix操作系統有一個which命令,在命令參數中指定一個名字,which就會顯示出當這個名字作為命令執行時執行文件的路徑名。實際上,which命令是分析PATH變量,然后找出命令第一次出現的位置。對于Java的類路徑管理來說,這應該也是一個好工具。在它的啟發之下,我著手設計了一個Java工具JWhich。這個工具要求指定一個Java類的名字,然后根據classpath的指引,找出類裝載器即將裝載的類所在位置的絕對路徑。

  下面是一個JWhich的使用實例。它顯示出當Java類裝載器裝載com.clarkware.ejb.ShoppingCartBean類時,該類第一次出現位置的絕對路徑名,查找結果顯示該類在某個目錄下:

  > java JWhich com.clarkware.ejb.ShoppingCartBean

  Class 'com.clarkware.ejb.ShoppingCartBean' found in
  '/home/mclark/classes/com/clarkware/ejb/ShoppingCartBean.class'

  下面是第二個JWhich的使用實例。它顯示出當Java類裝載器裝載javax.servlet.http.HttpServlet類時,該類第一次出現位置的絕對路徑名,查找結果顯示該類在某個檔案文件中:

  > java JWhich javax.servlet.http.HttpServlet

  Class 'javax.servlet.http.HttpServlet' found in
  'file:/home/mclark/lib/servlet.jar!/javax/servlet/http/HttpServlet.class'

  四、JWhich的工作過程

  要精確地測定classpath中哪一個類先被裝載,你必須深入到類裝載器的思考方法。事實上,具體實現的時候并沒有聽起來這么復雜——你只需直接詢問類裝載器就可以了!

  1: public class JWhich {
  2:
  3: /**
  4: * 根據當前的classpath設置,
  5: * 顯示出包含指定類的類文件所在
  6: * 位置的絕對路徑
  7: *
  8: * @param className 類的名字>
  9: */
  10: public static void which(String className) {
  11:
  12: if (!className.startsWith("/")) {
  13: className = "/" + className;
  14: }
  15: className = className.replace('.', '/');
  16: className = className + ".class";
  17:
  18: java.net.URL classUrl =
  19: new JWhich().getClass().getResource(className);
  20:
  21: if (classUrl != null) {
  22: System.out.println(" Class '" + className +
  23: "' found in '" + classUrl.getFile() + "'");
  24: } else {
  25: System.out.println(" Class '" + className +
  26: "' not found in '" +
  27: System.getProperty("java.class.path") + "'");
  28: }
  29: }
  30:
  31: public static void main(String args[]) {
  32: if (args.length > 0) {
  33: JWhich.which(args[0]);
  34: } else {
  35: System.err.println("Usage: java JWhich ");
  36: }
  37: }
  38: }

  首先,你必須稍微調整一下類的名字以便類裝載器能夠接受(12-16行)。在類的名字前面加上一個“/”表示要求類裝載器對classpath中的類名字進行逐字精確匹配,而不是嘗試隱含地加上調用類的包名字前綴。把所有“.”轉換為“/”的目的是,按照類裝載器的要求,把類名字格式化成一個合法的URL資源名。

  接下來,程序向類裝載器查詢資源,這個資源的名字必須和經過適當格式化的類名字匹配(18-19行)。每一個Class對象維護著一個對裝載它的ClassLoader對象的引用,所以這里是向裝載JWhich類的類裝載器查詢。Class.getResource()方法實際上委托裝入該類的類裝載器,返回一個用于讀取類文件資源的URL;或者,當指定的類名字不能在當前的classpath中找到時,Class.getResource()方法返回null。

  最后,如果當前的classpath中能夠找到指定的類,則程序顯示包含該類的類文件所在位置的絕對路徑名(21-24行)。作為一種調試輔助手段,如果當前classpath中不能找到指定的類,則程序獲取java.class.path系統屬性并顯示當前的classpath(24-28行)。

  很容易想象,在使用Servlet引擎classpath的Java Servlet中,或者在使用EJB服務器classpath的EJB組件中,上面這段簡單的代碼是如何運作。例如,如果JWhich類是由Servlet引擎的定制類裝載器裝入,那么程序將用Servlet引擎的類裝載器去尋找指定的類。如果Servlet引擎的類裝載器不能找到類文件,它將委托它的父類裝載器。一般地,當JWhich被某個類裝載器裝入時,它能夠找出當前類裝載器以及所有其父類裝載器所裝入的所有類。

  【結束語】

  如果需要是所有發明之母,那么幫助我們管理Java類路徑的工具可以說遲到了很長時間。Java新聞組和郵件列表中充塞著許多有關classpath的問題,現在JWhich為我們提供了一個簡單卻強大的工具,幫助我們在任何環境中徹底玩轉Java類路徑。

您可能感興趣的文章:
  • 詳解Java中-classpath和路徑的使用
  • JAVA獲取CLASSPATH路徑的方法詳解
  • Java中獲取類路徑classpath的簡單方法(推薦)
  • java環境變量path和classpath的配置
  • 淺析JAVA_HOME,CLASSPATH和PATH的作用
  • 基于獲取JAVA路徑,包括CLASSPATH外的路徑的方法詳解
  • java環境變量為什么要配置path和classpath詳細解答
  • 詳解path和classpath的區別

標簽:拉薩 亳州 武威 岳陽 大興安嶺 鄭州 紅河 馬鞍山

巨人網絡通訊聲明:本文標題《輕松玩轉Java配置的Classpath》,本文關鍵詞  輕松,玩轉,Java,配置,的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《輕松玩轉Java配置的Classpath》相關的同類信息!
  • 本頁收集關于輕松玩轉Java配置的Classpath的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    ...av二区三区久久精品| 91福利精品第一导航| 日韩电影在线一区二区| 亚洲制服丝袜av| 日韩精品成人一区二区在线| 捆绑变态av一区二区三区| 美女视频网站久久| 免费成人结看片| 国产精品资源在线看| 国产成人鲁色资源国产91色综| 久久99精品国产| 国产一区二区主播在线| 国产精品1区2区3区| 成人高清免费在线播放| 成人h精品动漫一区二区三区| 成人免费观看男女羞羞视频| 99re在线视频这里只有精品| 日本精品一区二区三区四区的功能| 一本到高清视频免费精品| 欧美中文字幕亚洲一区二区va在线| 欧美色网一区二区| 精品伦理精品一区| 国产欧美一区二区在线观看| 综合色中文字幕| 日韩影院免费视频| 国产揄拍国内精品对白| 色狠狠av一区二区三区| 日韩亚洲欧美成人一区| 国产农村妇女精品| 亚洲成人在线网站| 国产一区二区成人久久免费影院| 成人午夜电影久久影院| 欧美午夜精品久久久久久孕妇| 欧美变态tickling挠脚心| 自拍偷自拍亚洲精品播放| 人禽交欧美网站| 93久久精品日日躁夜夜躁欧美| 欧美日韩一区国产| 国产精品伦一区| 蜜臀91精品一区二区三区| 一本色道亚洲精品aⅴ| 日韩视频免费观看高清完整版 | 在线一区二区观看| 欧美一卡二卡三卡| 亚洲男同1069视频| 国产精品一线二线三线| 欧美女孩性生活视频| 国产精品美女久久久久av爽李琼| 日本欧美一区二区三区乱码| gogo大胆日本视频一区| 久久综合色天天久久综合图片| 亚洲男人的天堂在线aⅴ视频| 久久国产人妖系列| 欧美日韩国产电影| 亚洲综合清纯丝袜自拍| 成人短视频下载| 久久久青草青青国产亚洲免观| 丝袜美腿高跟呻吟高潮一区| 99九九99九九九视频精品| 国产欧美日韩另类一区| 久久电影网电视剧免费观看| 欧美日韩大陆在线| 亚洲第一综合色| 欧美午夜精品免费| 午夜精品123| 在线观看日韩精品| 一区二区三区波多野结衣在线观看 | caoporn国产一区二区| 久久综合九色综合97婷婷| 三级不卡在线观看| 91麻豆精品国产自产在线观看一区 | 欧美精品一区二区不卡| 美国三级日本三级久久99| 91精品国产91久久久久久一区二区 | 欧美怡红院视频| 亚洲成人自拍网| 欧美一级黄色片| 黄网站免费久久| 久久久91精品国产一区二区精品 | 欧美三级三级三级爽爽爽| 亚洲欧美电影一区二区| 色婷婷激情综合| 性感美女极品91精品| 欧美日韩国产综合一区二区三区| 午夜精品福利一区二区三区蜜桃| 欧美三级日本三级少妇99| 日韩**一区毛片| 久久亚洲春色中文字幕久久久| 毛片一区二区三区| 久久综合九色综合久久久精品综合| 国产又粗又猛又爽又黄91精品| 国产亚洲污的网站| 99久久婷婷国产| 亚洲激情成人在线| 日韩欧美国产小视频| 国产一区999| 亚洲精品伦理在线| 日韩视频免费观看高清完整版 | 三级一区在线视频先锋| 精品国产麻豆免费人成网站| 国产成人在线观看| 亚洲一区二区三区四区在线| 3atv在线一区二区三区| 国产精品正在播放| 亚洲国产aⅴ成人精品无吗| 欧美电视剧免费全集观看| 国产成人h网站| 亚洲一二三四久久| 国产女人水真多18毛片18精品视频| 91视频在线观看| 麻豆精品新av中文字幕| |精品福利一区二区三区| 91精品国产综合久久国产大片| 国产91在线观看丝袜| 日韩精品欧美成人高清一区二区| 国产清纯在线一区二区www| 欧美性xxxxxx少妇| 成人精品视频网站| 免费一区二区视频| 亚洲自拍偷拍综合| 国产精品国产三级国产有无不卡 | 中文一区二区完整视频在线观看| 色国产精品一区在线观看| 国产馆精品极品| 美女国产一区二区| 亚洲国产精品久久久男人的天堂| 国产香蕉久久精品综合网| 欧美一区日本一区韩国一区| 99精品1区2区| 国产91丝袜在线播放九色| 玖玖九九国产精品| 亚洲第一福利一区| 一区二区成人在线观看| 国产精品久久久久7777按摩| 久久亚洲春色中文字幕久久久| 在线不卡一区二区| 欧美视频三区在线播放| 色综合婷婷久久| jvid福利写真一区二区三区| 国产成人在线视频网站| 国模一区二区三区白浆| 蜜桃精品视频在线| 免费人成在线不卡| 免费不卡在线观看| 美腿丝袜亚洲色图| 久久精品国产精品亚洲红杏| 日精品一区二区| 爽好多水快深点欧美视频| 亚洲不卡在线观看| 日韩国产一区二| 蜜臀精品一区二区三区在线观看| 五月天激情综合| 人人精品人人爱| 激情久久五月天| 国产成人精品免费| 国产99久久久国产精品潘金网站| 国产精品18久久久久久久网站| 国内精品伊人久久久久av影院| 国产尤物一区二区| 北条麻妃一区二区三区| 99亚偷拍自图区亚洲| 91婷婷韩国欧美一区二区| 在线精品视频一区二区| 777亚洲妇女| 精品免费国产一区二区三区四区| 欧美大片一区二区| 欧美国产一区在线| 亚洲精品免费看| 美女视频黄a大片欧美| 成人午夜伦理影院| 欧美午夜影院一区| 欧美变态凌虐bdsm| 亚洲婷婷综合久久一本伊一区| 亚洲一区免费视频| 久久国产精品露脸对白| 国产福利一区在线| 欧美四级电影在线观看| 欧美一卡二卡在线| 亚洲同性同志一二三专区| 日韩精品每日更新| youjizz国产精品| 欧美电影在线免费观看| 久久先锋影音av| 一区二区欧美在线观看| 狠狠色狠狠色综合| 色婷婷综合久久久| 日韩一区二区在线播放| 国产精品久久久久久久久图文区 | av电影一区二区| 欧美日韩在线播放| 日本一区二区三区免费乱视频| 亚洲一区二区三区在线播放| 韩国av一区二区三区| 欧美午夜宅男影院| 国产日本亚洲高清| 日韩中文字幕亚洲一区二区va在线| 成人免费视频视频| 日韩美一区二区三区| 亚洲制服丝袜av| 99精品视频在线观看免费|