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

exi*_*t_1 15 java linux jar classpath

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

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

noP*_*oPE 16

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

$javac -cp .:a.jar:b.jar:c.jar HelloWorld.java
Run Code Online (Sandbox Code Playgroud)

跑去做

$java -cp .:a.jar:b.jar:c.jar HelloWorld
Run Code Online (Sandbox Code Playgroud)


Pet*_*org 12

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

例:

bash$ java -classpath path/to/jar/file MyMainClass
Run Code Online (Sandbox Code Playgroud)

在此示例中,main函数位于MyMainClassjar文件中并且将包含在jar文件中的某个位置.

对于编译,您需要使用 javac

例:

bash$ javac -classpath path/to/jar/file MyMainClass.java
Run Code Online (Sandbox Code Playgroud)

您还可以通过环境变量指定类路径,请按照以下示例操作:

bash$ export CLASSPATH="path/to/jar/file:path/tojar/file2"
bash$ javac MyMainClass.java
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,那是正确的Pat - 只要说`javac -classpath jsendnsca.jar:otherjar.jar SnortMonitor.java` (2认同)

Raz*_*van 5

类路径是java编译器(命令:javac)和JVM(命令:java)查找的位置,以便查找应用程序引用的类.应用程序引用另一个类意味着什么?简单来说,它意味着在代码中的某个地方使用该类:

例:

public class MyClass{
    private AnotherClass referenceToAnotherClass;
    .....
}
Run Code Online (Sandbox Code Playgroud)

当您尝试编译此(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
Run Code Online (Sandbox Code Playgroud)

通常类以"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
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,您可以看到如何编译位于工作目录中的类(MyClass.java),然后运行已编译的类(请注意类路径开头的".",它代表当前目录).此目录也必须添加到类路径中.否则,JVM将无法找到它.

如果您的类在jar文件中,正如您在问题中指定的那样,那么您必须确保jar也在类路径中,以及其他所需目录.

例:

java -classpath ".;dir1;dir2;path/to/jar/containing/AnotherClass;path/to/MyClass/jar...;dirN" MyClass //to run it
Run Code Online (Sandbox Code Playgroud)

或更一般(假设一些包层次结构):

java -classpath ".;dir1;dir2;path/to/jar/containing/AnotherClass;path/to/MyClass/jar...;dirN" package.subpackage.MyClass //to run it
Run Code Online (Sandbox Code Playgroud)

为了避免每次要运行应用程序时设置类路径,您可以定义一个名为CLASSPATH的环境变量.

在linux中,在命令提示符下:

export CLASSPATH="dir1;dir2;path/to/jar/containing/AnotherClass;...;dirN" 
Run Code Online (Sandbox Code Playgroud)

或编辑〜/ .bashrc并在最后的某处添加此行;

但是,类路径会经常更改,因此,您可能希望将类路径设置为一组核心dirs,这是您经常需要的,然后每次只需要该会话时扩展类路径.像这样:

export CLASSPATH=$CLASSPATH:"new directories according to your current needs" 
Run Code Online (Sandbox Code Playgroud)