luyaran的博客

一名php小菜鸟的成长故事

java入门---环境设置以及运行实例之如何执行指定class文件目录(classpath)

    如果我们 Java 编译后的class文件不在当前目录,我们可以使用 -classpath 来指定class文件目录:

C:> java -classpath C:\java\DemoClasses HelloWorld

    以上命令中我们使用了 -classpath 参数指定了 HelloWorld 的 class 文件所在目录。如果class文件在jar文件中,则命令如下:

c:> java -classpath C:\java\myclasses.jar

    我们来详细看下javac -classpath的使用javac: 如果当前你要编译的 java 文件中引用了其它的类(比如说:继承),但该引用类的 .class 文件不在当前目录下,这种情况下就需要在 javac 命令后面加上 -classpath 参数,通过使用以下三种类型的方法 来指导编译器在编译的时候去指定的路径下查找引用类。

  • (1).绝对路径:javac -classpath c:/junit3.8.1/junit.jar Xxx.java
  • (2).相对路径:javac -classpath ../junit3.8.1/Junit.javr Xxx.java
  • (3).系统变量:javac -classpath %CLASSPATH% Xxx.java (注意:%CLASSPATH%表示使用系统变量CLASSPATH的值进行查找,这里假设Junit.jar的路径就包含在CLASSPATH系统变量中)

    再来看javac 绝对路径的使用。javac:假设你要编译的类文件名叫:HelloWorld.java,其完全路径为:D:/java/HelloWorld.java。但你所在的当前目录是:C:/Documents and Settings/peng>。如果想在这里执行编译,会有什么结果呢?

    首先第一点,C:/Documents and Settings/peng> javac HelloWorld.java 这时编译器会给出如下的错误提示信息:

error: cannot read: HelloWorld.java

    这是因为默认情况下 javac 是在当前目录下查找类文件,很明显这个路径不是我们存放类文件的地方,所以就会报错了。

    第二点,C:/Documents and Settings/peng> javac D:/java/HelloWorld.java 这时编译成功。所以,只要你执行 javac 命令的目录不是类文件存放的目录,你就必须在 javac 命令中显式地指定类文件的路径。

    再来看java -classpath 的使用。java:假设我们的 CLASSPATH 设置为:D:/peng/java/pro ,在该目录下有三个文件:HelloWorld.java / HelloWorldExtendsTestCase / HelloWorldExtendsHelloWorld。这三个文件的类声明分别如下:

HelloWorld.java public class HelloWorld 
HelloWorldExtendsHelloWorld.java public class HelloWorldExtendsHelloWorld extends HelloWorld
HelloWorldExtendsTestCase.javapublic class HelloWorldExtendsTestCase extends junit.framework.TestCase

    假设我们已经按照上面关于 javac -classpathjavac 绝对路径的使用,顺利地完成了三个文件地编译。现在我们在 C:/Documents and Settings/peng> 目录下执行这三个 .class 文件:

C:/Documents and Settings/peng>java  HelloWorld 
Hello World

    可以看到执行成功。为什么我们在 C:/Documents and Settings/peng> 执行命令,JVM 能够找到D:/peng/java/pro/HelloWorld.class文件呢?这是因为我们配置了系统变量 CLASSPATH,并且指向了目录:D:/peng/java/pro 。所以 JVM 会默认去该目录下加载类文件,而不需要指定 .class 文件的绝对路径了。

C:/Documents and Settings/peng>java HelloWorldExtendsHelloWorld
Hello World

    可以看到执行成功了。HelloWorldExtendsHelloWorld 继承了 HelloWorld 类,所以在执行时JVM会先查找在 CLASSPATH 下是否存在一个HelloWorld.class 文件,因为我们已经成功编译了 HelloWorld 类了,所以可以成功执行 HelloWorldExtendsHelloWorld.class:

C:/Documents and Settings/peng>java HelloWorldExtendsTestCase
Exception in thread "main" java.lang.NoClassDefFoundError: junit/framework/TestCase

    可以看到程序抛出异常了,提示找不到 junit.framework.TestCase文件。为什么同样在 /peng/java/pro 下,HelloWorldExtendsHelloWorld.class 就可以成功执行,而这个就不行了呢?这是因为:junit.framework.TestCase.class 文件并不存在于当前目录下,所以为了能够让程序成功运行,我们必须通过指定 CLASSPATH 的方式,让 JVM 可以找到 junit.framework.TestCase这个类,如下:

C:/Documents and Settings/peng>java -classpath %CLASSPATH% HelloWorldExtendsTestCase
Hello World

    通过上面的了解,我们可以做出如下总结:

  • (1).何时需要使用 -classpath:当你要编译或执行的类引用了其它的类,但被引用类的 .class 文件不在当前目录下时,就需要通过 -classpath 来引入类
  • (2).何时需要指定路径:当你要编译的类所在的目录和你执行 javac 命令的目录不是同一个目录时,就需要指定源文件的路径(CLASSPATH 是用来指定 .class 路径的,不是用来指定 .java 文件的路径的)
    好啦,本次记录就到这里了。如果感觉不错的话,请多多点赞支持哦。。。
阅读更多

扫码向博主提问

去开通我的Chat快问

luyaran

非学,无以致疑;非问,无以广识
  • 擅长领域:
  • PHP
  • MySQL
  • shell
  • jQuery
  • js
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/luyaran/article/details/80333337
个人分类: 原创
所属专栏: Java学习之路
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

java入门---环境设置以及运行实例之如何执行指定class文件目录(classpath)

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭