public class PropHolder {
public static Properties prop;
static {
//code for loading properties from file
}
}
// Referencing the class somewhere else:
Properties prop = PropHolder.prop;
class PropHolder
Es una clase propia. La clase reside en el mismo archivo JAR de la clase principal. Entonces eso no debería porque falta un JAR en classpath.
Cuando busco en el archivo JAR jar tf myjarfile
, puedo ver la PropHolder.class
lista allí.
Por cierto: el código se está ejecutando bien en mi máquina local. Pero no podría funcionar cuando lo implemento con algún script en un servidor Linux. Así que creo que no es el problema del código. Pero por alguna razón. El proceso de implementación es muy difícil de rastrear.
¿Cual podría ser el problema?
Respuestas:
Mi mejor apuesta es que hay un problema aquí:
Al parecer, se produjo una excepción no detectada y se propagó hasta el ClassLoader real que intenta cargar la clase. Sin embargo, necesitaríamos un stacktrace para confirmar esto.
O eso o ocurrió al crear una
PropHolder.prop
variable estática.fuente
static
problema. ¿Qué se debe hacer para resolver el problema?static
bloque. Para depurarlo, coloque untry/catch(Exception e)
alrededor de todo el bloque y registre la excepción. Tendrás que arreglar esa excepción. Por lo general, la excepción se registrará, pero puede ser difícil de encontrar, ya que se registra durante la carga de clases, lo que puede suceder muy tempranotry catch
bloque y decíaFailed to initialize ClassA
. Creo que es el problema deJVM
. Reinicié mi sistema y luego todo funcionó bien. ¿Cómo resuelvo este problema en el futuro sin reiniciar mi sistema y resolver el problema con una solución simple?cause
si está disponible. ANoClassDefFoundError
siempre está asociado a otro error, deberá buscarlo en los registros o intentar registrarlo de manera más adecuada (como forzar el inicio de sesión en un nuevo archivo en el sistema de archivos)Usted está obteniendo un
java.lang.NoClassDefFoundError
que NO significa que falta su clase (en ese caso obtendría unjava.lang.ClassNotFoundException
). El ClassLoader se encontró con un error al leer la definición de la clase al intentar leer la clase.Ponga un try / catch dentro de su inicializador estático y observe la excepción. Si lee algunos archivos allí y difiere de su entorno local, es muy probable que sea la causa del problema (tal vez no se pueda encontrar el archivo, sin permisos, etc.).
fuente
@Stateless
, así que simplemente agregué la dependencia correspondiente y pude continuar. ¡Gracias por el consejo!NoClassDefFoundError no da mucha idea de lo que salió mal dentro del bloque estático. Es una buena práctica tener siempre un bloque como este dentro del código de inicialización {...} estático:
fuente
Tuve la misma excepción, así es como resolví el problema:
Condiciones previas
Clase Junit (y prueba), que extendió otra clase.
ApplicationContext inicializado usando spring, que inicia el proyecto.
El contexto de la aplicación se inicializó en el método @Before
Solución:
Inicie el contexto de la aplicación desde el método @BeforeClass, ya que la clase principal también requería algunas clases que se inicializaron desde el contexto de la aplicación.
Espero que esto ayude.
fuente
Como se mencionó anteriormente, esto podría ser una serie de cosas. En mi caso, tenía una variable inicializada estáticamente que se basaba en una entrada que faltaba en mi archivo de propiedades. Se agregó la entrada que falta al archivo de propiedades y se resolvió el problema.
fuente
Hace solo unos días, me encontré con la misma pregunta como la tuya. Todo el código funciona bien en mi máquina local, pero resulta un error (noclassdeffound & initialize). Así que publico mi solución, pero no sé por qué, simplemente adelanto una posibilidad. Espero que alguien lo explique. @ John Vint En primer lugar, le mostraré mi problema. Mi código tiene variable estática y bloque estático ambos. Cuando conocí este problema por primera vez, probé la solución de John Vint e intenté detectar la excepción. Sin embargo, no atrapé nada. Entonces pensé que es porque la variable estática (pero ahora sé que son lo mismo) y todavía no encontré nada. Entonces, trato de encontrar la diferencia entre la máquina Linux y mi computadora. Luego descubrí que este problema ocurre solo cuando varios subprocesos se ejecutan en un proceso (por cierto, la máquina Linux tiene núcleos dobles y procesos dobles). Eso significa que si hay dos tareas (ambas usan el código que tiene un bloque estático o variables) que se ejecutan en el mismo proceso, sale mal, pero si se ejecutan en procesos diferentes, ambas están bien. En la máquina Linux, yo uso
para ejecutar una tarea, y debido a que mi variable estática es iniciar un contenedor (o tal vez usted inicializa un nuevo cargador de clases), por lo que permanecerá hasta que se detenga el jvm, y el jvm se detiene solo cuando todas las tareas en un proceso se detienen. Cada tarea iniciará un nuevo contenedor (o cargador de clases) y confundirá a jvm. Como resultado, ocurre el error. Entonces, ¿cómo resolverlo? Mi solución es agregar un nuevo comando al comando maven y hacer que cada tarea vaya al mismo contenedor.
Tal vez ya haya resuelto este problema, pero todavía espera que ayude a otros que se encuentran con el mismo problema.
fuente
java.lang.ExceptionInInitializerError: null
significa que no puede encontrar la clase en el cargador de clases o no sabe cargar cuál (supongo). ¿Lo conociste?Tuve la misma excepción, pero solo mientras se ejecutaba en modo de depuración, así es como resolví el problema (después de 3 días completos): en build.gradle tenía: "multiDexEnabled true" establecido en la sección defaultConfig.
pero aparentemente esto no fue suficiente. pero cuando cambié:
a:
Esto lo resolvió. Espero que esto ayude a alguien
fuente
Si está trabajando en un proyecto de Android, asegúrese de no llamar a ningún método estático en ninguna clase de Android. Solo estoy usando JUnit + Mockito, por lo que quizás otros marcos podrían ayudarlo a evitar el problema por completo, no estoy seguro.
Mi problema era llamar
Uri.parse(uriString)
como parte de un inicializador estático para una prueba unitaria. La clase Uri es una API de Android, por lo que la construcción de prueba unitaria no pudo encontrarla. En su lugar, cambié este valornull
y todo volvió a la normalidad.fuente
Tuve los mismos problemas: java.lang.NoClassDefFoundError: No se pudo inicializar la clase com.xxx.HttpUtils
es el problema del entorno. ¡Eso significa que las propiedades en application.yml son incorrectas o están vacías!
fuente
Me encuentro con el mismo problema. Inicié un objeto bean en bloque estático como a continuación:
Solo porque el proceso de mi petición de frijol causó un NPE, tengo problemas. Así que creo que deberías revisar tu bloque de código estático cuidadosamente.
fuente