2012-07-12 134 views
11

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

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

+0

[包括Java类路径中目录中的所有jar文件]的可能的副本(https://stackoverflow.com/questions/219585/including-all-the-jars-in-a-directory -within-the-java-classpath) – Stewart 2017-10-04 11:50:28

回答

10

您使用-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的蚂蚁脚本

+1

因此,如果我正在编译的java程序被命名为SnortMonitor,那么你的示例会更改为: bash $ java -classpath path/to/jar/file SnortMonitor – 2012-07-12 20:22:34

+1

编译你需要啊调用'javac'而不是'java',但仍然使用-classpath和源目录。 – Petriborg 2012-07-12 20:24:19

+0

谢谢你的帮助,但可以请你更具体一点吗?也许这是因为我缺乏理解。当我编写“javac SnortMonitor.java”时,我得到一个错误列表,我知道它是因为我需要从一个名为jsendnsca的目录中包含2个jar文件。每次编译和运行程序时,是否需要将这些jar包含在classpath中? – 2012-07-12 20:30:49

5

classpath是java编译器(command:javac)和JVM(命令:java)查找的位置,以查找应用程序引用的类。 应用程序引用另一个类是什么意思?在简单的话就意味着某个地方使用这个类在其代码:

例子:

public class MyClass{ 
    private AnotherClass referenceToAnotherClass; 
    ..... 
} 

当您尝试进行编译器(javac)编译器将需要AnotherClass类。当您尝试运行您的应用程序时也是如此:JVM将需要AnotherClass类。 为了找到这个类,javac和JVM在一个特定的(一组)地方查找。这些地方是由类路径指定的,它在linux上是一个以冒号分隔的目录列表(javac/JVM在需要时用来查找AnotherClass的目录)。

所以为了编译你的类然后运行它,你应该确保classpath包含包含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您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" 
+0

每次我想编译并运行时,我必须定义这些类路径吗? – 2012-07-12 20:23:23

+0

我编辑了我的答案 – Razvan 2012-07-12 20:41:31

16

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

步骤1.

vi ~/.bashrc 

步骤2.追加此行的最后一个:

export CLASSPATH=$CLASSPATH:/home/abc/lib/*; (Assuming the jars are stored in /home/abc/lib) 

第3步。

source ~/.bashrc 

这些步骤之后,直接complile并运行您的程序(例如, javac xyz.java)

相关问题