NoClassDefFoundError javax/jms/Message, même lors de la spécification de chemin de classe
Je rencontre une erreur lors de l'exécution de certaines de code java relatives à JMS. J'ai été en tirant sur mes cheveux pendant 2 jours à essayer de comprendre cela.
L'exception que j'obtiens est "java.lang.NoClassDefFoundError: javax/jms/Message"
java.lang.NoClassDefFoundError: javax/jms/Message
at Asci.ActiveBatch.JMSAgent.JMSManager.createMsg(JMSManager.java:195)
at Asci.ActiveBatch.JMSAgent.JMSService.SendMessageHandler(JMSService.java:160)
Sans entrer dans TROP de détails, c'est en référence à cette ligne:
public static void createMsg(String icf, String url, String cf, String QName, String msgText, String[] props, String user, String pass) throws Exception {
JMSProducer.produceMsg(icf, url, cf, QName, msgText, props, user, pass);
}
(Ne me demandez pas pourquoi cette fonction est en fait juste de la cartographie pour une autre... je n'ai pas à l'origine d'écrire ce code)
Je vais appeler ce code comme
java -jar /path/myjarfile.jar
javax.jms.jar est inclus dans ce pot est manifeste (et il existe à cet endroit), mais juste au cas où, j'ai également essayé, y compris celui de mon dossier lib (qui contient javax.jms.jar, bien sûr) comme suit:
java -classpath /path/lib:. -jar /path/myjarfile.jar
Je n'ai pas eu de chance jusqu'à présent. Je ne suis pas sûre de savoir quoi faire ou comment faire pour déboguer ce problème. Toute aide serait grandement appréciée. Clairement, ce code compile, de sorte que ces classes doivent être disponibles (au moins) lors de la compilation.
Grâce.
MODIFICATIONS:
1) je n'ai également essayer
java -classpath /path/lib/javax.jms.jar:. -jar /path/myjarfile.jar
2) Ce problème se produit en cours d'exécution, et non pas au moment de la compilation.
3) Donc, j'ai un autre code qui appelle la même méthode dans le même fichier jar qui fonctionne. Il n'y a pas quelque chose de maillage de droit lors de l'appel de ce code à partir d'un bocal. J'ai vérifié et re-vérifié mon code pour s'assurer qu'il est identique (à qui il a été/est), donc il ne semble pas comme un problème de code. Il semble y avoir une foiré de référence ou quelque chose, quelque part.
Je ne comprends pas vraiment ce que JMS est, mais je sais qu'un 'NoClassDefFound'-Exeption signifie souvent, que quelque chose a été trouvé au moment de la compilation, mais pas au moment de l'exécution.
Oui, j'ai essayé de spécifier le pot de manière explicite.
Cela se passe au moment de l'exécution. Je vois 0 erreurs lors de compile-time.
Ce fournisseur JMS utilisez-vous? En général, vous devez utiliser leur JMS Pots.
OriginalL'auteur bdzevel | 2013-03-08
Vous devez vous connecter pour publier un commentaire.
Il est possible que vous avez un chargeur de classe conflit où une version de javax.jms.Message est chargée dans un chargeur de classe, et puis c'est un coup de tête avec une version différente chargé à partir d'un autre chargeur de classe.
Pouvez-vous ajouter un initialiseur statique à JMSManager et JMSProducer faire quelque chose comme cela ?
Si ils s'impriment Url différentes, cela signifie que vous avez plusieurs copies de javax/jms/Message.class dans le classpath, et vos deux JMS les gars sont en train de charger différents chaque.
Si non..... eh bien, ce poste vous voir 🙂
Il vous manque une autre ressource. Décompiler Asques.ActiveBatch.JMSAgent.JMSService et de regarder ses dépendances. Vous aurez besoin de trouver des pots pour ceux.
Mais... je vois Message.class dans javax.jms.jar...
J'ai le code source de cette classe. Le projet, il en a une référence à javax.jms.jar qui contient javax.jms.Message ...
OriginalL'auteur Nicholas
Lors de l'ajout d'un
.jar
au classpath, vous avez besoin de référencer le pot directement, et non pas le dossier.OriginalL'auteur Darth Android
Créer un dossier lib à l'intérieur de WEB-INF si elle n'y est pas déjà. Mettre ce pot : javax.jms.jar et de redémarrage du serveur
OriginalL'auteur Kris