类路径是 java 编译器(命令:javac)和 JVM(命令:java)查找应用程序引用的类的位置。应用程序引用另一个类意味着什么?简而言之,这意味着在其代码的某处使用该类:
例子:
public class MyClass{
private AnotherClass referenceToAnotherClass;
.....
}
当您尝试编译此 (javac) 时,编译器将需要 AnotherClass 类。当您尝试运行您的应用程序时也是如此:JVM 将需要 AnotherClass 类。为了找到这个类,javac 和 JVM 在一个特定的(一组)地方寻找。这些位置由类路径指定,在 linux 上是一个冒号分隔的目录列表(javac/JVM 应该查找的目录,以便在需要时找到 AnotherClass)。
所以为了编译你的类然后运行它,你应该确保类路径包含包含 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 //to run it
为了避免每次要运行应用程序时都设置类路径,您可以定义一个名为 CLASSPATH 的环境变量。
在 linux 中,在命令提示符下:
export CLASSPATH="dir1;dir2;path/to/jar/containing/AnotherClass;...;dirN"
或编辑 ~/.bashrc 并在末尾添加此行;
但是,类路径会经常更改,因此,您可能希望将类路径设置为您经常需要的核心目录集,然后在每次只需要该会话时扩展类路径。像这样:
export CLASSPATH=$CLASSPATH:"new directories according to your current needs"