NoClassDefFoundError Java(名称错误)

NoClassDefFoundError Java(名称错误),java,exception,packages,Java,Exception,Packages,我在这里看到过类似的问题,但我找不到一个适合我的情况的问题,如果这是一个过时的问题,那么很抱歉 我有一个类p,它是位于~/JavaClasses/myname/utils中的包myname.utils的一部分。我有另一个类Printing,它没有声明为任何包的一部分,但位于~/JavaClasses/myname/practice中。类打印导入类P。这两个类都可以从~/JavaClasses目录编译。但是,当我尝试像这样运行编译类打印时 ~/JavaClasses$ java myname/pr

我在这里看到过类似的问题,但我找不到一个适合我的情况的问题,如果这是一个过时的问题,那么很抱歉

我有一个类p,它是位于~/JavaClasses/myname/utils中的包myname.utils的一部分。我有另一个类Printing,它没有声明为任何包的一部分,但位于~/JavaClasses/myname/practice中。类打印导入类P。这两个类都可以从~/JavaClasses目录编译。但是,当我尝试像这样运行编译类打印时

~/JavaClasses$ java myname/practice/Printing
我得到以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: myname/practice/Printing (wrong name: Printing)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)

这是因为您没有使用包名称。是当java给出错误并且找不到类的包名时,它使用
/
。但是,这些应替换为
。因为包名的各个部分总是用句号分隔,而不是用斜杠分隔。所以如果我有一个包
foo.bee
。然后当我想跑的时候

javafoo.bee

它将运行当前和所有,但如果我尝试

javafoo/bee

它会抱怨类not def错误。

该错误与myname.utils.p类无关,但之所以会发生,是因为打印类没有包定义。这意味着类的真正全名是Printing,但如果从~/JavaClasses文件夹启动java命令,则确切地说Printing类的全名是myname.practice.Printing

您有两个选项可以解决此问题:

1) 在打印类中声明myname.practice包(我建议使用此包)

2) 将myname.practice文件夹添加到类路径,方法如下:

~/JavaClasses$java-cp myname.practice:。印刷
表示当前目录,这是必需的,因此您仍然可以从~/JavaClasses文件夹中引用myname.utils.p


旁注。在编译时没有错误,因为在启动javac时可能没有指定类路径,所以使用了当前文件夹。这样,每个类都可以毫无问题地引用myname.utils.P,即使是通过打印也是如此。

它应该是
java myname.practice.Printing
,假设它位于名为
myname.practice
的包中,并在开始处添加一个
package
语句,将其标记为属于您的包。那么,一切都应该很好。你有这方面的源代码吗??