熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Javascript >> 正文

Java 中的 ClassPath 和 Package

2013-11-12 23:36:48  來源: Javascript 

  
  前言:
  
  由於這兩個問題新手問得較多 且回答比較零散 很難統一整理
  
  以就直接寫了一篇 還請大家見諒
  
  正文:
  
   類路徑 (class path)
  
    當你滿懷著希望安裝好了 java 然後興沖沖地寫了個 hello world然後編譯
  
  運行 就等著那兩個美好的單詞出現在眼前 可是不幸的是 只看到了 Cant find
  
  class HelloWorld 或者 Exception in thread main javalangNoSuchMethodError: maain
  
  為什麼呢? 編譯好的 class 明明在呀
  
   我們一起來看一看 java 程序的運行過程 我們已經知道 java 是通過 java
  
  虛擬機來解釋運行的 也就是通過 java 命令 javac 編譯生成的 class
  
  文件就是虛擬機要執行的代碼 稱之為字節碼(bytecode) 虛擬機通過 classloader
  
  來裝載這些字節碼 也就是通常意義上的類 這裡就有一個問題 classloader 從
  
  哪裡知道 java 本身的類庫及用戶自己的類在什麼地方呢? 或者有著缺省值(當前路徑)
  
  或者要有一個用戶指定的變量來表明 這個變量就是類路徑(classpath) 或者在運行
  
  的時候傳參數給虛擬機 這也就是指明 classpath 的三個方法 編譯的過程和運行
  
  的過程大同小異 只是一個是找出來編譯 另一個是找出來裝載
  
   實際上 java 虛擬機是由 java luncher 初始化的 也就是 java (或 javaexe)
  
  這個程序來做的 虛擬機按以下順序搜索並裝載所有需要的類:
  
    引導類: 組成 java 平台的類 包含 rtjar 和 injar 中的類
  
    擴展類: 使用 java 擴展機制的類 都是位於擴展目錄($JAVA_HOME/jre/lib/ext)
  
  中的 jar 檔案包
  
    用戶類: 開發者定義的類或者沒有使用 java 擴展機制的第三方產品 你必須在
  
  命令行中使用 classpath 選項或者使用 CLASSPATH 環境變量來確定這些類的位置
  
  們在上面所說的用戶自己的類就是特指這些類
  
   這樣 一般來說 用戶只需指定用戶類的位置 引導類和擴展類是自動尋找的
  
   那麼到底該怎麼做呢? 用戶類路徑就是一些包含類文件的目錄 jar zip 文件的
  
  列表 至於類具體怎麼找 因為牽扯到 package 的問題 下面將會說到 暫時可認為
  
  只要包含了這個類就算找到了這個類 根據平台的不同分隔符略有不同 類 unix 的系
  
  統基本上都是 : windows 多是 ; 其可能的來源是:
  
   * 即當前目錄 這個是缺省值
   * CLASSPATH 環境變量 一旦設置 將缺省值覆蓋
   * 命令行參數 cp 或者 classpath 一旦指定 將上兩者覆蓋
   * 由 jar 參數指定的 jar 檔案包 就把所有其他的值覆蓋 所有的類都來自這個指 定的檔案包中 由於生成可執行的 jar 文件 還需要其他一些知識 比如 package 還有 特定的配置文件 本文的最後會提到 可先看看 jdk 自帶的一些例子 我們舉個 HelloWorld 的例子來說明 先做以下假設:
   * 當前目錄是 /HelloWorld (或 c:\HelloWorld 以後都使用前一個)
   * jdk 版本為 (linux 下的)
   * PATH 環境變量設置正確 (這樣可以在任何目錄下都可以使用工具)
   * 文件是 HelloWorldjava 內容是:
  
   public class HelloWorld
   {
     public static void main(String[] args)
     {
       Systemoutprintln(Hello World!\n);
       Systemexit();
     }
   }
  
   首先這個文件一定要寫對 如果對 c 熟悉的話 很有可能寫成這樣:
  
   public static void main(int argc String[] argv)
   {
     
   }
  
   這樣是不對的 不信可以試一試 由於手頭沒有 java 的規范 所以 作如下猜想: java 的 application 程序 必須以 public static void main(String[]) 開始 其他不一樣的都不行
   到現在為止 我們設置方面只設置了 PATH
  
    當前路徑就是指你的 class 文件在當前目錄下
  
     [HelloWorld]$ javac HelloWorldjava //這一步不會有多大問題
  
     [HelloWorld]$ java HelloWorld    // 這一步可能就會有問題
  
   如果出了象開頭那樣的問題 首先確定不是由於敲錯命令而出錯 如果沒有敲錯命令
  那麼接著做:
  
     [HelloWorld]$ echo $CLASSPATH
  
     或者
  
     c:\HelloWorld>echo %CLASSPATH%
  
   看看 CLASSPATH 環境變量是否設置了 如果設置了 那麼用以下命令:
  
     [HelloWorld]$ CLASSPATH=
  
     或者
  
     c:\HelloWorld> set CLASSPATH=
  
   來使它為空 然後重新運行 這次用戶類路徑缺省的是 所以應該不會有相
  
  同的問題了 還有一個方法就是把 加入到 CLASSPATH 中
  
     [/]$ CLASSPATH=$CLASSPATH:
  
     或者
  
     c:\HelloWorld> set CLASSPATH=%CLASSPATH%;
  
   同樣也可以成功 Good Luck
  
    當你的程序需要第三方的類庫支持 而且比較常用 就可以采用此種方法比如常
  
  用的數據庫驅動程序 寫 servlet 需要的 servlet 包等等 設置方法就是在環境變量中
  
  加入 CLASSPATH 然後就可以直接編譯運行了 還是以 HelloWorld 為例 比如你想在根
  
  目錄中運行它 那麼你直接在根目錄下執行
  
    $ java HelloWorld
  
    或者
  
    c:\>java HelloWorld
  
   
  
   這樣肯定會出錯 如果你的 CLASSPATH 沒有改動的話 我想大家應該知道為什麼錯了吧 那麼怎麼改呢? 前面說過 用戶類路徑就是一些包含你所需要的類的目錄 jar 檔案 包 zip 包 現在沒有生成包 所以只好把 HelloWorldclass 所在的目錄加到 CLASSPAT 了 根據前面的做法 再運行一次 看看 呵呵 成功了 換個路徑 又成功了!! 不僅僅? 以直接運行其中的類 當你要 import 其中的某些類時 同樣處理
   不知道你想到沒有 隨著你的系統的不斷的擴充 (當然了 都是一些需要 java 的東撾? 如果都加到這個環境變量裡 那這個變量會越來越臃腫 雖然環境變量空間可以開很大 總 覺得有些不舒服 看看下面一個方法
  
    在命令行參數中指明 classpath
  
   還是和上面相同的目標 在任何目錄下執行 HelloWorld 用這個方法怎麼實現呢?
  
    [/]$ java cp /HelloWorld HelloWorld
  
    或者
  
    c:\>java cp c:\HelloWorld HelloWorld
  
   就可以了 這是這種方法的最簡單的應用了 當你使用了另外的包的時候 還可以采用另一種方法 例如:
  
    $ javac classpath aPath/aPackagejar: myJavajava
  
    $ java cp aPath/aPackagejar: myJava
  
    或者
  
    c:\> javac classpath aPath\aPackagejar; myJavajava
  
    c:\> java cp aPath\aPackagejar; myJava
  
   這種方法也有一個不方便的的地方就是當第三方包所在的路徑較長或者需要兩個以上包包?
  
  時候 每次編譯運行都要寫很長 非常不方便 這時候可以寫腳本來解決 比如一個例子:
  
    compile  (文件 權限改為可執行 當前目錄)
  
    $ cat compile
  
  
  
    #!/bin/bash
  
    javac classpath aPath\aPackagejar:anotherPath\anotherPackagejar: myJavvajava
  
  
  
    run (文件 權限改為可執行 當前目錄)
  
    $cat run
  
  
  
    #!/bin/bash
  
    java cp aPath\aPackagejar:anotherPath\anotherPackagejar: myJava
  
  
    或者:
  
    compilebat
  
    c:\HelloWorld> type compilebat
  
  
  
    javac classpath aPath\aPackagejar:anotherPath\anotherPackagejar: myJavvajava
  
  
  
    runbat
  
    c:\HelloWorld> type runbat
  
  
  
    java cp aPath\aPackagejar:anotherPath\anotherPackagejar: myJava
  
  
  
   就可以了 試試看
  
   前面提到了擴展類 擴展類是什麼呢? java 的擴展類就是應用程序開發者用來
  
  擴展核心平台功能的 java 類的包(或者是 native code) 虛擬機能
From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/11133.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.