2011-05-12 31 views
7

Im' ejecutar este código en un Red Hat Linux con el sol/Oracle JVM 1.6_23, dentro de un servidor VMWare.java.lang.NoClassDefFoundError: en la clase interna anónima

Después de algunas veces, la JVM parece no poder acceder a mis clases internas anónimas.

Mi classpath está bien, ya que funciona por un tiempo.

Todo lo que tengo es errores como éste:

java.lang.NoClassDefFoundError : com/mycompany/impl/MyClassImpl$1 at com.mycompany.impl.MyClassImpl.markAsDeletable (MyClassImpl.java :45).

línea 45 es la primera línea de abajo, no puede encontrar mi nuevo predicado

 DomaineVO domaineVO = Iterables.find(domainesVO, new Predicate<DomaineVO>() { 

      @Override 
      public boolean apply(DomaineVO input) { 
       return input.getId().equals(domaine.getIdentifier().toString()); 
      } 
     }); 

¿Alguna idea?

+0

¿El archivo 'MyClassImpl $ 1.class' existe realmente en una de las carpetas en la ruta de clase (o dentro de algunos JAR)? –

+0

sí, el archivo está allí. Como dije, el código funciona por un tiempo, luego se detiene para trabajar. – oneeyejack

Respuesta

4

Finalmente, creo que podríamos haber puesto el dedo en el problema.

Estamos funcionando este código en el embarcadero, y utilizamos despliegue automático de los archivos .war. Por defecto, embarcadero usa java.io.tmpdir para implementar los archivos .war.

Nuestro problema fue sólo en Linux, y sobre todo por la mañana temprano (tan pronto como el primer empleado de oficina usar la aplicación).

La causa fue la limpieza de la/tmp en la noche (hecho por un comando Logrotate en nuestros servidores).

Reglas de oro: nunca utilice/tmp durante demasiado tiempo, y crea embarcadero desplegar guerra en un directorio de su propia.

Gracias a todos

+0

Encontré el mismo problema con el complemento Eclipse Terminal. Cambié a la Terminal de Linux y fue resuelto. – thSoft

2

Parece que la JVM no puede encontrar el archivo de clase para la clase anónima. Esto se llamaría 'MyClassImpl $ 1.class'; si no está presente en classpath, algo debe haberlo borrado. Si está presente, hay algo mal con la JVM.

+0

Supongo que hay algo mal con la JVM, pero me gustaría poder saber qué. (Como dije, en otro comentario, el archivo está allí.), Sé que estoy en una situación loca. – oneeyejack

+0

@oneeyejack: otra posibilidad si el archivo está allí es que, por alguna razón, sus permisos de acceso se modifican para que la JVM ya no pueda acceder a él. –

+0

Todo está dentro de un archivo .war, creo que si todo lo demás se está ejecutando, entonces esto no debería estar relacionado con un problema de permisos. Nick Fortescue habló sobre la posibilidad de un problema relacionado con GC. Estoy tratando de encontrar las opciones apropiadas de -XX para tener una mejor visión de lo que está sucediendo. – oneeyejack

1

Esto suena muy extraño. En primer lugar, si el código funciona por un tiempo, como dices, el archivo debe estar allí. En segundo lugar, es raro que una JVM descargue una clase de la memoria una vez que ha sido utilizada. Algunas JVM lo harán en situaciones de memoria ajustadas o como parte de un GC, pero como optimización normalmente se mantienen.

Mi única suposición es que está utilizando la JVM en una situación en la que los cargadores de clases están cambiando. Si está usando Netbeans (especialmente) pero creo que también eclipse, entonces si recompila parcialmente el código, los cargadores de clases podrían no coincidir. ¿Esto se está ejecutando dentro de un IDE?

Una alternativa es un cambio de ClassLoader. Si vuelve a lanzar a un servidor web en ejecución o servidor de aplicaciones, una clase anterior no tendrá un cargador de clases coincidente para la nueva instancia. Es posible que ClassLoader no pueda encontrar la versión anterior, aunque el archivo esté allí. ¿Está volviendo a lanzar a una aplicación/servidor web?

Finalmente, supongo que esto podría ser posible con la serialización. Si la clase es Serializable y los serialVersionUIDs no coinciden, creo que esto podría suceder. ¿Estás haciendo una serialización de objetos aquí?

+0

El problema está sucediendo en un servidor de embarcadero, y no usamos ningún tipo de características de implementación activas. La clase no es serializable. ¿Es posible que la JVM tenga un tipo de problema similar al de PermGenSpace? – oneeyejack

+0

¿Qué método estás usando para agregar tus jarrones o directorios a la vía de acceso de clase jetty? ¿Se están agregando como jarras o directorios? http://docs.codehaus.org/display/JETTY/Classloading –

+0

Todo el código está contenido dentro de los archivos .war, establecemos la ruta de guerra como esta: WebAppContext jettyWebAppContext = new WebAppContext(); \t \t jettyWebAppContext.setWar (war); \t \t jettyWebAppContext.setContextPath (normalizedContext); jettyServer.addHandler (jettyWebAppContext); – oneeyejack

Cuestiones relacionadas