前言: 由於這兩個問題新手問得較多
且回答比較零散
很難統一整理
所
以就直接寫了一篇
還請大家見諒
正文: 一 類路徑 (class path) 當你滿懷著希望安裝好了 java
然後興沖沖地寫了個 hello world
然後編譯
運行
就等著那兩個美好的單詞出現在眼前
可是不幸的是
只看到了 Can
t find
class HelloWorld 或者 Exception in thread
main
java
lang
NoSuchMethodError: maain
為什麼呢? 編譯好的 class 明明在呀
我們一起來看一看 java 程序的運行過程
我們已經知道 java 是通過 java
虛擬機來解釋運行的
也就是通過 java 命令
javac 編譯生成的
class
文件就是虛擬機要執行的代碼
稱之為字節碼(bytecode)
虛擬機通過 classloader
來裝載這些字節碼
也就是通常意義上的類
這裡就有一個問題
classloader 從
哪裡知道 java 本身的類庫及用戶自己的類在什麼地方呢? 或者有著缺省值(當前路徑)
或者要有一個用戶指定的變量來表明
這個變量就是類路徑(classpath)
或者在運行
的時候傳參數給虛擬機
這也就是指明 classpath 的三個方法
編譯的過程和運行
的過程大同小異
只是一個是找出來編譯
另一個是找出來裝載
實際上 java 虛擬機是由 java luncher 初始化的
也就是 java (或 java
exe)
這個程序來做的
虛擬機按以下順序搜索並裝載所有需要的類:
引導類: 組成 java 平台的類
包含 rt
jar 和 i
n
jar 中的類
擴展類: 使用 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 環境變量設置正確
(這樣可以在任何目錄下都可以使用工具)
* 文件是 HelloWorld
java
內容是:
public class HelloWorld
{
public static void main(String[] args)
{
System
out
println(
Hello World!\n
);
System
exit(
);
}
}
首先這個文件一定要寫對
如果對 c 熟悉的話
很有可能寫成這樣:
public static void main(int argc
String[] argv)
{
}
這樣是不對的
不信可以試一試
由於手頭沒有 java 的規范
所以 作如下猜想: java 的 application 程序
必須以 public static void main(String[]) 開始
其他不一樣的都不行
到現在為止
我們設置方面只設置了 PATH
當前路徑就是指你的
class 文件在當前目錄下
[HelloWorld]$ javac HelloWorld
java //這一步不會有多大問題
[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 包
現在沒有生成包
所以只好把 HelloWorld
class 所在的目錄加到 CLASSPAT 了
根據前面的做法
再運行一次
看看
呵呵
成功了
換個路徑
又成功了!! 不僅僅? 以直接運行其中的類
當你要 import 其中的某些類時
同樣處理
不知道你想到沒有
隨著你的系統的不斷的擴充
(當然了
都是一些需要 java 的東撾? 如果都加到這個環境變量裡
那這個變量會越來越臃腫
雖然環境變量空間可以開很大
總 覺得有些不舒服
看看下面一個方法
在命令行參數中指明 classpath
還是和上面相同的目標
在任何目錄下執行 HelloWorld
用這個方法怎麼實現呢?
[/]$ java
cp /HelloWorld HelloWorld
或者
c:\>java
cp c:\HelloWorld HelloWorld
就可以了
這是這種方法的最簡單的應用了
當你使用了另外的包的時候
還可以采用另一種方法
例如:
$ javac
classpath aPath/aPackage
jar:
myJava
java
$ java
cp aPath/aPackage
jar:
myJava
或者
c:\> javac
classpath aPath\aPackage
jar;
myJava
java
c:\> java
cp aPath\aPackage
jar;
myJava
這種方法也有一個不方便的的地方就是當第三方包所在的路徑較長或者需要兩個以上包包?
時候
每次編譯運行都要寫很長
非常不方便
這時候可以寫腳本來解決
比如一個例子:
compile (文件
權限改為可執行
當前目錄)
$ cat compile
#!/bin/bash
javac
classpath aPath\aPackage
jar:anotherPath\anotherPackage
jar:
myJavva
java
run (文件
權限改為可執行
當前目錄)
$cat run
#!/bin/bash
java
cp aPath\aPackage
jar:anotherPath\anotherPackage
jar:
myJava
或者:
compile
bat
c:\HelloWorld> type compile
bat
javac
classpath aPath\aPackage
jar:anotherPath\anotherPackage
jar:
myJavva
java
run
bat
c:\HelloWorld> type run
bat
java
cp aPath\aPackage
jar:anotherPath\anotherPackage
jar:
myJava
就可以了
試試看
前面提到了擴展類
擴展類是什麼呢? java 的擴展類就是應用程序開發者用來
擴展核心平台功能的 java 類的包(或者是 native code)
虛擬機能
From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/11133.html