java中classpath设置

    技术2022-05-20  50

    classpath问题可以说是所有初学者头疼的问题,偶也一样。 现将自己的经验说说:(我的中文不好,大家将就一下,对不起) 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 。这点要注意。 我想这也差不多了,虽然短了点,但是精就行了,有问题跟贴。 谢谢你读完这篇文章。 这里,我举一个例子让读者更容易理解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 总结一下:就是 要和包声明的等级一样。不能省略,也不能添加。 (完)


    最新回复(0)