2012-05-15 2 views
0

J'ai un programme java qui est un compilateur et un exécuteur pour les rapports Jasper et est appelé via un script shell sur notre serveur de rapports.Capture d'une java NoClassDefFoundError levée par un programme appelé via un script shell

Je viens de corriger un bug causé par une dépendance manquante, mais il m'a fallu un certain temps pour comprendre ce qui n'allait pas. Normalement, les problèmes causés par le processus de compilation sont capturés, enregistrés dans un fichier journal et envoyés par e-mail à la personne concernée. Comme c'était un NoClassDefFoundError, il a fondamentalement quitté le programme et a échoué d'une manière silencieuse du point de vue des utilisateurs.

Y a-t-il un moyen pour moi de capturer des erreurs comme celle-ci afin qu'elles puissent aussi être envoyées par courriel? J'ai le droit de modifier le script shell en cours d'exécution.

+0

http://www.hiteshagrawal.com/java/sending-email-using-apache-log4j – oers

+0

Je regardai en log4j un peu, mais je crois comprendre que je ne pense pas que cela fonctionnerait. Une NoClassDefFoundError ne peut pas être capturée dans le programme pour être enregistrée car elle force immédiatement. – Numeron

+1

dans votre méthode principale statique dans votre classe de démarrage, vous pouvez inclure un try ... catch (Throwable) ... qui sera capable de gérer le noclassdeferror – oers

Répondre

0

Généralement, les erreurs ne sont pas détectées par le code de l'application et sont renvoyées au niveau JVM où elles sont imprimées sur STDERR. Ainsi, votre façon de suivre cette erreur est de rediriger STDERR fichier:

java -cp YourMain 1>stdout.log 2>stderr.log

Vous pouvez aussi mettre STDOUT et STDERR ensemble:

java -cp YourMain 1>&2 2>wholelog.log

Il y a beaucoup de référence au sujet redirection de flux dans le web. Vous pouvez y jeter un coup d'œil si mes exemples ne vous satisfont pas. Et cela dépend de votre système d'exploitation.

0

Tout juste peut attraper l'erreur-à-dire

try { 
     numericDefinition = new net.sf.cb2xml.def.BasicNumericDefinition(
        binName, binarySizes, SynchronizeAt, usePositive, floatSynchronize, doubleSynchronize 
      ); 
} catch (NoClassDefFoundError e) { 
     System.out.println("Class Not Found: " + e.getMessage()); 
} 

Vous avez besoin d'être très prudent de votre codage cependant, il est facile d'obtenir NoClassDefFoundError jeté au temps d'initialisation de classe et ne pas entrer dans l'essai. bloc de capture.

Le NoClassDefFoundError sera lancé la première fois une classe est refereneced qui pourrait être quand pourrait quand une classe utilise une classe qui utilise une classe qui utilise une classe ... qui utilise une classe qui fait référence à une classe qui n'existe pas.

Les éléments suivants peuvent échouer avec NoClassDefFoundError lors de l'initialisation de classe en raison de l'importation.

import net.sf.cb2xml.def.BasicNumericDefinition; // could cause the NoClassDefFoundError 

    ........... 
try { 
      numericDefinition = new BasicNumericDefinition(
         binName, binarySizes, SynchronizeAt, usePositive, floatSynchronize, doubleSynchronize 
       ); 
    } catch (NoClassDefFoundError e) { 
      System.out.println("Class Not Found: " + e.getMessage()); 
    } 
Questions connexes