类路径是Java编译器(命令:javac)和JVM(命令:java)查找应用程序引用的类的地方。应用程序引用另一个类是什么意思?简单来说,就是在其代码中使用该类:
例如:
public class MyClass{
private AnotherClass referenceToAnotherClass;
.....
}
当您尝试编译此代码(javac)时,编译器将需要AnotherClass类。同样地,当您尝试运行应用程序时,JVM也会需要AnotherClass类。为了找到该类,javac和JVM会在特定的位置查找,这些位置由classpath指定。在Linux上,classpath是一个由冒号分隔的目录列表,表示javac/JVM应该查找以定位需要的AnotherClass类的目录。因此,为了编译并运行您的类,您应确保classpath包含包含AnotherClass类的目录。然后,您可以像这样调用它:
javac -classpath "dir1;dir2;path/to/AnotherClass;...;dirN" MyClass.java //to compile it
java -classpath "dir1;dir2;path/to/AnotherClass;...;dirN" MyClass //to run it
通常类是以名为jar文件/库的“包”形式提供的。在这种情况下,您必须确保包含AnotherClass类的jar文件在您的类路径上:
javac -classpath "dir1;dir2;path/to/jar/containing/AnotherClass;...;dirN" MyClass.java //to compile it
java -classpath ".;dir1;dir2;path/to/jar/containing/AnotherClass;...;dirN" MyClass //to run it
在上面的示例中,您可以看到如何编译位于工作目录中的类(MyClass.java),然后运行已编译的类(注意类路径开头的“。”表示当前目录)。此目录也必须添加到类路径中。否则,JVM 将无法找到它。
如果您的类在 jar 文件中,正如您在问题中指定的那样,则必须确保该 jar 文件与其余所需目录一起位于类路径中。
例如:
java -classpath ".;dir1;dir2;path/to/jar/containing/AnotherClass;path/to/MyClass/jar...;dirN" MyClass //to run it
或者更一般地(假设有一些包层次结构):
java -classpath ".;dir1;dir2;path/to/jar/containing/AnotherClass;path/to/MyClass/jar...;dirN" package.subpackage.MyClass
为了避免每次运行应用程序都需要设置类路径,您可以定义一个名为CLASSPATH的环境变量。
在Linux中,在命令提示符下:
export CLASSPATH="dir1;dir2;path/to/jar/containing/AnotherClass;...;dirN"
或者编辑 ~/.bashrc,将以下这行代码添加到文件末尾;
然而,类路径经常会发生变化,所以您可能希望将classpath设置为一组核心目录,您需要频繁使用,然后每次只需要为该会话扩展classpath。像这样:
export CLASSPATH=$CLASSPATH:"new directories according to your current needs"