一、类路径 (class path)
当你满怀着希望安装好java,然后兴冲冲地写了个“hello world”,然后编译, 运行,就等着那两个美好的单词出现在眼前。可是不幸的是,只看到了“Can't find class HelloWorld”或者“Exception in thread "main" java.lang.NoSuchMethodError: main。
为什么呢?编译好的class明明在呀。
我们一起来看一看java程序的运行过程。我们已经知道java是通过java虚拟机来解释运行的,也就是通过java命令—javac编译生成的.class文件就是虚拟机要执行的代码, 称之为字节码(bytecode),虚拟机通过classloader来装载这些字节码,也就是通常意义上的类。这里就有一个问题,classloader从哪里知道java本身的类库及用户自己的类在什么地方呢?或者有着缺省值(当前路径) ,或者要有一个用户指定的变量来表明,这个变量就是类路径(classpath),或者在运行的时候传参数给虚拟机。这也就是指明classpath的三个方法。编译的过程和运行的过程大同小异,只是一个是出来编译,另一个是出来装载。实际上java虚拟机是由java luncher初始化的,也就是java (或) 这个程序来做的。虚拟机按以下
顺序搜索并装载所有需要的类:
1、引导类:组成java平台的类,包含rt.jar和i18n.jar中的类。
2、扩展类:使用java扩展机制的类,都是位于扩展目录($JAVA_HOME/jre/lib/ext)
中的.jar档案包。
中的.jar档案包。
3、用户类:开发者定义的类或者没有使用java扩展机制的第三方产品。你必须在命令行中使用-classpath选项或者使用CLASSPATH环境变量来确定这些类的位置。
我们在上面所说的用户自己的类就是特指这些类。
这样,一般来说,用户只需指定用户类的位置,引导类和扩展类是“自动”寻的。那么到底该怎么做呢?用户类路径就是一些包含类文件的目录,.jar, .zip文件的列表,至于类具体怎么,因为牵扯到package的问题,下面将会说到,暂时可认为只要包含了这个类就算到了这个类。根据平台的不同分隔符略有不同,类unix的系统基本上都是“:”,windows多是“;”。其可能的来源是:
* “. ”, 即当前目录,这个是缺省值。
* “. ”, 即当前目录,这个是缺省值。
* CLASSPATH环境变量,一旦设置,将缺省值覆盖。
* 命令行参数-cp或者-classpath,一旦指定,将上两者覆盖。
* 由-jar参数指定的.jar档案包,就把所有其他的值覆盖,所有的类都来自这个指定的档案包中。由于生成可执行的.jar文件,还需要其他一些知识,比如package,还有特定的配置文件,本文的最后会提到。可先看看jdk自带的一些例子。
我们举个HelloWorld的例子来说明。先做以下假设:
* 当前目录是/HelloWorld(或c:\HelloWorld, 以后都使用前一个)
自学java从哪里开始* jdk版本为1.2.2 (linux下的)
* PATH环境变量设置正确。(这样可以在任何目录下都可以使用工具)
* 文件是HelloWorld.java,内容是:
public class HelloWorld
{
public static void main(String[] args)
{
System.out.println( "Hello World!\n ");
it(0);
}
}
首先这个文件一定要写对,如果对c熟悉的话,很有可能写成这样:
public static void main(int argc,String[] argv)
{
....
}
这样是不对的,不信可以试一试。由于手头没有java的规范,所以作如下猜想: java的application程序,必须以public static void main(String[])开始,其他不一样的都不行。
到现在为止,我们设置方面只设置了PATH。
1、当前路径就是指你的.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。
2、 当你的程序需要第三方的类库支持,而且比较常用,就可以采用此种方法。比如常用的数据库驱动程序,写servlet需要的servlet包等等。设置方法就是在环境变量中加入CLASSPATH。然后就可以直接编译运行了。还是以HelloWorld为例,比如你想在根目录中运行它,那么你直接在根目录下执行
$ java HelloWorld
或者 c:\> java HelloWorld
这样肯定会出错,如果你的CLASSPATH没有改动的话.。我想大家应该知道为什么错了吧,那么怎么改呢?前面说过,用户类路径就是一些包含你所需要的类的目录,.jar档案包,.zip包。现在没有生成包,所以只好把HelloWorld.class所在的目录加到CLASSPATH了,根据前面的做法,再运行一次,看看,呵呵,成功了,换个路径,又成功了!!不仅仅以直接运行其中的类,当你要import其中的某些类时,同样处理。
不知道你想到没有,随着你的系统的不断的扩充,(当然了,都是一些需要java的东西。 如果都加到这个环境变量里,那这个变量会越来越臃肿,虽然环境变量空间可以开很大,总
觉得有些不舒服。看看下面一个方法。
觉得有些不舒服。看看下面一个方法。
3、在命令行参数中指明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)。虚拟机能像使用系统类一样使用这些扩展类。有人建议可以把包放入扩展目录里,这样,CLASSPATH也不用设了,也不用指定了,岂不是很方便?确实可以正确运行,但是个人认为这样不好,不能什么东西都往里搁,一些标准的扩展包可以,比如,JavaServlet,Java3D等等。可以提个建议,加一个环境变量,比如叫JARPATH,指定一个目录,专门存放用户的jar 、zip等包,这个要等SUN公司来做了。windows98下,我原来安装的时候,一直装不上,总是死机,好不容易装上了,缺省的是不能运行正确的,然后把 tool.jar 放入 CLASSPATH 后工作正常。现在作测试,去掉仍然是正确的。经过多次测试,发现如果原来曾装过jdk的都很好,没有装过的装的时候会死机,多装几次就可以了。如果你发现正确安装后,不能正常工作,就把tools.jar加入CLASSPATH,试一下。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论