寫了一段簡單的測試代碼
import com.alibaba.fastjson.JSONObject;
import java.util.concurrent.TimeUnit;
public class Test {
public static void main(String[] args) throws InterruptedException {
JSONObject json = new JSONObject();
TimeUnit.HOURS.sleep(1);
}
}
然后分別執(zhí)行
[root@root wangming]# javac -cp ./* Test.java
javac: invalid flag: ./Test.class
Usage: javac <options> <source files>
use -help for a list of possible options
[root@root wangming]# javac -cp . Test.java
Test.java:2: error: package com.alibaba.fastjson does not exist
import com.alibaba.fastjson.JSONObject;
^
Test.java:9: error: cannot find symbol
JSONObject json = new JSONObject();
^
symbol: class JSONObject
location: class Test
Test.java:9: error: cannot find symbol
JSONObject json = new JSONObject();
^
symbol: class JSONObject
location: class Test
3 errors
[root@root wangming]# javac -cp .:./ Test.java
Test.java:2: error: package com.alibaba.fastjson does not exist
import com.alibaba.fastjson.JSONObject;
^
Test.java:9: error: cannot find symbol
JSONObject json = new JSONObject();
^
symbol: class JSONObject
location: class Test
Test.java:9: error: cannot find symbol
JSONObject json = new JSONObject();
^
symbol: class JSONObject
location: class Test
3 errors
[root@root wangming]# javac -cp .:./* Test.java
在Setting the class path這篇文章中, 說classpath 可以是以下三種形式
- jar包(.jar結(jié)尾的文件) 里面包含了class文件
- zip包(.zip結(jié)尾的文件) 里面包含了class文件
- 目錄(文件夾) 如果class文件里有package, 那么目錄里一定要有和package相應(yīng)的目錄結(jié)構(gòu)
如果一個(gè)classpath中包含了通配符(*
), 那么Java就不會(huì)在這個(gè)目錄下搜索class文件了.
例如lib/*
, 如果classpath是這個(gè), 那么classpath就只會(huì)在lib
目錄下搜索jar文件, 然后從jar文件中去加載class, 如果想要在lib目錄下既搜索jar文件也搜索class文件的話, 那么可以寫成lib:lib/*
或者lib/*:lib
.
還有一點(diǎn)很重要的是, 如果lib
目錄下有子目錄的話lib/jetty
的話, Java是不會(huì)進(jìn)行遞歸搜索子目錄的织阳。
說到這里, Java為什么不會(huì)在lib/*
下搜索class文件呢泡一?是這樣的, 如果lib
目錄下有a.jar
和b.jar
, 其實(shí)現(xiàn)在的lib/*
就被替換成了lib/a.jar:lib/b.jar
. 我們可以在Java的系統(tǒng)變量里看到這個(gè)結(jié)果.
看到這,我們應(yīng)該就推斷出上面錯(cuò)誤的原因了, .
只會(huì)搜索class
文件但是不會(huì)搜索jar, 而*
通配符則自動(dòng)幫我換成了jar文件的classpath的替換.
安裝上JDK后, 系統(tǒng)會(huì)自動(dòng)設(shè)置一個(gè)CLASSPATH的環(huán)境變量(.:/home/jdk1.8/lib/dt.jar:/home/jdk1.8/lib/tools.jar), 但是當(dāng)運(yùn)行Java命令, 指定
-cp
的時(shí)候,會(huì)覆蓋掉這個(gè)classpath, 所以在新的classpath上一定要指定.
classpath適用于下列工具
JDK Tools and Utilities