好的,我对linux和命令行都很陌生,而且对java来说还是新手。我有一个实习建立一个java程序。我终于在我的机器(Windows)上完成了它,现在我必须将它迁移到linux机器进行测试,然后让它作为可执行文件运行。我已经做了很多关于linux和阅读类路径的阅读和研究,但仍然很难完全理解。它只是没有点击我。任何人都可以使用示例以简化的方式解释类路径的目的吗?对我来说最令人困惑的一个方面实际上是定义jar的物理路径。我是从usr开始的,还是只需要从jvm文件夹开始?如果重要,我的java程序不在jvm文件夹中。任何人都能为我解释一下吗?
编辑:非常感谢你们的帮助,我不能说我完全清楚,但我对情况的了解要好得多。答案 0 :(得分:16)
假设您有多个jar文件a.jar,b.jar和c.jar。要在编译时将它们添加到类路径,您需要执行
$javac -cp .:a.jar:b.jar:c.jar HelloWorld.java
运行do
$java -cp .:a.jar:b.jar:c.jar HelloWorld
答案 1 :(得分:12)
您使用-classpath
参数。您可以使用相对路径或绝对路径。这意味着您可以使用相对于当前目录的路径,或者您可以使用从根/
开始的绝对路径。
示例:
bash$ java -classpath path/to/jar/file MyMainClass
在此示例中,main
函数位于MyMainClass
中,并将包含在jar文件中的某个位置。
要进行编译,您需要使用javac
示例:
bash$ javac -classpath path/to/jar/file MyMainClass.java
您还可以通过环境变量指定类路径,按照this example:
bash$ export CLASSPATH="path/to/jar/file:path/tojar/file2"
bash$ javac MyMainClass.java
对于任何通常很复杂的java项目,您应该查找名为build.xml
答案 2 :(得分:5)
类路径是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
通常,类以“bundle”的形式出现,称为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"
答案 3 :(得分:0)
第1步。
vi ~/.bashrc
步骤2.将此行添加到最后一行:
export CLASSPATH=$CLASSPATH:/home/abc/lib/*; (Assuming the jars are stored in /home/abc/lib)
第3步。
source ~/.bashrc
在这些步骤之后直接编译并运行程序(例如javac xyz.java)
答案 4 :(得分:0)
对于linux用户,您应该了解以下内容:
$ CLASSPATH是Java用于遍历多个目录以查找其脚本所需的所有不同类的工具(除非您另外使用-cp覆盖明确地告诉了它)。使用-cp(--classpath)要求您手动跟踪所有目录,并在每次运行该程序时复制粘贴该行(不建议使用IMO)。
冒号(“:”)字符分隔不同的目录。只有一个$ CLASSPATH,并且其中包含所有目录。因此,当您运行“ export CLASSPATH = ....”时,要包括当前值“ $ CLASSPATH”以便附加到该值。例如:
export CLASSPATH=.
export CLASSPATH=$CLASSPATH:/usr/share/java/mysql-connector-java-5.1.12.jar
在上面的第一行中,您仅以简单的“点”开始CLASSPATH,这是当前工作目录的路径。这样,每当您运行Java时,它将在当前工作目录(您所在的目录)中查找类。在上面的第二行中,$ CLASSPATH获取您先前输入的值(。),并将路径附加到mysql目录。现在,java将查找驱动程序和类。
echo $CLASSPATH
非常方便,它返回的内容应该像用冒号分隔的所有目录列表一样,以便您希望Java查找运行脚本所需的所有内容。
Tomcat不使用CLASSPATH。在此处了解如何处理:https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html