Java中-classpath和路径的使用

Java编译与运行详解
本文详细介绍了如何使用javac命令编译Java源文件,并解释了在不同路径下编译时如何正确设置classpath。此外,还阐述了如何利用java命令执行编译后的类文件,特别是在类文件依赖外部库时如何配置classpath。

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>。如果想在这里执行编译,会有什么结果呢?
 
(1).C:/Documents and Settings/peng> javac HelloWorld.java 这时编译器会给出如下的错误提示信息:
error: cannot read: HelloWorld.java
这是因为默认情况下javac是在当前目录下查找类文件,很明显这个路径不是我们存放类文件的地方,所以就会报错了
        
(2).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.java:public class HelloWorldExtendsTestCase extends junit.framework.TestCase 

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

(1).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文件的绝对路径了。
         
(2).C:/Documents and Settings/peng>java HelloWorldExtendsHelloWorld
       Hello World

可以看到执行成功了。HelloWorldExtendsHelloWorld继承了HelloWorld类,所以在执行时JVM会先查找在CLASSPATH下是否存在一个HelloWorld.class文件,因为我们已经成功编译了HelloWorld 类了,所以可以成功执行HelloWorldExtendsHelloWorld.class
 
(3).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这个类,如(4):

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

总结:

(1).何时需要使用-classpath:当你要编译或执行的类引用了其它的类,但被引用类的.class文件不在当前目录下时,就需要通过-classpath来引入类
(2).何时需要指定路径:当你要编译的类所在的目录和你执行javac命令的目录不是同一个目录时,就需要指定源文件的路径(CLASSPATH是用来指定.class路径的,不是用来指定.java文件的路径的)
 

### Java中`-classpath`命令行参数的使用方法示例 在Java中,`-classpath`(或简写为`-cp`)是一个非常重要的命令行选项,用于指定JVM在运行时查找类文件的路径。通过该参数,可以灵活地控制类加载器从哪些目录、JAR文件或ZIP归档中加载类[^2]。 #### 基本语法 ```bash java -classpath <路径> <主类名> ``` 其中 `<路径>` 是一个或多个用分隔符(Windows上是分号`;`,Linux/macOS上是冒号`:`)分隔的目录、JAR文件或ZIP文件,`<主类名>` 是包含 `main` 方法的类的全限定名。 若未显式指定 `-classpath`,则默认使用环境变量 `CLASSPATH` 的值;如果 `CLASSPATH` 也未设置,则默认当前目录(`.`)作为类路径。 #### 示例说明 ##### 示例1:指定单个目录作为类路径 假设类文件位于 `C:\myclasses` 目录下: ```bash java -classpath C:\myclasses com.example.Main ``` JVM 将在 `C:\myclasses` 中查找 `com/example/Main.class` 文件并执行。 ##### 示例2:指定多个路径 若类文件分布在多个目录中,例如 `C:\myclasses` `C:\lib\utils.jar`: ```bash java -classpath C:\myclasses;C:\lib\utils.jar com.example.Main ``` JVM 将依次从这两个位置加载所需的类文件。 ##### 示例3:使用相对路径 如果类文件位于项目中的 `build/classes` 目录,并且依赖库在 `lib/utils.jar`: ```bash java -classpath build/classes:lib/utils.jar com.example.Main ``` 适用于Linux/macOS系统。 ##### 示例4:与`-jar`一起使用(注意限制) 当使用 `java -jar` 执行 JAR 包时,不能再通过 `-classpath` 指定额外的类路径,因为 `-jar` 会忽略所有类路径设置,仅使用 JAR 清单文件中定义的类路径。若需扩展类路径,应修改清单文件中的 `Class-Path` 属性。 #### 注意事项 - 使用 `-classpath` 时,路径中的空格需要用引号包裹或使用转义字符。 - 在跨平台开发中应注意路径分隔符的差异。 -使用 IDE(如 IntelliJ IDEA 或 Eclipse),通常由 IDE 自动管理类路径,但在命令行执行时需手动配置。 ---
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值