classpath是java编译器(command:javac)和JVM(命令:java)查找的位置,以查找应用程序引用的类。 应用程序引用另一个类是什么意思?在简单的话就意味着某个地方使用这个类在其代码:
例子:
public class MyClass{
private AnotherClass referenceToAnotherClass;
.....
}
当您尝试进行编译器(javac)编译器将需要AnotherClass类。当您尝试运行您的应用程序时也是如此:JVM将需要AnotherClass类。 为了找到这个类,javac和JVM在一个特定的(一组)地方查找。这些地方是由类路径指定的,它在linux上是一个以冒号分隔的目录列表(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您classpaht:
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中和在某处末尾添加该线;
但是,类路径会经常发生变化,因此您可能希望将类路径设置为您需要经常使用的核心dirs集,然后每次只需要该会话时扩展该类路径。像这样:
export CLASSPATH=$CLASSPATH:"new directories according to your current needs"
[包括Java类路径中目录中的所有jar文件]的可能的副本(https://stackoverflow.com/questions/219585/including-all-the-jars-in-a-directory -within-the-java-classpath) – Stewart 2017-10-04 11:50:28