亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

使用JWhich工具管理CLASSPATH

2019-11-18 11:55:19
字體:
來源:轉載
供稿:網友

  從表面上看,java的classpath(類路徑)很簡單,但一直以來它都是一個產生問題和混亂的根源。本文介紹classpath的基本知識、可能產生的問題,并提供了一個簡單的classpath治理工具。
  
  和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.  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類路徑

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品极品尤物在线观看| 国产亚洲视频在线观看| 日韩激情在线视频| 亚洲电影免费观看| 91欧美日韩一区| 亚洲二区在线播放视频| 欧美黑人狂野猛交老妇| 欧美在线视频播放| 国产精品久久久久秋霞鲁丝| 国产精品日韩欧美综合| 欧美日韩亚洲一区二区| 九九热这里只有在线精品视| 亚洲精品一区中文| 91久久在线播放| 日本高清视频一区| 日韩一中文字幕| 久久久亚洲网站| 亚洲欧美日韩在线一区| 欧美专区中文字幕| 国产九九精品视频| 国产精品欧美亚洲777777| 精品久久久久久久中文字幕| 日韩av理论片| 亚洲人成电影网站色| 欧美精品手机在线| 亚洲人成伊人成综合网久久久| 国产精品444| 成人精品福利视频| 色综合久久悠悠| 国产精品久久婷婷六月丁香| 久久天堂电影网| 一区二区三区美女xx视频| 欧美综合激情网| 亚洲精品视频在线观看视频| 少妇精69xxtheporn| 国产91精品青草社区| 91麻豆国产语对白在线观看| 78色国产精品| 97久久精品人人澡人人爽缅北| 亚洲自拍在线观看| 精品成人久久av| 九九热这里只有精品免费看| 在线色欧美三级视频| 日韩精品视频三区| 亚洲欧洲高清在线| 亚洲午夜未删减在线观看| 欧美极品欧美精品欧美视频| 欧美巨猛xxxx猛交黑人97人| 成人国产精品一区| 日韩不卡中文字幕| 97在线观看免费高清| 日韩av中文字幕在线免费观看| 国产成人亚洲综合91精品| 97视频人免费观看| 日韩精品视频三区| 成人免费网视频| 国产欧美va欧美va香蕉在线| 国产精品视频区| 亚洲另类欧美自拍| 日韩视频精品在线| 久久夜色撩人精品| 成人黄色免费网站在线观看| 欧美激情视频在线免费观看 欧美视频免费一| 欧美日韩亚洲一区二区三区| 久久久久久久久国产精品| 日韩色av导航| 亚洲黄色免费三级| 精品国产一区二区三区在线观看| 欧美极品少妇xxxxⅹ免费视频| 久热国产精品视频| 中文字幕欧美精品日韩中文字幕| 国产噜噜噜噜噜久久久久久久久| 91久久精品国产91久久性色| 日韩美女av在线免费观看| 韩国精品久久久999| 日本成人激情视频| 日韩av综合网站| 亚洲欧美中文日韩在线v日本| 亚洲影院色在线观看免费| 欧美孕妇毛茸茸xxxx| 国产97人人超碰caoprom| 亚洲www永久成人夜色| 欧美色欧美亚洲高清在线视频| 另类视频在线观看| 91理论片午午论夜理片久久| 91国产美女在线观看| 91理论片午午论夜理片久久| 亚洲新声在线观看| 国产成人精品午夜| 欧美精品成人在线| 少妇高潮久久久久久潘金莲| 亚洲国产日韩欧美在线动漫| 欧美大全免费观看电视剧大泉洋| 久久久久久久97| 91免费版网站入口| 91亚洲永久免费精品| 日韩中文字幕在线看| 久久久精品在线观看| 亚洲理论在线a中文字幕| 国产精品国模在线| 国内自拍欧美激情| 国产成人精品一区| 亚洲男人天堂2024| 欧美日韩国产精品一区| 91香蕉亚洲精品| 福利一区视频在线观看| 麻豆精品精华液| 国产在线播放91| 欧美一区亚洲一区| 国产精品永久免费| 色综合伊人色综合网| 狠狠久久亚洲欧美专区| 91伊人影院在线播放| 亚洲综合最新在线| 欧美最猛性xxxx| 亚洲欧美日韩国产精品| 亚洲精品一区二区网址| 久热精品视频在线观看| 亚洲成年人在线播放| 欧美在线一区二区视频| 在线观看国产欧美| 日韩av电影手机在线观看| 亚洲国产高潮在线观看| 国产精品美乳在线观看| 日韩在线高清视频| 伊人伊成久久人综合网站| 在线观看精品自拍私拍| 日韩精品在线免费观看视频| 亚洲3p在线观看| 97成人精品区在线播放| 高潮白浆女日韩av免费看| 亚洲色图五月天| 中文字幕亚洲欧美在线| www.亚洲一二| 亚洲一区999| 国产一区二区三区视频在线观看| 欧美精品做受xxx性少妇| 久久99精品久久久久久噜噜| 久久视频这里只有精品| 亚洲精品日韩久久久| 综合国产在线观看| 国产综合香蕉五月婷在线| 久久99视频免费| 中文字幕欧美日韩va免费视频| 亚洲国产精品人人爽夜夜爽| 欧美亚州一区二区三区| 欧美黄色www| 久久亚洲精品一区| 国产精品久久久久久网站| www.国产一区| 国产一区二区三区在线观看视频| 成人久久一区二区三区| 国产精品∨欧美精品v日韩精品| 成人亚洲综合色就1024| 亚洲一区亚洲二区亚洲三区| 91高清视频免费| 日本不卡高字幕在线2019| 亚洲色图激情小说| 98精品在线视频| 久久久亚洲成人| 精品中文字幕在线| 国产成人在线一区二区| 欲色天天网综合久久| 国产精品成人一区二区三区吃奶|