He probado tanto el ejemplo en los Tutoriales Java de Oracle . Ambos compilan bien, pero en tiempo de ejecución, ambos presentan este error:
Exception in thread "main" java.lang.NoClassDefFoundError: graphics/shapes/Square
at Main.main(Main.java:7)
Caused by: java.lang.ClassNotFoundException: graphics.shapes.Square
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
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:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more
Creo que podría tener el Main.java
archivo en la carpeta incorrecta. Aquí está la jerarquía de directorios:
graphics
├ Main.java
├ shapes
| ├ Square.java
| ├ Triangle.java
├ linepoint
| ├ Line.java
| ├ Point.java
├ spaceobjects
| ├ Cube.java
| ├ RectPrism.java
Y aquí está Main.java
:
import graphics.shapes.*;
import graphics.linepoint.*
import graphics.spaceobjects.*;
public class Main {
public static void main(String args[]) {
Square s = new Square(2,3,15);
Line l = new Line(1,5,2,3);
Cube c = new Cube(13,32,22);
}
}
¿Qué estoy haciendo mal aquí?
ACTUALIZAR
Después de poner la Main
clase en el graphics
paquete (lo agregué package graphics;
), establezca el classpath en "_test" (carpeta que contiene gráficos), lo compilé y lo ejecuté usando java graphics.Main
(desde la línea de comandos), funcionó.
ACTUALIZACIÓN muy tarde # 2
No estaba usando Eclipse (solo Notepad ++ y el JDK), y la actualización anterior resolvió mi problema. Sin embargo, parece que muchas de estas respuestas son para Eclipse e IntelliJ, pero tienen conceptos similares.
fuente
package graphics;
en la parte superior). ¿Esgraphics
la cabeza de la estructura de su paquete? ¿Square tienepackage graphics.shapes
en la parte superior?Respuestas:
Después de compilar su código, termina con
.class
archivos para cada clase en su programa. Estos archivos binarios son el código de bytes que Java interpreta para ejecutar su programa. EstoNoClassDefFoundError
indica que el cargador de clases (en este casojava.net.URLClassLoader
), que es responsable de cargar dinámicamente las clases, no puede encontrar el.class
archivo para la clase que está tratando de usar.Su código no se compilaría si las clases requeridas no estuvieran presentes (a menos que las clases estén cargadas con reflejo), por lo que esta excepción generalmente significa que su classpath no incluye las clases requeridas. Recuerde que el cargador de clases (específicamente
java.net.URLClassLoader
) buscará clases en el paquete abc en la carpeta a / b / c / en cada entrada en su classpath.NoClassDefFoundError
también puede indicar que falta una dependencia transitiva de un archivo .jar con el que ha compilado y que está tratando de usar.Por ejemplo, si tuviera una clase
com.example.Foo
, después de compilar tendría un archivo de claseFoo.class
. Digamos, por ejemplo, que su directorio de trabajo es.../project/
. Ese archivo de clase debe colocarse.../project/com/example
y establecería su classpath en.../project/
.Nota al margen: recomendaría aprovechar las increíbles herramientas que existen para los lenguajes Java y JVM. Los IDE modernos como Eclipse e IDEA y las herramientas de administración de compilación como Maven o Gradle lo ayudarán a no tener que preocuparse por las rutas de clase (tanto) y centrarse en el código. Dicho esto, este enlace explica cómo configurar el classpath cuando ejecuta en la línea de comando.
fuente
Me gustaría corregir la perspectiva de los demás
NoClassDefFoundError
.NoClassDefFoundError
puede ocurrir por múltiples razones comoEn la pregunta original, fue el primer caso que puede corregirse estableciendo CLASSPATH en el archivo jar de clases referenciadas o en su carpeta de paquetes.
¿Qué significa decir "disponible en tiempo de compilación"?
Por ejemplo: dos clases, A y B (se extiende A). Si se hace referencia a B directamente en el código, está disponible en tiempo de compilación, es decir, A a = new B ();
¿Qué significa decir "no disponible en tiempo de compilación"?
Por ejemplo: Dos clases, A y B (se extiende A). El código tiene
A a = Class.forName ("B"). NewInstance ();
fuente
package app;
y recompilar antes de poder moverla a la aplicación del subdirectorio.NoClassDefFoundError
para ese caso: archive.is/YPbYI#selection-2107.0-2115.13NoClassDefFoundError
significa que la clase está presente en el classpath enCompile time
, pero no existe en el classpath enRuntime
.Si estás usando Eclipse, asegúrese de que tiene el
shapes
,linepoints
y elspaceobjects
como entradas en el.classpath
archivo.fuente
si recibió uno de estos errores al compilar y ejecutar:
-------------------------- SOLUCION -----------------------
El problema está principalmente en la organización de paquetes. Debe organizar sus clases en carpetas correctamente con respecto a las clasificaciones de paquetes en su código fuente.
fuente
indica que se encontró algo en tiempo de compilación pero no en tiempo de ejecución . tal vez solo tienes que agregarlo al classpath.
fuente
No se produce una excepción de definición de clase cuando la clase deseada no se encuentra en la ruta de clase. En la clase de tiempo de compilación: la clase se generó desde el compilador de Java, pero de alguna manera en el tiempo de ejecución no se encuentra la clase dependiente.
Veamos un ejemplo simple:
}
Ahora supongamos que los dos códigos fuente Java anteriores se colocan en alguna carpeta, digamos "NoClassDefinationFoundExceptionDemo"
Ahora abra un shell (suponiendo que Java ya se esté configurando correctamente)
fuente
NoClassDefFoundError en Java:
Definición:
NoClassDefFoundError vendrá si una clase estuvo presente durante el tiempo de compilación pero no está disponible en java classpath durante el tiempo de ejecución. Normalmente verá la siguiente línea en el registro cuando obtenga NoClassDefFoundError: Excepción en el hilo "main" java.lang.NoClassDefFoundError
Posibles Causas:
La clase no está disponible en Java Classpath.
Es posible que esté ejecutando su programa utilizando el comando jar y la clase no se definió en el atributo ClassPath del archivo de manifiesto.
Cualquier script de inicio anula la variable de entorno Classpath.
Debido a que NoClassDefFoundError es una subclase de java.lang.LinkageError, también puede venir si una de sus dependencias, como la biblioteca nativa, puede no estar disponible.
Verifique java.lang.ExceptionInInitializerError en su archivo de registro. NoClassDefFoundError debido a la falla de la inicialización estática es bastante común.
Si está trabajando en un entorno J2EE, la visibilidad de Class entre múltiples Classloader también puede causar java.lang.NoClassDefFoundError, consulte la sección de ejemplos y escenarios para una discusión detallada.
Posibles Resoluciones:
Verifique que todas las clases Java requeridas estén incluidas en el classpath de la aplicación. El error más común es no incluir todas las clases necesarias, antes de comenzar a ejecutar una aplicación Java que depende de algunas bibliotecas externas.
El classpath de la aplicación es correcto, pero la variable de entorno Classpath se reemplaza antes de la ejecución de la aplicación.
Verifique que el ExceptionInInitializerError mencionado anteriormente no aparezca en el seguimiento de la pila de su aplicación.
Recursos:
3 formas de resolver java.lang.NoClassDefFoundError en Java J2EE
java.lang.NoClassDefFoundError - Cómo resolver el error No Class Def Found
fuente
Si su proyecto está en un paquete como
com.blahcode
y se llama a su claseMain
, los archivos compilados pueden salir en una estructura de directorio como./out/com/blahcode/Main.class
. Esto es especialmente cierto para IntelliJ IDEA.Al intentar ejecutar desde un shell o cmd, debe hacerlo
cd
a lo que contienecom
como un subdirectorio.fuente
Después de trabajar en un proyecto de NetBeans durante muchos meses, de repente recibí el mensaje NoClassDefFoundError poco después de recibir una alerta de "memoria baja". Hacer una reconstrucción limpia no ayudó, pero al cerrar Netbeans por completo y reabrir el proyecto no hubo informes de errores.
fuente
Esta respuesta es específica de un java.lang.NoClassDefFoundError que ocurre en un servicio :
Mi equipo recientemente vio este error después de actualizar un rpm que proporcionaba un servicio. Las rpm y el software dentro de él se habían construido con Maven, por lo que parecía que teníamos una dependencia del tiempo de compilación que simplemente no se había incluido en las rpm.
Sin embargo, al investigar, la clase que no se encontró estaba en el mismo módulo que varias de las clases en el seguimiento de la pila. Además, este no era un módulo que solo se había agregado recientemente a la compilación. Estos hechos indicaron que podría no ser un problema de dependencia de Maven.
La solución final: reiniciar el servicio!
Parece que la actualización de rpm invalida el identificador del archivo del servicio en el archivo jar subyacente. Luego, el servicio vio una clase que no se había cargado en la memoria, la buscó entre su lista de identificadores de archivos jar y no pudo encontrarla porque el identificador de archivos desde el que podía cargar la clase se había invalidado. Reiniciar el servicio lo obligó a volver a cargar todos sus identificadores de archivos, lo que le permitió cargar esa clase que no se había encontrado en la memoria justo después de la actualización de rpm.
Espero que ese caso específico ayude a alguien.
fuente
Me he enfrentado con el problema hoy. Tengo un proyecto de Android y después de habilitarlo
multidex
el proyecto ya no comenzaría.La razón fue que había olvidado llamar al método multidex específico que debería agregarse
Application class
e invocar antes que todo lo demás.Siga este tutorial para habilitar multidex correctamente. https://developer.android.com/studio/build/multidex.html
Debe agregar estas líneas a su clase de aplicación
fuente
Para mi proyecto, lo que resolvió el problema fue que el navegador Chrome y el controlador de cromo no eran compatibles. Tenía una versión muy antigua del controlador que ni siquiera podía abrir el navegador. Acabo de descargar la última versión de ambos y el problema resuelto ¿Cómo descubrí el problema? Como ejecuté mi proyecto usando el controlador Firefox nativo de Selenium con una versión anterior de FF incluida en mi aplicación, me di cuenta de que el problema era la incompatibilidad entre el navegador y el controlador.
Espero que esto pueda ayudar a cualquiera con un problema similar al mío, que generó este mismo mensaje de error.
fuente
Mis dos centavos en esta cadena:
Asegúrese de que el classpath contiene rutas completas (en
/home/user/lib/some_lib.jar
lugar de~/lib/some_lib.jar
), de lo contrario, aún puede enfrentar unNoClassDefFoundError
error.fuente
~
y otros personajes cáscara meta al establecer una variable de entorno de ruta de clases, pero sólo siempre y cuando el mecanismo se utiliza para establecer la variable que se expande para nombres de rutas reales. Si está utilizandobash
, puede obtener resultados "mixtos". Por ejemplo, mira lo que obtienes cuando escribesecho ~:~
en la línea de comando. El primero~
se expande, pero el segundo no.Obtengo NoClassFoundError cuando las clases cargadas por el cargador de clases en tiempo de ejecución no pueden acceder a las clases ya cargadas por el cargador de raíz de Java. Debido a que los diferentes cargadores de clases están en diferentes dominios de seguridad (de acuerdo con Java), jvm no permitirá que las clases ya cargadas por el cargador de raíz se resuelvan en el espacio de direcciones del cargador de tiempo de ejecución.
Ejecute su programa con 'java -javaagent: tracer.jar [YOUR java ARGS]'
Produce resultados que muestran la clase cargada y el entorno del cargador que cargó la clase. Es muy útil rastrear por qué una clase no se puede resolver.
fuente
Me pasó en Android Studio.
La solución que funcionó para mí: simplemente reinicie el estudio.
fuente
Tuve el mismo problema con mi desarrollo de Android con Android Studio. Las soluciones proporcionadas son generales y no me ayudaron (al menos para mí). Después de horas de investigación, encontré la siguiente solución y puedo ayudar a los desarrolladores de Android que están desarrollando con Android Studio. modifique la configuración como se muestra a continuación Preferencias -> Compilación, Ejecución, Implementación -> Ejecución instantánea -> desmarque la primera opción.
Con este cambio estoy en funcionamiento. Espero que esto ayude a mis amigos desarrolladores.
fuente
Una fuente de error para esta excepción podría provenir de definiciones inconsistentes para Proguard, por ejemplo, una falta
-libraryJars "path.to.a.missing.jar.library".
Esto explica por qué la compilación y la ejecución funcionan bien, dado que el jar está allí, mientras que la limpieza y la compilación fallan. ¡Recuerde definir las bibliotecas jar recién agregadas en la configuración de proguard!
Tenga en cuenta que los mensajes de error de Proguard realmente no están a la altura, ya que se confunden fácilmente con mensajes de hormigas similares que llegan cuando el jar no está en absoluto. Solo en la parte inferior habrá un pequeño indicio de proguard en problemas. Por lo tanto, es bastante lógico comenzar a buscar errores de classpath tradicionales, etc., pero esto será en vano.
Evidentemente, la excepción NoClassDefFound será el resultado cuando se ejecute, por ejemplo, el jar ejecutable resultante creado y basado en la falta de coherencia de protección. Algunos lo llaman proguard "Infierno"
fuente
Uso el complemento FileSync para Eclipse para poder depurar en vivo en Tomcat y recibí
NoClassFoundError
porque había agregado una entrada de sincronización para elbin
directorio en el espacio=> classes
de trabajo de Eclipse enmetadata
Tomcat, pero no había agregado también una sincronización de carpetas para elextlib
directorio en Eclipse=>
C:\Users\Stuart\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\webapps\myApp\WEB-INF\lib
fuente
Estoy desarrollando una aplicación basada en Eclipse, también conocida como RCP (Rich Client Platform) . Y he estado enfrentando este problema después de refactorizar (mover una clase de un complemento a uno nuevo).
La limpieza del proyecto y la actualización de Maven no ayudaron.
El problema fue causado por el Activador de paquete que no se actualizó automáticamente. La actualización manual de Bundle-Activator en MANIFEST.MF en el nuevo PlugIn ha solucionado mi problema.
fuente
Si recientemente agregó soporte multidex en Android Studio de esta manera:
para que su solución se extienda desde MultiDexApplication en lugar de Application
fuente
Si está utilizando más de un módulo, debería tener
en su archivo de compilación.
fuente
Compruebe eso si tiene un controlador estático en su clase. Si es así, tenga cuidado, ya que el controlador estático solo podría iniciarse en un hilo que tiene un bucleador, el bloqueo podría desencadenarse de esta manera:
1.primero, cree la instancia de clase en un hilo simple y detecte el bloqueo.
2.A continuación, llame al método de campo de Class en el subproceso principal, obtendrá NoClassDefFoundError.
Aquí está el código de prueba:
en su método onCrete de Actividad principal, agregue la parte del código de prueba:
hay una manera simple de arreglarlo usando un controlador manejador Thread to init manejador:
fuente
No use clases de prueba fuera del módulo
No tengo una solución, solo otro sabor del caso "presente en la compilación, ausente en el tiempo de ejecución".
Intenté usar un método muy conveniente de una clase de prueba JUnit de otra clase de prueba que reside en un módulo diferente. Es un no-no, ya que el código de prueba no es parte del jar empaquetado, pero no me di cuenta porque parece visible para la clase de usuario desde Eclipse.
Mi solución fue colocar el método en una clase de utilidades existente que es parte del código de producción.
fuente
En mi entorno, encuentro este problema en la prueba unitaria. Después de agregar una dependencia de biblioteca a * .pom, eso se solucionó.
p.ej:
mensaje de error:
pom:
fuente
Recibí este error después de un cambio de rama de Git. Para el caso específico de Eclipse, había líneas perdidas en el directorio .settings para el archivo org.eclipse.wst.common.component. Como puede ver abajo
Restaurar las dependencias del proyecto con Maven Install ayudaría.
fuente
si está usando
gradlew
, vaya./gradle/wrapper/gradle-wrapper.properties
y cambiedistributionUrl
a la versión correcta de gradle.Si está utilizando JDK14 intente
fuente
Sucede mucho con mis dispositivos genymotion. Asegúrese de tener una buena cantidad de memoria disponible en su unidad donde está instalado Genymotion.
fuente