我已经多年没有直接从命令行运行非jar java程序,但是现在我需要它我遇到了一些问题,程序在类路径中找不到所需的库 为了重现我的问题,我创建了以下内容,这里是java文件的代码:
package launcher;
import org.joda.time.DateMidnight;
public class Launcher {
public static void main(String... args){
DateMidnight mid=new DateMidnight();
System.out.println(mid.dayOfMonth().toInterval());
}
}
在我的用户"目前的目录下,在mac"上,我只有以下jar:joda-time-2.0.jar
和上面的.java文件。
我想编译并运行它,所以我这样做:
javac -d . -cp joda-time-2.0.jar Launcher.java
我现在在我当前的文件夹中有以下内容:
Launcher.java joda-time-2.0.jar launcher
launcher
是包含Launcher.class的目录
现在,如果我运行java -cp . launcher.Launcher
我明白了:
Exception in thread "main" java.lang.NoClassDefFoundError: org/joda/time/DateMidnight
at launcher.Launcher.main(Launcher.java:8)
引起:java.lang.ClassNotFoundException:org.joda.time.DateMidnight
我告诉vm编译的joda库在哪里,这里有什么问题?
答案 0 :(得分:0)
您在javac
来电中加入了JAR。但是您只使用类路径中的当前目录调用java
。
试试这个:
java -cp .:joda-time-2.0.jar launcher.Launcher
答案 1 :(得分:0)
Jars被视为单独的位置/目录,因此.
不会代表它们。在编译和运行代码时,需要将它们显式添加到类路径中。使用像
java -cp .;joda-time-2.0.jar launcher.Launcher
或
java -cp .:joda-time-2.0.jar launcher.Launcher
取决于您使用的操作系统。
如果您想要添加更多的罐子,也可以使用*.jar
通配符。