繁体   English   中英

如何在linux中的类路径中添加多个jar文件

[英]How to add multiple jar files in classpath in linux

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

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

假设您有多个 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

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

例子:

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 项目,您应该寻找名为build.xml的 ant 脚本

类路径是 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" 

对于 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

步骤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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM