He estado trabajando en esto durante aproximadamente una hora y el pulgar a través de P&Como en stackoverflow pero no he encontrado una posible solución a mi problema. Lo siento si esto es un duplicado, pero no podía encontrar ningún duplicado pregunta con una respuesta que resolver mi problema específico.

Estoy tratando de escribir y compilar un programa java desde la terminal por primera vez (hasta este punto he estado usando Eclipse para java y VIM para todo lo demás, pero creo que es tiempo de cambiar totalmente a VIM). Aquí está mi actual HelloWorld código:

package main;

public class HelloWorld {
    public static void main(String args[]) {
        System.out.println("Hello World!");
    }
}

Yo compile y ejecute el uso de los comandos siguientes (especificar la ruta de clases para asegurarse de que no es el problema):

javac -cp "./" HelloWorld.java
java -cp "./" HelloWorld

Esto me da el siguiente mensaje de error:

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)

Sé que está viendo el archivo HelloWorld.class y tratando de acceder a la clase HelloWorld, porque si yo cambio el comando ejecutar para:

java -cp "./" Foo

Puedo obtener una totalmente diferente mensaje de error:

Error: Could not find or load main class Foo

He intentado varias docenas de páginas de la pena de solución de problemas y se quedan cortos, incluyendo las siguientes:

Excepción en el thread «main» java.lang.NoSuchMethodError: principal

http://introcs.cs.princeton.edu/java/15inout/mac-cmd.html

java -version rendimientos:

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)

Mi sistema operativo es LinuxMint y uname -a rendimientos:

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
pensé que sólo sería javac -cp . HelloWorld.java, no cree que el «./» era necesario
Da el mismo mensaje de error exacto, con o sin el ‘/’
y javac -classpath . HelloWorld.java no funciona, yo sugeriría comprobar si java está en el classpath

OriginalEl autor retrohacker | 2013-01-03

4 Comentarios

  1. 21

    paquete principal;

    Esto significa que la clase reside en el main paquete, y su nombre canónico es main.HelloWorld.

    Java requiere que los nombres de los paquetes también debe estar reflejado en la estructura de directorios. Esto significa que:

    1. Su HelloWorld.java archivo debe estar en un directorio llamado main
    2. Debe ejecutar javac y java desde el directorio que contiene main, no de main
    3. El classpath debe contener el directorio donde el main directorio, no main
    4. java espera que el nombre canónico de la clase a ejecutar, por lo main.HelloWorld

    Así que, para recapitular:

    Usted debe tener algo como myproject/main/HelloWorld.java

    De myproject, ejecutar javac main/HelloWorld.java

    De myproject, ejecutar java -cp ./main.HelloWorld

    Gracias, señor! Usted está absolutamente en lo correcto, mi problema era con el sistema de ficheros! Viniendo de eclipse, yo no lo entendía plenamente la ruta de clases y tenía mis archivos de java en el directorio base. Una vez que he creado una carpeta principal y se mudó a la fuente de los archivos a esta carpeta, el problema fue resuelto!
    Gracias, ya esta resuelto mi problema. Sólo para agregar a ella, la gente el cambio de Windows a Linux puede experimentar este problema (?) porque me fue bien en Windows 7, y pasar a Ubuntu planteado este error (creo).
    Esto debería darme un archivo llamado «main.class» en «miproyecto» carpeta o «HelloWorld.class» en la «principal» de la carpeta?
    Un archivo llamado HelloWorld.class en el main carpeta.

    OriginalEl autor Sergiu Dumitriu

  2. 9

    Que has puesto de su clase en un paquete denominado «principal», pero usted está tratando de tratar igual que no lo es en un paquete. Ya que package main; en la parte superior del archivo de código fuente que usted necesita para poner HelloWorld.java en ./principal, a continuación, ejecutar javac ./main/HelloWorld.java, seguido por java -cp . main.HelloWorld.

    Estos comandos te el ejemplo de trabajo que usted está tratando de construir:

    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
    El comando compile aquí no funciona. Da un archivo no se encuentra el error.
    Todo lo que puedo sugerir es que usted no haya escrito algo, porque así es como funciona. He añadido algunos comandos sencillos que va a hacer lo que está intentando.

    OriginalEl autor Ryan Stewart

  3. 2

    Como un principiante, usted podría encontrarse en una muy similar escenario donde la salida de error es el mismo. Intenta compilar y ejecutar el programa simple(sin tener ningún conjunto de paquetes) y hacer esto:

    javac HelloWorld.java
    java HelloWorld.class

    Esto le dará el mismo java.lang.NoClassDefFoundError desde java piensa HelloWorld es su paquete y la clase de su nombre de la clase. Para solucionarlo solo uso

    javac HelloWorld.java
    java HelloWorld

    Ver la página Java – Lección: Problemas Comunes (y Sus Soluciones)

    OriginalEl autor Reed Richards

  4. 0

    Problema:
    Básicamente, la Excepción en el hilo «principal» java.lang.NoClassDefFoundError:

    significa, que la clase que usted está tratando de ejecutar no se encontró en la ruta de clases.

    Solución: es necesario agregar la clase o .jar archivo que contiene esta clase en el classpath de java. Cuando se ejecuta una clase de java desde la línea de comandos, usted necesita agregar el punto (.)

    java YourSingleClass -cp .

    al classpath que le dice a la JVM para buscar clases en el directorio actual.

    Si está ejecutando una clase a partir de una .archivo jar, es necesario añadir este archivo jar al classpath:

    java org.somepackage.SomeClass -cp myJarWithSomeClass.jar
    Lo importante a señalar aquí es que en realidad él no especificar el nombre de clase completamente calificado (en su caso main.HelloWorld)
    ¿No es lo que estoy haciendo con javac -cp "./" HelloWorld.java y java -cp "./" HelloWorld ?
    Y si puedo cambiar el comando ejecutar para java -cp . main/HelloWorld tengo la Error: Could not find or load main class main.HelloWorld error de nuevo.

    OriginalEl autor Dixit Patel

Dejar respuesta

Please enter your comment!
Please enter your name here