classpath顾名思义,就是把四面八方的jar都经过字符串的形式写入文件,而后供项目调用的,这样既方便,又简洁,还能够根据这个进行打包。classpath问题相信是全部初学者比较头疼的问题。java
1) classpath的做用:
它的做用就事让java找到你所要执行,或你拥有的类。
2) classpath的设置:
设置classpath,通常能够在2个地方进行,
一是系统环境,如Windows98 中autoexec.bat文件中,每次开机自动设置。
Windows2000 中系统设置,加入classpath项 等等。
二是在执行时,如java -classpath C:\Project;%classpath% myclass
这样就就在本来的classpath中加入了C:\Project这个目录。
3) 用途(怎么用):
classpath有点相似path,但不彻底是。
通常咱们在一个类中声明包名:如
package mypackage.first;
import java.io.*;
public class myfirst { ....}
那么就是把myfirst这个类放进mypackage里的first里面。你们能够把mypackage和first看成目录,可是你不能在mypackage\first里执行java myfirst 。由于这样java会认为你是在找默认目录(即classpath)里找myfirst类,而不是mypackage.first里面的myfirst类。什么意思呢?
这是由于java只会在classpath中找有关java的东西,不会理会path。只有这样才能跨平台。
classpath中加个.(点)表示当前目录,即在当前目录寻找java的类,不理会其余目录。
(注意:java自己的类,如java.io.*;java awt.*;等等会自动包括进去,不用指定)
你们会以为这样至关麻烦,但这很是有用,若是你要管理你的文件时。好比说我有10个EJB的client,分别对应不一样的EJB,那么你能够把这10个client分别放入各自的EJB包中,避免发生混乱。如:
myejb.helloworld.client;
myejb.firstEJB.client; 等等。
举个例子:
classpath=C:\Project;D:\;
你在C:\Project里有first,helloworld目录,里面相应有各自的client文件(已编译)。
给出first目录的client.java做例:
package first;
import java.io.*;
public class client
{
public static void main(String args[])
{
System.out.println("first.client invoked!!");
}
}
编译:在 C:\Project\first> javac *.java
那么你就能够在任何DOS目录执行java first.client ,这都会启动这个client,而不会启动helloworld里的,或其余的。
若是你在classpath中加了.(点), 如classpath=.;D:\;
那么你必需要在C:\Project>里面执行上述语句,由于这表示在D:\和当前目录寻找,不然java会报错 ClassNoFoundException 。这点要注意。
我想这也差很少了,虽然短了点,可是精就好了,有问题跟贴,或者直接加***流,群号:457036818。
这里,我举一个例子让读者更容易理解classpath的做用。
假设有100座楼房,从Building001到Build100依次编号,而且每一座楼房都有100个住户,也从Resident001到Resident100依次编号。这100座楼,能够在亚洲,也能够在欧洲。那么,这里的区域,就是DOS目录(就是你存放package的地方)。这里的楼房,就有点相似于package。这里的住户,就是你所创建的类(class)。
如,第55号楼39号住户, 那么就能够表示为:
package Building55;
public class Resident39
{
...//省略 实现代码
}
目录方面:
C:\
|------亚洲(区域的做用,也可做为package做用)
| |----Building001(package的做用)
| | |-----Resident001.....到Resident100(A)
| |
| |----Building002
| | |-----Resident001.....到Resident100
| |
| |----Building003
| | |-----Resident001.....到Resident100
| |
| |----Building...
| | |-----Resident..........
| |
| |----Building050
| |-----Resident001.....到Resident100
|
|------欧洲(区域的做用,也可做为package做用)
|----Building051(package的做用)
|-----Resident001.....到Resident100(B)
|----Building052
|-----Resident001.....到Resident100
|----Building053
|-----Resident001.....到Resident100
|----Building...
|-----Resident..........
|----Building100
|-----Resident001.....到Resident100
这里的A,能够有多种表示方法: 推荐方法(1)
1。设classpath=C:\;
Java文件:C:\亚洲\Building001\Resident001.java
package 亚洲.Building001;
public class Resident001
{
.....//省略
}
运行:1) C:\亚洲\Building001>javac *.java
2) C:\任何目录\>java 亚洲.Building001.Resident001
2。设classpath=C:\亚洲;
Java文件:C:\亚洲\Building001\Resident001.java
package Building001;//不是 “亚洲.Building001” 了
public class Resident001
{
.....//省略
}
运行:1) C:\亚洲\Building001>javac *.java
2) C:\任何目录\>java Building001.Resident001
注:这样设置的话,有可能会引起包名冲突。
如:
classpath=C:\亚洲;C:\欧洲;
欧洲也有一样的Building001.Resident001的话。
3。设classpath=C:\亚洲\Building001;
Java文件:C:\亚洲\Building001\Resident001.java
//没有package 声明语句。
public class Resident001
{
.....//省略
}
运行:1) C:\亚洲\Building001>javac *.java
2) C:\任何目录\>java Building001.Resident001
注:这样会与(2)有相同的问题,就是包名冲突。
三种方法都介绍完了。下来有令一个问题。
就是访问包。
其实很简单的。就像访问住户同样。
须要知道 洲际板块,建筑编号(package的声明)。
须要去哪一个住户,就从哪一个建筑去/或者先去某板块(呵呵)。。。
而不能直接去某个住户。
如:
C:\
|------亚洲(区域的做用,也可做为package做用)
| |----Building001(package的做用)
| | |-----Resident001.....到Resident100(A)
| |
| |----Building002
| | |-----Resident001.....到Resident100
....
(A)的表示是:
package 亚洲.Building001;
public class Resident100
{
....//省略
}
那么:在classpath设置正确的状况下,你须要执行
C:\任意目录\>java 亚洲.Building001.Resident100
而不是
C:\亚洲\Building001>java Resident100
或
C:\亚洲>java Building001.Resident100
总而言之就是 要和包声明的等级同样。不能省略,也不能添加。ide