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

首頁 > 編程 > JSP > 正文

輕松玩轉Java配置的Classpath

2024-09-05 00:21:33
字體:
來源:轉載
供稿:網友

  和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類路徑。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩国产欧美精品在线| 精品香蕉在线观看视频一| 久久久免费观看| 97视频com| 亚洲大胆人体视频| 日韩精品亚洲视频| 啊v视频在线一区二区三区| 欧美精品999| 日韩精品视频在线免费观看| 欧美亚洲成人精品| 久久精品99无色码中文字幕| 日韩有码片在线观看| 国产精品成人免费视频| 亚洲人成五月天| 九九视频直播综合网| 日韩在线观看免费全| 国内自拍欧美激情| 国产黑人绿帽在线第一区| 亚洲新中文字幕| 亚洲视频第一页| 国产成人亚洲综合91| 最新亚洲国产精品| 欧美成人黄色小视频| 91豆花精品一区| 久久91精品国产91久久久| 国产91色在线播放| 国产精品久久久久一区二区| 秋霞午夜一区二区| 精品国产依人香蕉在线精品| 成人免费视频97| 91精品啪在线观看麻豆免费| 一个人www欧美| 668精品在线视频| 欧美黑人又粗大| 欧美在线视频观看免费网站| 成人黄色短视频在线观看| 日韩精品久久久久久久玫瑰园| 亚洲国产精品久久| 亚洲bt欧美bt日本bt| 久久精品亚洲94久久精品| 亚洲第一av网| 日韩电影中文字幕在线| 亚洲精品美女久久| 国产精品一区久久| 一本色道久久88综合亚洲精品ⅰ| 午夜精品一区二区三区在线播放| 日韩中文字幕在线播放| 国产欧美最新羞羞视频在线观看| 国产精品综合网站| 久久九九国产精品怡红院| 久久视频在线看| 亚洲自拍偷拍一区| 欧美日韩高清在线观看| www.日韩欧美| 欧美一级成年大片在线观看| 亚洲精品一区二区三区婷婷月| 97在线看福利| 国产精品爱啪在线线免费观看| 国产精品av免费在线观看| 国产亚洲视频在线观看| 日韩美女视频免费在线观看| 欧美电影在线观看网站| 亚洲欧美综合精品久久成人| 亚洲欧洲自拍偷拍| 久久久亚洲影院你懂的| 中文字幕亚洲天堂| 美女久久久久久久| 国产精品av免费在线观看| 国产成人精品电影| 国产成人精品久久二区二区91| 亚洲女成人图区| 久久夜色撩人精品| 5566成人精品视频免费| 欧美激情va永久在线播放| 97国产精品免费视频| 欧美日韩国产影院| 国产精品亚洲美女av网站| 亚洲第一区第二区| 亚洲国产成人在线播放| 亚洲一区亚洲二区亚洲三区| 国产婷婷成人久久av免费高清| 欧美黄色性视频| 深夜福利亚洲导航| 久久久综合免费视频| 中文字幕久精品免费视频| 国产日韩欧美在线视频观看| 久久国产精品久久久久久久久久| 日韩精品高清在线观看| 欧美精品videofree1080p| 国产ts人妖一区二区三区| 成人性生交大片免费观看嘿嘿视频| 久久久精品美女| 亚洲女人被黑人巨大进入| 久久久久久久国产精品| 亚洲第一av网| 亚洲欧洲在线视频| 精品无人区乱码1区2区3区在线| 亚洲第一精品电影| 亚洲加勒比久久88色综合| 国产精品一区二区在线| 欧美一区二区三区免费视| 亚洲精品永久免费| 国产综合香蕉五月婷在线| 亚洲国产天堂久久综合| 国产一区二区三区高清在线观看| 中文字幕久热精品在线视频| 国产午夜精品视频| 国产精品福利小视频| 国产精品极品尤物在线观看| 亚洲成人三级在线| 欧美福利视频在线观看| 日韩性xxxx爱| 亚洲一级黄色片| www.日韩免费| 亚洲欧美国产另类| 伊人久久综合97精品| 91久久精品国产| 色婷婷**av毛片一区| 国产精品第3页| 久久综合电影一区| 国产专区欧美专区| 久久精品视频免费播放| 在线观看久久久久久| 欧洲成人免费aa| 日韩欧美精品在线观看| 一个人www欧美| 最近2019好看的中文字幕免费| 亚洲精品wwww| 久久成人精品一区二区三区| 国产亚洲欧洲在线| 欧美成人精品在线视频| 欧美有码在线观看视频| 精品视频在线观看日韩| 欧美高清在线观看| 理论片在线不卡免费观看| 日产精品久久久一区二区福利| 日韩理论片久久| 日韩精品中文字幕久久臀| 国自产精品手机在线观看视频| 中文字幕一区二区精品| www国产精品视频| 国产一区视频在线播放| 91av在线免费观看视频| 91网站在线免费观看| 久久久久女教师免费一区| 日本一区二区不卡| 日韩电影中文字幕在线观看| 亚洲午夜国产成人av电影男同| 亚洲性生活视频| 91久久精品国产| 1769国内精品视频在线播放| 亚洲а∨天堂久久精品9966| 欧美精品久久久久久久| 午夜精品一区二区三区av| 成人情趣片在线观看免费| 这里只有精品在线播放| 午夜免费在线观看精品视频| 亚洲综合日韩中文字幕v在线| 亚洲欧美日韩一区二区三区在线| 亚洲精选在线观看| 国产午夜精品一区二区三区| 欧美亚洲免费电影| 亚洲精品久久视频| 中文字幕在线视频日韩|