Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“线程中的异常”;“主要”;java.lang.NoClassDefFoundError:HelloWorld_Java_Linux_Compilation_Terminal - Fatal编程技术网

“线程中的异常”;“主要”;java.lang.NoClassDefFoundError:HelloWorld

“线程中的异常”;“主要”;java.lang.NoClassDefFoundError:HelloWorld,java,linux,compilation,terminal,Java,Linux,Compilation,Terminal,我已经为此工作了大约一个小时,翻阅了stackoverflow上的Q&a,但我还没有找到解决问题的方案。如果这是一个重复的问题,我很抱歉,但我找不到任何重复的问题和解决我具体问题的答案 我第一次尝试从terminal编写和编译java程序(到目前为止,我一直在使用Eclipse for java和VIM进行其他操作,但我觉得现在是完全切换到VIM的时候了)。以下是我当前的HelloWorld代码: package main; public class HelloWorld { publ

我已经为此工作了大约一个小时,翻阅了stackoverflow上的Q&a,但我还没有找到解决问题的方案。如果这是一个重复的问题,我很抱歉,但我找不到任何重复的问题和解决我具体问题的答案

我第一次尝试从terminal编写和编译java程序(到目前为止,我一直在使用Eclipse for java和VIM进行其他操作,但我觉得现在是完全切换到VIM的时候了)。以下是我当前的HelloWorld代码:

package main;

public class HelloWorld {
    public static void main(String args[]) {
        System.out.println("Hello World!");
    }
}
我使用以下命令编译和运行(指定类路径以确保这不是问题):

这会给我以下错误消息:

Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld (wrong name: main/HelloWorld)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
    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:423)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:480)
Error: Could not find or load main class Foo
我知道它正在查看文件HelloWorld.class并试图访问类HelloWorld,因为如果我将run命令更改为:

java -cp "./" Foo
我收到一条完全不同的错误消息:

Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld (wrong name: main/HelloWorld)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
    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:423)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:480)
Error: Could not find or load main class Foo
我已经尝试了几十页的疑难解答,但发现不足,包括以下内容:

java-version
产生:

java version "1.7.0_07"
Java(TM) SE Runtime Environment (build 1.7.0_07-b10)
Java HotSpot(TM) Client VM (build 23.3-b01, mixed mode)
Linux will-Latitude-D620 2.6.38-8-generic #42-Ubuntu SMP Mon Apr 11 03:31:50 UTC 2011 i686 i686 i386 GNU/Linux
我的操作系统是LinuxMint,
uname-a
产生:

java version "1.7.0_07"
Java(TM) SE Runtime Environment (build 1.7.0_07-b10)
Java HotSpot(TM) Client VM (build 23.3-b01, mixed mode)
Linux will-Latitude-D620 2.6.38-8-generic #42-Ubuntu SMP Mon Apr 11 03:31:50 UTC 2011 i686 i686 i386 GNU/Linux
问题: 基本上,线程“main”
java.lang.NoClassDefFoundError
中的异常:

意味着在类路径中找不到您试图运行的类

解决方案:您需要将包含此类的类或
.jar
文件添加到java类路径中。从命令行运行java类时,需要添加点(.)

进入类路径,它告诉JVM在实际目录中搜索类

如果您正在从.jar文件运行类,则需要将此jar文件添加到类路径中:

java org.somepackage.SomeClass -cp myJarWithSomeClass.jar

您已将类放在名为“main”的包中,但您试图将其视为不在包中。既然你把
包主
在源文件的顶部,需要将HelloWorld.java放入./main,然后运行
javac./main/HelloWorld.java
,然后运行
java-cp。main.HelloWorld

这些命令将为您提供您试图构建的工作示例:

mkdir main
echo 'package main; public class HelloWorld { public static void main(String... args) { System.out.println("Hello World"); } }' > main/HelloWorld.java
javac main/HelloWorld.java
java -cp . main.HelloWorld
主包装

这意味着您的类驻留在
main
包中,其规范名称为
main.HelloWorld

Java要求包名也应该镜像到目录结构中。这意味着:

  • 您的
    HelloWorld.java
    文件应该位于名为
    main
  • 您应该从包含
    main
    的目录执行
    javac
    java
    ,而不是从
    main
    本身执行
  • 类路径应该包含
    main
    目录所在的目录,而不是
    main
    本身
  • java
    需要执行类的规范名称,因此
    main.HelloWorld
  • 因此,总结一下:

    您应该有类似于
    myproject/main/HelloWorld.java

    myproject
    ,运行
    javacmain/HelloWorld.java


    myproject
    ,运行
    java-cp./main.HelloWorld

    ,作为初学者,您可能会遇到一个非常类似的场景,其中错误输出是相同的。您尝试编译并运行您的简单程序(没有任何包集),您可以执行以下操作:

    javac HelloWorld.java
    java HelloWorld.class
    
    这将给您相同的java.lang.NoClassDefFoundError,因为java认为HelloWorld是您的,而class则是您的类名。要解决它,只需使用

    javac HelloWorld.java
    java HelloWorld
    

    查看Java页面-

    我以为它只是javac-cp。HelloWorld.java,我不认为需要“/”会产生相同的错误消息,不管是否有“/”和javac-classpath。HelloWorld.java不起作用,我建议检查java是否在类路径上。这里要指出的重要一点是,实际上他没有指定完全限定的类名(在他的例子中是
    main.HelloWorld
    ),这不是我用
    javac-cp./“HelloWorld.java
    java-cp./”所做的吗HelloWorld
    ?如果我将run命令更改为
    java-cp。main/HelloWorld
    我发现
    错误:无法找到或加载主类main.HelloWorld
    错误。此处的编译命令无效。它给出了一个“未找到文件”错误。我只能建议您输入了错误的内容,因为这就是它的工作原理。我添加了一些简单的命令,可以完成您正在尝试的操作。谢谢您,先生!你完全正确,我的问题是文件系统!来自eclipse时,我没有完全理解类路径,java文件位于基本目录中。一旦我创建了一个主文件夹并将源文件移到这个文件夹中,问题就解决了!谢谢,这也解决了我的问题。再加上,从Windows切换到Linux的人可能会遇到这个问题(?),因为我在Windows 7上很好,而转到Ubuntu时出现了这个错误(我想)。这应该给我一个名为“myproject”文件夹中的“main.class”或“main”文件夹中的“HelloWorld.class”的文件文件夹?@alex在
    main
    文件夹中有一个名为
    HelloWorld.class
    的文件。