Java中的classpath

简介:

CLASSPATH是Java中最重要的概念之一,但通常都被忽视了。不清楚classpath就不会知道java如何定位你的类文件。

CLASSPATH是一个环境变量,使Java定位用户定义的类。在Windows中,可以在系统属性->高级->环境变量中设置它。

Windows可以输入 echo %CLASSPATH%查看设置。

运行程序的时候,可以通过参数 -cp,或者-classpath来重新指定classpath,而不必从环境变量中获取。这也是让不同的应用程序使用不同的classpath的最好的办法。

比如,命令

java -classpath c:\classes;c:\jar\abc.jar;c:\zip\abc.zip;c:\src abc

默认的CLASSPATH指向当前的路径,查询当前路径下的类、

如果你有多个目录定义在CLASSPATH变量中,Java会查询从第一个目录中查找,只有在第一个目录中未找到的时候,才会接着在第二个目录中找。这是个非常有用的特性。比如:

有一个CLASSPATH=/home/tester/first:/home/tester/second。

假设有2个不同版本的test类,在first和second目录中,那当运行java Test的时候,由于java按照顺序查找,它会先去first目录查找,并且找到test类了,它就不会再去second目录中查找了。

如果从first目录中删除了test类,那么会从second目录中查找该类。

当使用-jar命令行选项来运行你的程序的时候, CLASSPATH环境变量会被忽略,-cp和-classpath开关也会被忽略。这种情况下,你必须在META-INF/MANIFEST.MF中使用Class-Path attribute 设置classpath

一个常见的问题是,如果我当前的CLASSPATH变量指向当前目录“.”,在testing包中有一个class为Test,象这样的目录结构C:\project\testing\Test.class。此时在C:\project\testing\目录下运行命令“java Test”,会发生什么?

这个命令不会被执行,因为这会给你一个异常in thread "main" java.lang.NoClassDefFoundError: Test。因为类名不是Test,而是 testing.Test ,尽管classpath被设置到当前目录。

如果在C:\project\testing\目录下,运行命令java testing.Test,也会抛出异常 in thread "main" java.lang.NoClassDefFoundError: testing/Test

因为它会在当前目录"."开始寻找在testing包中名字为Test的类,但是找不到,因为在C:\project\testing\之后没有testing这样的路径。

要运行成功,必须在C:\project目录下,运行C:\project>java testing.Test ,才会成功。














本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/1129934,如需转载请自行联系原作者





相关文章
|
jenkins Java 持续交付
maven 打包项目报Fatal Error: Unable to find package java.lang in classpath or bootclasspat
maven 打包项目报Fatal Error: Unable to find package java.lang in classpath or bootclasspat
maven 打包项目报Fatal Error: Unable to find package java.lang in classpath or bootclasspat
|
XML Java Maven
nested exception is java.io.FileNotFoundException: class path resource [springmvc.xml] cannot be ope
nested exception is java.io.FileNotFoundException: class path resource [springmvc.xml] cannot be ope
841 0
nested exception is java.io.FileNotFoundException: class path resource [springmvc.xml] cannot be ope
|
Java 编译器
Java中环境变量 PATH 与 CLASSPATH 的区别
Java中环境变量 PATH 与 CLASSPATH 的区别
471 0
Class path contains multiple SLF4J bindings,后来找到的解决思路是idea2019.3必须用java11和idea2019.3版本,必须用applicatio
Class path contains multiple SLF4J bindings,后来找到的解决思路是idea2019.3必须用java11和idea2019.3版本,必须用applicatio
|
Java 应用服务中间件 API
java 启动查看jar包加载顺序并设置classpath
java 启动查看jar包加载顺序并设置classpath
1754 0
|
IDE Java Unix
Java的class path的设置与应用
Java的class path的设置与应用
565 0
|
安全 Java Linux
JAVA环境变量JAVA_HOME、CLASSPATH、PATH设置详解
JAVA环境变量JAVA_HOME、CLASSPATH、PATH设置详解
850 0
JAVA环境变量JAVA_HOME、CLASSPATH、PATH设置详解
|
Oracle 安全 Java
JAVA环境变量JAVA_HOME、CLASSPATH、PATH设置详解
JAVA环境变量JAVA_HOME、CLASSPATH、PATH设置详解
761 0
JAVA环境变量JAVA_HOME、CLASSPATH、PATH设置详解
|
安全 Java Linux
JAVA环境变量JAVA_HOME、CLASSPATH、PATH设置详解
JAVA环境变量JAVA_HOME、CLASSPATH、PATH设置详解
249 0
|
消息中间件 Java RocketMQ
【Java】Error creating bean with name ‘functionBindingRegistrar‘ defined in class path resource的一种解决方式
【Java】Error creating bean with name ‘functionBindingRegistrar‘ defined in class path resource的一种解决方式
537 0