资源描述:
《Java 中的 ClassPath 和 Package》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Java中的ClassPath和Package前言: 由于这两个问题新手问得较多,且回答比较零散,很难统一整理,所以就直接写了一篇,还请大家见谅.正文:一,类路径(classpath) 当你满怀着希望安装好了java,然后兴冲冲地写了个helloworld,然后编译,运行,就等着那两个美好的单词出现在眼前,可是不幸的是,只看到了Can'tfindclassHelloWorld或者Exceptioninthread"main"java.lang.NoSuchMethodError:mai
2、n.为什么呢?编译好的class明明在呀. 我们一起来看一看java程序的运行过程.我们已经知道java是通过java虚拟机来解释运行的,也就是通过java命令,javac编译生成的.class文件就是虚拟机要执行的代码,称之为字节码(bytecode),虚拟机通过classloader来装载这些字节码,也就是通常意义上的类.这里就有一个问题,classloader从哪里知道java本身的类库及用户自己的类在什么地方呢?或者有着缺省值(当前路径).或者要有一个用户指定的变量来表明,这个变量就是类路径
3、(classpath),或者在运行的时候传参数给虚拟机.这也就是指明classpath的三个方法.编译的过程和运行的过程大同小异,只是一个是找出来编译,另一个是找出来装载. 实际上java虚拟机是由javaluncher初始化的,也就是java(或java.exe)这个程序来做的.虚拟机按以下顺序搜索并装载所有需要的类: 1,引导类:组成java平台的类,包含rt.jar和i18n.jar中的类. 2,扩展类:使用java扩展机制的类,都是位于扩展目录($JAVA_HOME/jre/li
4、b/ext)中的.jar档案包. 3,用户类:开发者定义的类或者没有使用java扩展机制的第三方产品.你必须在命令行中使用-classpath选项或者使用CLASSPATH环境变量来确定这些类的位置.我们在上面所说的用户自己的类就是特指这些类. 这样,一般来说,用户只需指定用户类的位置,引导类和扩展类是"自动"寻找的. 那么到底该怎么做呢?用户类路径就是一些包含类文件的目录,.jar,.zip文件的列表,至于类具体怎么找,因为牵扯到package的问题,下面将会说到,暂时可认为只要包含了
5、这个类就算找到了这个类.根据平台的不同分隔符略有不同,类unix的系统基本上都是":",windows多是";".其可能的来源是: *".",即当前目录,这个是缺省值. *CLASSPATH环境变量,一旦设置,将缺省值覆盖. *命令行参数-cp或者-classpath,一旦指定,将上两者覆盖. *由-jar参数指定的.jar档案包,就把所有其他的值覆盖,所有的类都来自这个指定的档案包中.由于生成可执行的.jar文件,还需要其他一些知识,比如package,还有特定的配置文件,本文的
6、最后会提到.可先看看jdk自带的一些例子. 我们举个HelloWorld的例子来说明.先做以下假设: *当前目录是/HelloWorld(或c:HelloWorld,以后都使用前一个) *jdk版本为1.2.2(linux下的) *PATH环境变量设置正确.(这样可以在任何目录下都可以使用工具) *文件是HelloWorld.java,内容是: publicclassHelloWorld { publicstaticvoidmain(String[
7、]args) { System.out.println("HelloWorld!"); System.exit(0); } } 首先这个文件一定要写对,如果对c熟悉的话,很有可能写成这样: publicstaticvoidmain(intargc,String[]argv) { .... } 这样是不对的,不信可以试一试.由于手头没有java的规范,所以作如下猜想:java的app
8、lication程序,必须以publicstaticvoidmain(String[])开始,其他不一样的都不行. 到现在为止,我们设置方面只设置了PATH. 1,当前路径就是指你的.class文件在当前目录下, HelloWorld$javacHelloWorld.java //这一步不会有多大问题, HelloWorld$javaHelloWorld //这一步可能就