21

好的,我对 linux 和命令行很陌生,对 java 也很陌生。我得到了一份构建 Java 程序的实习机会。我终于在我的机器(windows)上完成了它,现在我必须将它迁移到linux机器上进行测试,然后让它作为可执行文件运行。我在 linux 和理解类路径方面做了很多阅读和研究,但仍然很难完全理解。它只是还没有为我点击。任何人都可以使用示例以简化的方式解释类路径的目的吗?对我来说最令人困惑的方面之一实际上是定义 jar 的物理路径。我是从 usr 开始还是只需要从 jvm 文件夹开始?如果重要的话,我的 java 程序不在 jvm 文件夹中。任何人都可以为我解释一下吗?

编辑:非常感谢你们的帮助,我不能说我完全清楚,但我对我的情况的理解要好得多。

4

5 回答 5

21

假设您有多个 jar 文件 a.jar、b.jar 和 c.jar。要在编译时将它们添加到类路径中,您需要做

$javac -cp .:a.jar:b.jar:c.jar HelloWorld.java

跑做

$java -cp .:a.jar:b.jar:c.jar HelloWorld
于 2014-01-03T06:39:57.840 回答
13

你使用-classpath论据。您可以使用相对路径或绝对路径。这意味着您可以使用相对于当前目录的路径,或者您可以使用从 root 开始的绝对路径/

例子:

bash$ java -classpath path/to/jar/file MyMainClass

在此示例中,该main函数位于MyMainClass并将包含在 jar 文件中的某处。

对于编译,您需要使用javac

例子:

bash$ javac -classpath path/to/jar/file MyMainClass.java

您还可以通过环境变量指定类路径,请遵循以下示例

bash$ export CLASSPATH="path/to/jar/file:path/tojar/file2"
bash$ javac MyMainClass.java

对于任何通常复杂的 java 项目,您应该查找名为的 ant 脚本build.xml

于 2012-07-12T20:10:46.477 回答
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

通常,类以称为 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" 
于 2012-07-12T20:12:59.543 回答
1

对于 linux 用户,您应该了解以下内容:

  1. $CLASSPATH 特别是 Java 用来查看多个目录以查找脚本所需的所有不同类(除非您使用 -cp 覆盖明确告诉它)。使用 -cp (--classpath) 需要您手动跟踪所有目录,并在每次运行程序时复制粘贴该行(不推荐 IMO)。

  2. 冒号 (":") 字符分隔不同的目录。只有一个 $CLASSPATH 并且其中包含所有目录。因此,当您运行“export CLASSPATH=....”时,您希望包含当前值“$CLASSPATH”以附加到它。例如:

    export CLASSPATH=.
    export CLASSPATH=$CLASSPATH:/usr/share/java/mysql-connector-java-5.1.12.jar
    

    在上面的第一行中,您只用一个简单的“点”开始 CLASSPATH,它是您当前工作目录的路径。这样,每当您运行 java 时,它都会在当前工作目录(您所在的目录)中查找类。在上面的第二行中,$CLASSPATH 获取您之前输入的值 (.) 并将路径附加到 mysql 驱动程序。现在,java 将为您的类查找驱动程序和。

  3. echo $CLASSPATH
    

    非常方便,它返回的内容应该像冒号分隔的列表一样,您希望 java 查找运行脚本所需的所有目录。

  4. Tomcat 不使用 CLASSPATH。在此处阅读如何处理:https ://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html

于 2020-01-20T17:57:14.733 回答
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)

于 2018-01-15T07:01:19.423 回答