如何在linux中的classpath中添加多个jar文件

时间:2012-07-12 19:58:47

标签: java linux jar classpath

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

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

5 个答案:

答案 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

的ant脚本

答案 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用户,您应该了解以下内容:

  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