我有一个使用joda-time-6.jar的简单Java程序。我将这个jar保存在CLASSPATH中,我可以编译这个程序。
但是当我尝试使用来自.class所在的同一目录的java命令运行它时,我得到了ClassNotFoundException。
Exception in thread "main" java.lang.NoClassDefFoundError: Fmo/class
Caused by: java.lang.ClassNotFoundException: Fmo.class
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Could not find the main class: Fmo.class. Program will exit
有人可以指出
import org.joda.time.LocalDate;
import org.joda.time.*;
public class Fmo {
public static LocalDate getNthSundayOfMonth(final int n, final int month, final int year) {
final LocalDate firstSunday = new LocalDate(year, month, 1).withDayOfWeek(DateTimeConstants.SUNDAY);
if (n > 1) {
final LocalDate nThSunday = firstSunday.plusWeeks(n - 1);
final LocalDate lastDayInMonth = firstSunday.dayOfMonth().withMaximumValue();
if (nThSunday.isAfter(lastDayInMonth)) {
throw new IllegalArgumentException("There is no " + n + "th Sunday in this month!");
}
return nThSunday;
}
return firstSunday;
}
public static void main(final String[] args) {
System.out.println(getNthSundayOfMonth(1, DateTimeConstants.MAY, 2014));
System.out.println(getNthSundayOfMonth(2, DateTimeConstants.MAY, 2014));
System.out.println(getNthSundayOfMonth(3, DateTimeConstants.MAY, 2014));
System.out.println(getNthSundayOfMonth(4, DateTimeConstants.MAY, 2014));
System.out.println(getNthSundayOfMonth(5, DateTimeConstants.MAY, 2014));
}
}
答案 0 :(得分:1)
javac
和java
命令稍微不同地处理类路径。具体来说,由于您将文件列表传递给要编译的javac
,因此您只需要包含所需库的位置以使编译器工作。另一方面,java
期望您的类路径显式包含.
,以便在当前目录中运行类文件。
这是一个例子(在Cygwin中运行):
$ ls
JodaTest.java joda-time-2.2.jar
$ cat JodaTest.java
import org.joda.time.LocalDate;
public class JodaTest {
public static void main(String[] args) {
System.out.println(new LocalDate());
}
}
$ javac -cp joda-time-2.2.jar JodaTest.java
$ java -cp '.;joda-time-2.2.jar' JodaTest
2014-05-15
请注意,您可以使用'.;joda-time-2.2.jar'
作为两个命令的类路径,但仅针对后者,.
是必需的。您可能还需要在类路径中使用:
而不是;
,如果您不确定,请参阅File.pathSeparatorChar
了解更多信息。
您可以轻松使用CLASSPATH
变量,而不是-cp
标志,但是this is not recommended:
指定类路径的首选方法是使用-cp命令行开关。这允许为每个应用程序单独设置CLASSPATH,而不会影响其他应用程序。 设置CLASSPATH可能很棘手,应该小心执行。