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
函数位于MyMainClass
jar文件中并且将包含在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
类路径是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)