Java中的classpath是什么?
Java中的classpath类路径是指向目录的路径或目录列表,类加载器用它在Java程序中查找和加载类。可以使用不区分大小写的Classpath环境变量、-cp
或-Classpath
命令行选项或中的Classpath属性来指定Classpath在JAR文件中的manifest.mf文件。在这篇Java文章中,我们将学习什么是Java中的classpath,Java如何解析classpath,classpath如何在Java中工作,以及如何在Windows和UNIX环境中为Java设置classpath。
我在金融和保险领域有经验,Java在这个领域被大量用于编写复杂的股票、固定收益交易应用程序。大多数投资银行都将笔试作为其核心Java面试问题的一部分,我总是在这些面试中发现至少一个与Java类路径相关的问题。
Java类路径是Java中最重要的概念之一,但是,我必须说,大多数都被忽略了。这应该是编写Java程序时首先要学习的内容,因为如果不正确理解Java中的类路径,就无法理解Java如何定位类文件。
另外,不要混淆Classpath和Java中的PATH,后者是另一个环境变量,用于查找位于JDK安装目录(也称为javahome)中的Java二进制文件。
Java中PATH与CLASSPATH的区别
PATH和CLASSPATH的主要区别在于前者用于定位Java命令,而后者用于定位Java类文件。让我们从basic开始,然后我们将看到一些示例和Java中类路径的即兴创作。
实际上,CLASSPATH是Java虚拟机用来定位用户定义类的环境变量。
正如我在本文中所说,我们将看到如何在windows和Linux中为java设置类路径,不同场景中的java -classpath
示例以及java -classpath
或java -cp
的使用。
在Windows中设置Java classpath
为了在Windows(Windows XP、Windows 2000或Windows 7的任何版本)中设置Java的classpath,您需要指定环境变量Classpath的值,此变量的名称不区分大小写,并且环境变量的名称是Classpath、Classpath还是Java中的Classpath也无所谓。
下面是在Windows中设置Java类路径的分步指南:
1. 按“Windows+Pause”-->Advanced-->Environment variable”进入Windows中的环境变量窗口,或者右键单击我的电脑,然后选择properties,然后选择Advanced,然后选择Environment variable这将在Windows中打开环境变量窗口。
2. 现在指定环境变量CLASSPATH,并将JAVA_HOME\lib的值放入其中,还可以通过include(点或句号)包含当前目录。
3. 现在要在windows中检查Java类路径的值,请在DOS命令提示符中键入“echo %classpath
”,它将显示包含在classpath中的目录的值。
您也可以使用DOS命令在windows中设置类路径,如:
set CLASSPATH=%CLASSPATH%;JAVA_HOME\lib;
这样您就可以在windowsxp、windows2000或windows7和8中设置类路径,因为它们都带有命令提示符。
在UNIX或Linux中设置Java classpath
要在Linux中为Java设置Classpath,只需从.bash_profile或.bashrc脚本中导出Classpath=“your Classpath”
,只要登录到Linux或Unix机器,脚本就会运行。现在要在Linux中检查Java类路径的值,请键入“echo ${CLASSPATH}
”,这将在命令提示符中打印类路径的值。通过使用export
命令,可以在Unix、Linux、Solaris、IBM AIX或任何其他Unix操作系统中设置Java的类路径。
在Java中重写Classpath
您可以在运行Java程序时通过提供“-cp
”或“-classpath
”选项来重写Java中由环境变量classpath定义的classpath,这是在同一Unix或Windows机器上运行不同Java应用程序的最佳方法,定义Java应用程序类路径的标准方法是为Java程序创建启动脚本,并在其中设置类路径,如下所示:
CLASSPATH=/home/tester/classes
java -cp $CLASSPATH Test
默认情况下,Java类路径指向以“.
”表示的当前目录,它将只在当前目录中查找任何类。
在Java中使用Classpath的不同示例
如果在CLASSPATH变量中定义了多个目录,Java将查找从第一个目录开始的类,如果在第一个目录中找不到指定的类,则只查找第二个目录。这是java中Classpath的一个非常有用的特性,在调试java应用程序或补丁发布之类的东西时非常有用。让我们看看java -classpath
示例
我已经将classpath环境变量设置为classpath=/home/tester/first:/home/tester/second
。现在我在第一个和第二个目录中都有不同版本的测试类。当我发出“java Test
”命令时会发生什么?会选哪个测试类?由于JVM按照类路径变量中列出的顺序搜索目录,因此它将首先转到“first
”目录,如果找到测试等级在那里它不会进入/home/tester/second目录。现在如果你删除测试等级它将从/home/tester/first目录转到/home/tester/second目录并选择测试等级从那里开始。
我使用Java类路径的这个特性来测试我的补丁版本,我们曾经有一个名为“patch
”的文件夹列为Java类路径中的第一个元素,任何时候我们想放任何调试语句或者想测试任何bug,我们只是修改Java源文件,编译它并生成类文件并将其放入补丁文件夹中,而不是创建JAR文件并发布整个新的Java应用程序。如果您正在处理一个大型项目,而您没有在Windows中设置开发环境,并且您的项目只在Unix服务器上运行,那么这是非常方便的。这种方法比在Eclipse中远程调试Java应用程序快得多
另外值得注意的是,当您使用java -jar
命令行选项将java程序作为可执行jar运行时,CLASSPATH环境变量将被忽略,-cp
和-CLASSPATH
开关也将被忽略。在这种情况下,您可以在META-INF/MANIFEST.MF中设置Java classpath。在short
类中,清单文件中的path属性重写由-cp
、-classpath
或classpath环境变量指定的类路径。
现在一个常见的问题是,我的CLASSPATH变量是否指向当前目录“.
”,并且在包“testing”中有一个名为“Test
”的类,其目录结构为C:\project\testing\Test.class在我的电脑里。
如果从目录“C:\project\testing\”运行命令“java test
”,会发生什么?它会跑吗?
不,它不会运行它会给你一个异常:
Exception in thread "main" java.lang.NoClassDefFoundError: Test
因为类的名称不是Test
,而是testing
。测试即使classpath设置为当前目录。
如果我给java命令会发生什么测试。测试从C:\project\testing\它将再次不运行并给出错误?
Exception in thread "main" java.lang.NoClassDefFoundError: testing/Test
因为现在它正在包测试中查找名为Test的类,从当前目录“.
”开始,但找不到它,因为在路径“C:\project\testing\”之后没有名为“testing”的目录。
要成功运行它,您需要返回目录C:\project,然后立即运行
C:\project>java testing.Test
它会成功运行,因为类路径问题我更喜欢使用Eclipse而不是从命令提示符运行Java程序。
Java中与classpath相关的错误
如果您使用的是Java,那么您一定遇到过一些与Java类路径classpath相关的错误和异常,与Java classpath相关的两个最常见的问题是ClassNotFoundException和NoClassDefFoundError。我已经看到许多Java开发人员试图通过反复试验来解决这个错误;他们只是没有深入了解Java类路径相关错误的原因。他们常常误解这两个错误也是一样的。
以下是这些Java类路径错误的原因:
ClassNotFoundException
是一个异常,当Java程序在运行时动态地尝试加载Java类,但在类路径上找不到相应的类文件时,将抛出该异常。这里有两个关键字“动态”和“运行时”。这些错误的一个典型例子是您试图使用Class.forname(“driver name”)
并以java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
。因此,当Java试图使用forName()
或ClassLoader的loadClass()
方法加载类时,这个错误就出现了。需要注意的关键是,在编译时不会检查Java类路径上是否存在该类。因此,即使这些类不在Java类路径上,您的程序也将成功编译,并且只有在尝试运行时才会失败。
另一方面,NoClassDefFoundError
是一个错误,比ClassNotFoundException
更重要,后者是一个异常,并且是可恢复的。NoClassDefFoundError
是在编译时Java类路径classpath中存在特定类,但在运行时不可用时出现的。此错误的一个典型示例是使用log4j.jar进行日志记录,但在运行时忘记在java的类路径中包含log4j.jar。这里的关键字是,类在编译时存在,但在运行时不可用。这通常是由于对特定类的任何方法调用而发生的,该类是库的一部分,在Java的类路径中不可用。这也是常见的面试问题
“Java中NoClassDefFoundError和ClassNotFoundException的区别是什么?”或者“当您在Java中看到NoClassDefFoundError和ClassNotFoundException异常时怎么办?”。
NoClassDefFoundError
也可能是由于其他各种原因造成的,比如静态初始值设定项失败或者类在J2EE环境中对类加载器不可见。
Java classpath 总结
1. Java中的Classpath是Java虚拟机在类加载过程中用来定位或查找Java中的类文件的环境变量。
2. 在运行应用程序时,通过提供JVM命令行选项-cp
或-Classpath
,可以覆盖由环境变量Classpath定义的Java中Classpath的值。
3. 如果Java类路径中存在两个同名的类,那么Java虚拟机将选取类路径中较早的类。
4. 默认情况下,Java中的类路径指向以“.
”表示的当前目录,它将只在当前目录中查找任何类。
5. 当您使用-jar
命令行选项将程序作为可执行jar运行时,Java CLASSPATH环境变量将被忽略,-cp
和-classpath
开关也将被忽略,在这种情况下,您可以在META-INF/MANIFEST.MF中设置Java CLASSPATH属性创建文件。
6. 在Linux的Unix中,Java classpath包含带有冒号的目录名:在Windows中Java类路径将是分号”;
“,而如果在Manifest文件中定义Java类路径,这些将是空格分隔的。
7. 您可以通过查看以下系统属性来检查应用程序中java classpath的值"java.class.path
" System.getProperty("java.class.path")
类路径属性用于在清单文件中包含类路径。另外,请确保清单文件必须以空行(回车或换行)结尾,下面是清单文件中java类路径的示例。
Main-Class: com.classpathexample.Demo_Classpath
Class-Path: lib/tibco.jar lib/log4j.jar
8. 同样重要的是要注意,清单文件中指定的路径不是绝对路径,而是相对于应用程序jar的路径。例如,在上面的示例中,如果应用程序jar文件位于C:\test目录中,则必须在test和tibco.jar公司还有里面的log4j.jar。
9. ClassNotFoundException
是一个异常,当Java程序在运行时动态地尝试加载一个特定的类,但由于Class.forName()
或loadClass()
方法调用。
10. NoClassDefFoundError
出现在编译时Java类路径中存在特定类,但在Java类路径的运行时不可用时。
除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/1498.html
暂无评论