我在d:\myclass\下面有一个jar包,里面是com/Hello.class,Hello里面有个say()函数。
我在c:\下面建立了包org,包下有一个文件Friend.java(路径是:c:\org\Friend.java),内容如下:package org;
import com.*;public class Friend{
public static void main(String[] args){
Hello h = new Hello();
h.say();
}
}
我在c:\下编译成功:c:\>javac -classpath d:\myClass\myclass.jar org\Friend.java
可是运行的时候:c:\>java -classpath d:\myClass\myclass.jar org.Friend
就会出现:Exception in thread "main" java.lang.NoClassDefFoundError: org/Friend
Caused by: java.lang.ClassNotFoundException: org.Friend
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Could not find the main class: org.Friend.  Program will exit.这个是为什么呀

解决方案 »

  1.   

    ClassNotFoundException :类找不到。
      

  2.   

    是不是Friend.java没有编译啊?
      

  3.   

    进入C盘org目录下
    再执行c:\>java -classpath d:\myClass\myclass.jar Friend 试试
      

  4.   

    确认目录结构是否正确,文件存在但所有的子目录可能不正确。
    下面解释一下 classpath 的意思。类路径使用的是以某个目录或jar 文件为根的,以包名为相对路径的方式工作的,包名是名字空间,映射到磁盘文件系统就是子目录或 zip 包内相对目录的。比如:-classpath D:/classes;D:/abc.jar org.Friend这表示,希望的目录结构是:
    -D:/classes
    -D:/classes/org/Friend.class
    -D:abc.jar!/org/Friend.class (zip 包里面的有个子目录 org)对于 java 来说就是要用一个统一的相对路径来描述名字空间,而前面的“根”是相对于操作系统来说的。因为 java 要解决跨平台的问题,前面的根就不能写死在代码中,而后面的名字空间则是抽象的,由 JVM 来完成映射。那么在工作时,类的查找就是在一个有很多树根的森林中查找一个资源。
      

  5.   

    在这里java 命令需要加上当前路径来寻找 org.FriendC:\>java -cp .;d:\myClass\myclass.jar org.Friend