thread - java.lang.noclassdeffounderror solucion
¿Cómo resolver java.lang.NoClassDefFoundError? (23)
He intentado tanto el ejemplo en los Tutoriales de Java de Oracle. Ambos compilan bien, pero en el 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 archivo Main.java
en la carpeta incorrecta. Aquí está la jerarquía del directorio:
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 poner la clase Main
en el paquete de graphics
(agregué package graphics;
a ella), establecí el classpath en "_test" (carpeta que contiene gráficos), lo compilé y lo ejecuté usando java graphics.Main
(desde la línea de comando) ), 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.
1) Primer método: resolví este problema. Al eliminar algunas clases de dependencias, eliminémoslas del código que se muestra a continuación. Este problema lo enfrenté en 4.2.2.
compile ''com.google.android.gms:play-services-gcm:11.0.4''
compile ''com.google.android.gms:play-services:11.0.4''
estos son extra en mi código los eliminé
dependencies {
compile fileTree(include: [''*.jar''], dir: ''libs'')
androidTestCompile(''com.android.support.test.espresso:espresso-core:2.2.2'', {
exclude group: ''com.android.support'', module: ''support-annotations''
})
compile files(''libs/ypylibs.jar'')
compile ''com.android.support:appcompat-v7:25.3.1''
compile ''com.google.android.gms:play-services-gcm:11.0.4''
compile ''com.google.android.gms:play-services:11.0.4''
compile ''com.google.android.gms:play-services-ads:11.0.4''
compile ''com.dailymotion.dailymotion-sdk-android:sdk:0.1.12''
compile ''org.apache.httpcomponents:httpcore:4.4.1''
compile ''commons-io:commons-io:1.3.2''
compile ''com.oguzdev:CircularFloatingActionMenu:1.0.2''
compile ''com.android.support:multidex:1.0.1''
compile ''com.android.support.constraint:constraint-layout:1.0.2''
testCompile ''junit:junit:4.12''
} (2) Método: Otra forma de resolver este problema es hacer una nueva clase de aplicación
public class MyApplication extends Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
luego agréguelo al archivo mainfest y a la etiqueta de la aplicación
<application
android:allowBackup="true"
android:name=".gps.navigation.map.MyApplication"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"></application>
después de esto, en su actividad principal, elimine la compactación de la aplicación, si es necesario, y amplíe su clase con actividad, entonces funcionará.
Después de compilar su código, termina con archivos .class
para cada clase en su programa. Estos archivos binarios son el bytecode que Java interpreta para ejecutar su programa. El NoClassDefFoundError
indica que el cargador de clases (en este caso java.net.URLClassLoader
), que es responsable de cargar dinámicamente las clases, no puede encontrar el archivo .class
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 reflexión), por lo que generalmente esta excepción 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 de su classpath. NoClassDefFoundError
también puede indicar que le falta una dependencia transitiva de un archivo .jar contra el que compiló y que está tratando de usar.
Por ejemplo, si tuviera una clase com.example.Foo
, después de compilar tendría un archivo de clase Foo.class
. Digamos, por ejemplo, que su directorio de trabajo es .../project/
. Ese archivo de clase debe colocarse en .../project/com/example
, y debe establecer su classpath en .../project/
.
Nota al margen: recomendaría aprovechar la increíble herramienta que existe 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 los classpaths (tanto) y concentrarse en el código. Dicho esto, este enlace explica cómo establecer el classpath cuando se ejecuta en la línea de comando.
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 al reabrir el proyecto, no hubo informes de errores.
Esta respuesta es específica de un evento java.lang.NoClassDefFoundError en un servicio :
Mi equipo recientemente vio este error después de actualizar un rpm que suministró un servicio. Las rpm y el software en su interior se habían construido con Maven, por lo que parecía que teníamos una dependencia de 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: ¡ reinicia el servicio!
Parece que la actualización de rpm invalidó el identificador de archivo del servicio en el archivo jar subyacente. A continuación, el servicio vio una clase que no se había cargado en la memoria, la buscó entre su lista de identificadores de archivo jar y no la encontró porque se invalidó el archivo del que podía cargar la clase. Reiniciar el servicio obligó a volver a cargar todos sus identificadores de archivo, 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 un caso específico ayude a alguien.
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 Bundle-Activator que no se ha actualizado automáticamente. La actualización manual del Bundle-Activator en MANIFEST.MF en el nuevo PlugIn ha solucionado mi problema.
Me gustaría corregir la perspectiva de otros en NoClassDefFoundError
.
NoClassDefFoundError
puede ocurrir por varias razones como
- ClassNotFoundException - .class no encontrada para esa clase a la que se hace referencia, independientemente de si está disponible en tiempo de compilación o no (es decir, clase base / secundaria).
- Archivo de clase ubicado, pero Excepción levantada al inicializar variables estáticas
- Archivo de clase ubicado, Excepción levantada al inicializar bloques estáticos
En la pregunta original, fue el primer caso que se puede corregir estableciendo CLASSPATH en el archivo jar de las clases referenciadas o en su carpeta de paquetes.
¿Qué significa decir "disponible en tiempo de compilación"?
- La clase referenciada se usa en el código.
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 el momento de la compilación"?
- La clase de tiempo de compilación y la clase de tiempo de ejecución son diferentes, es decir, por ejemplo, la clase base se carga utilizando classname of child class, por ejemplo, Class.forName ("classname")
Ejemplo: dos clases, A y B (se extiende A). El código tiene
A a = Class.forName ("B"). NewInstance ();
Me he enfrentado con el problema hoy. Tengo un proyecto de Android y después de habilitar multidex
el proyecto ya no se iniciará.
El motivo fue que olvidé llamar al método multidex específico que debería agregarse a la Application class
e invocar antes de todo lo demás.
MultiDex.install(this);
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
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
Me pasó en Android Studio.
La solución que funcionó para mí: simplemente reinicie el estudio.
Mis dos centavos en esta cadena:
Asegúrese de que classpath contiene rutas completas ( /home/user/lib/some_lib.jar
lugar de ~/lib/some_lib.jar
), de lo contrario, puede enfrentar el error NoClassDefFoundError
.
Obtengo NoClassFoundError cuando las clases cargadas por el cargador de clases de 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 se encuentran en diferentes dominios de seguridad (según java), el jvm no permitirá que las clases ya cargadas por el cargador de la 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 cargador env que cargó la clase. Es muy útil rastrear por qué una clase no se puede resolver.
// ClassLoaderTracer.java
// From: https://blogs.oracle.com/sundararajan/entry/tracing_class_loading_1_5
import java.lang.instrument.*;
import java.security.*;
// manifest.mf
// Premain-Class: ClassLoadTracer
// jar -cvfm tracer.jar manifest.mf ClassLoaderTracer.class
// java -javaagent:tracer.jar [...]
public class ClassLoadTracer
{
public static void premain(String agentArgs, Instrumentation inst)
{
final java.io.PrintStream out = System.out;
inst.addTransformer(new ClassFileTransformer() {
public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
String pd = (null == protectionDomain) ? "null" : protectionDomain.getCodeSource().toString();
out.println(className + " loaded by " + loader + " at " + new java.util.Date() + " in " + pd);
// dump stack trace of the thread loading class
Thread.dumpStack();
// we just want the original .class bytes to be loaded!
// we are not instrumenting it...
return null;
}
});
}
}
Pasa mucho con mis dispositivos genymotion. Asegúrese de tener una buena cantidad de memoria disponible en su disco donde está instalado Genymotion.
Si está utilizando más de un módulo, debe tener
dexOptions { preDexLibraries = false }
en tu archivo de construcción
Si su proyecto está en un paquete como com.blahcode
y su clase se llama Main
, los archivos compilados se pueden generar en una estructura de directorios como ./out/com/blahcode/Main.class
. Esto es especialmente cierto para IntelliJ IDEA.
Cuando intente ejecutar desde un shell o un cmd, debe cd
que contiene com
como un subdirectorio.
cd out
java -classpath . com.blahcode.Main
Tuve el mismo problema con mi desarrollo de Android usando el estudio de Android. 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 haciendo desarrollo usando Android Studio. modifique la configuración como se indica a continuación Preferencias -> Compilación, Ejecución, Despliegue -> Ejecución instantánea -> desmarque la primera opción.
Con este cambio estoy en marcha. Espero que esto ayude a mis amigos dev.
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á ahí, mientras que clean & build falla. ¡Recuerde definir las bibliotecas de jar recién agregadas en la configuración 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 similares que llegan cuando el contenedor no está allí. Solo en el fondo habrá un pequeño indicio de protección en los problemas. Por lo tanto, es bastante lógico comenzar a buscar errores de ruta de clase tradicionales, etc., pero esto será en vano.
Evidentemente, la excepción NoClassDefFound será el resultado cuando se ejecute, por ejemplo, el archivo ejecutable resultante creado y basado en la falta de coherencia de proguard. Algunos lo llaman proguard "Hell"
Uso el plugin FileSync para Eclipse para poder depurar en vivo en Tomcat y recibí NoClassFoundError
porque agregué una entrada de sincronización para el directorio bin
en las => classes
espacio de trabajo de Eclipse => classes
en los metadata
de Tomcat pero no había agregado una sincronización de carpetas para el directorio extlib
en Eclipse =>
C:/Users/Stuart/eclipse-workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/webapps/myApp/WEB-INF/lib
compruebe que si tiene un controlador estático en su clase, si es así, pls elimínelo o cambie su código, porque el controlador estático solo podría iniciarse en el hilo principal, el bloqueo podría desencadenarse de esta manera:
1.Primero crea la instancia de clase en un hilo no principal y captura el bloqueo.
2. Luego llame al método de campo de la clase en el hilo principal, obtendrá el NoClassDefFoundError.
aquí está el código de prueba:
public class MyClass{
private static Handler mHandler = new Handler();
public static int num = 0;
}
en su método onCrete de Actividad principal, agregue la parte del código de prueba:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//test code start
new Thread(new Runnable() {
@Override
public void run() {
try {
MyClass myClass = new MyClass();
} catch (Throwable e) {
e.printStackTrace();
}
}
}).start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
MyClass.num = 3;
// end of test code
}
hay una manera simple de arreglarlo usando handlerThread to init handler:
private static Handler mHandler;
private static HandlerThread handlerThread = new HandlerThread("newthread");
static {
handlerThread.start();
mHandler = new Handler(handlerThread.getLooper(), mHandlerCB);
}
si obtienes uno de estos errores al compilar y ejecutar:
No Error Clase Def Encontrado
Error: no se pudo encontrar o cargar la clase principal hola
Excepción en el hilo "principal" java.lang.NoClassDefFoundError: javaTest / test / hello (nombre incorrecto: test / hello) en java.lang.ClassLoader.defineClass1 (método nativo) en java.lang.ClassLoader.defineClass (origen desconocido) en java.security.SecureClassLoader.defineClass (Fuente desconocida) en java.net.URLClassLoader.defineClass (Fuente desconocida) en java.net.URLClassLoader.access $ 100 (Fuente desconocida) en java.net.URLClassLoader $ 1.run (Fuente desconocida) en java.net.URLClassLoader $ 1.run (Fuente desconocida) en java.security.AccessController.doPrivileged (Método nativo) en java.net.URLClassLoader.findClass (Fuente desconocida) en java.lang.ClassLoader.loadClass (Fuente desconocida) en sun .misc.Launcher $ AppClassLoader.loadClass (Fuente desconocida) en java.lang.ClassLoader.loadClass (Fuente desconocida) en sun.launcher.LauncherHelper.checkAndLoadMain (Fuente desconocida)
-------------------------- SOLUTIION -----------------------
el problema es principalmente en paquetes de reconocimiento. Debe organizar sus clases en carpetas correctamente con respecto a las clasificaciones de paquetes en su código fuente.
On Compiling process use this command:
javac -d . [FileName.java]
To Run the class please use this command:
java [Package].[ClassName]
si recientemente agregó soporte multidex en un estudio de Android como este:
// To Support MultiDex
implementation ''com.android.support:multidex:1.0.1''
por lo que su solución solo se extiende desde MultiDexApplication en lugar de Application
public class MyApp extends MultiDexApplication {
NoClassDefFoundError
significa que la clase está presente en la ruta de clase en Compile time
, pero no existe en la ruta de clase en Runtime
.
Si está utilizando Eclipse, asegúrese de tener las shapes
, los linepoints
y los spaceobjects
como entradas en el archivo .classpath
.
No se produce 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ó a partir del compilador de Java, pero de alguna manera en el tiempo de ejecución no se encuentra la clase dependiente.
Vamos a pasar por un simple ejemplo:
public class ClassA{
public static void main(String args[]){
//Some gibberish Code...
String text = ClassB.getString();
System.out.println("Text is :" + text);
}
}
public class ClassB{
public static String getString(){
return "Testing Some Exception";
}
}
Ahora supongamos que los dos códigos anteriores de la fuente de Java se colocan en alguna carpeta, digamos "NoClassDefinationFoundExceptionDemo"
Ahora abra un shell (suponiendo que Java ya se está configurando correctamente)
- Ir a la carpeta "NoClassDefinationFoundExceptionDemo"
- Compilar los archivos fuente de Java javac ClassB javac ClassA
- Ambos archivos se compilan con éxito y se generan archivos de clase en la misma carpeta que ClassA.class y ClassB.class
- Ahora, dado que estamos sobrepasando ClassPath al directorio de trabajo actual, ejecutamos el siguiente comando java -cp. ClassA y funcionó con éxito y verá la salida en la pantalla
- Ahora digamos, eliminó el archivo ClassB.class del presente directorio. y ahora ejecutas el comando nuevamente. java -cp. ClassA Ahora lo recibirá con NoClassDefFoundException. como ClassB que es una dependencia para ClassA no se encuentra en el classpath (es decir, presente directorio de trabajo).
NoClassDefFoundError en Java:
Definición:
NoClassDefFoundError vendrá si una clase estuvo presente durante el tiempo de compilación pero no está disponible en el classpath de java durante el tiempo de ejecución. Normalmente verá la línea inferior en el registro cuando obtenga NoClassDefFoundError: Excepción en el hilo "principal" java.lang.NoClassDefFoundError
Posibles causas:
La clase no está disponible en Java Classpath.
Puede ejecutar su programa utilizando el comando jar y la clase no estaba definida en el atributo ClassPath del archivo de manifiesto.
Cualquier secuencia de comandos de inicio está anulando la variable de entorno Classpath.
Como NoClassDefFoundError es una subclase de java.lang.LinkageError, también puede venir si una de sus dependencias, como la biblioteca nativa, no está disponible.
Busque 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 de 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 tenga dependencias en 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 antes mencionado 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 ningún error de definición de clase de clase
java.lang.NoClassDefFoundError
indica que algo se encontró en tiempo de compilación pero no en tiempo de ejecución . tal vez solo tengas que agregarlo al classpath.