java中的ClassNotFound异常

时间:2014-05-15 07:01:48

标签: java

我有一个使用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));
           }
}

1 个答案:

答案 0 :(得分:1)

javacjava命令稍微不同地处理类路径。具体来说,由于您将文件列表传递给要编译的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可能很棘手,应该小心执行。