J'essaie de mettre en place un test de journalisation simple avec JavaMail dans Java Ee 6, en utilisant les fichiers JAR fournis avec Glassfish 3.1. Il semble y avoir une mine de questions sur ce sujet, mais je n'ai pas trouvé de réponses qui ont encore aidé. Mon code de test ressemble à ceci: mon fichier journal.properties contient ceci: p> i Construire la classe en utilisant: P > MailcapCommandMap: createDataContentHandler for text/plain
search DB #1
got content-handler
class com.sun.mail.handlers.text_plain
Can't load DCH com.sun.mail.handlers.text_plain; Exception: java.lang.ClassNotFoundException: com/sun/mail/handlers/text_plain
7 Réponses :
J'ai trouvé la solution ici:
http://blog.hpxn.net/2009/12/02/TOMCAT-JAVA-6-AND-JAVAMail-Cant-lard-DCH/ P>
J'aimerais en savoir plus sur les détails de la raison pour laquelle il s'agit d'une question et de ce que cette option -XBootClassPath fait pour corriger le problème. Si j'exécute ma classe comme ceci: p> Il trouve les classes nécessaires et je reçois mon email. Maintenant, je dois juste comprendre comment traduire cette configuration en monverfish Server et essayer un test plus "réel" à partir de ce simple cas de test. P> p>
Informations supplémentaires: Une fois que j'ai ajouté -xbootclasspath / p: $ {com.sun.aas.installroot} /modules/javax.m ail.jar code> aux options JVM sur mon domaine de Glassfish et a mis à jour le
$ AS_Install / Glassfish / Domaines / {Domaine} /Config/logging.proper liens code> avec les informations ci-dessus, je reçois des notifications par courrier électronique contenant périodiquement tous les événements de journal à l'avertissement et au dessus.
ajoutez-les avant d'envoyer votre message: J'ai eu le problème dans mon application Android et ça marche. P> P>
Il est fixé également sous mon environnement de développement sous Eclipse / Linux / Open-JDK6.
Je préfère cette solution à la modification du bootclasspath car la modification du bootclasspath n'est pas toujours une option, par exemple: Java Web Start (JnLP).
Merci, cela a également travaillé sur Linux / Tomat6 / JDK6
Dans mon cas, j'ai pu résoudre ceci en ajoutant ceci avant envoi () em>: Ceci a été suggéré dans un blog lié, donc si vous voulez En savoir plus de détails, lisez-le. Merci à Jerry Gu pour le lier ici et le blogueur d'origine. p> URL: http://blog.hpxn.net/2009/12/02/TOMCAT-JAVA-6-AND-JAVAMail-Cant-lard-DCH/ P> P>
Merci du contexte, car l'URL semble décédée maintenant.
La probablité est élevée que si vous travaillez sur le serveur KARAF (OSGI), les suggestions ci-dessus seront difficiles à mettre en œuvre car KARAF n'ont pas de classe de démarrage ou de classe de démarrage.
J'ai trouvé que Activation.jar Conflit a créé ce problème. . P>
{FUSEESB_HOME Or ServiceMIX_HOME}/etc/jre.properties was loading activation.jar .
Bien que j'aimerais en savoir plus sur les détails de la raison pour laquelle il s'agit d'un problème et de ce que cette option -xbootClassPath fait pour corriger le problème. P>
Cela a à voir avec l'arbre de classier. Rappelez-vous que les chargeurs de classe enfant sont autorisés à rechercher des cours dans le chargeur de classe des parents, mais pas l'inverse. Dans votre programme d'échantillon, l'arbre de classier ressemble à ceci: p>
xxx pré> lorsque le logmanager $ logmanager $ $ Cleaner code> Crochet d'arrêt (JDK6 +) le Context Classloader est obligé de
Bott Classloader incapable de localiser le com.sun.mail.HandLers. text_plain code> classe car il est dans un chargeur de classe enfant. À cause de cela, Modification de la messagerie
Mailcapcommandmap code> pour inclure le mailcap Les noms de classe
ne résoudront pas le problème. Lorsque vous utilisez l'option-XBOOTCLASSPATH CODE>, vous placez toutes les classes pertinentes du chargeur de classement de démarrage qui est visible au logManager $ logManager $ dollder code>. Cependant, ne modifiez pas votre système pour utiliser
-xbootclasspath code> pour corriger ce problème. P>
à la place, mettez à niveau sur JavaMail 1.5.3 ou ultérieure qui contient la solution pour BOGUE K6552 | GH133 - Utilisez une ergonomie de classier dans la mailhandler . Si vous souhaitez mettre à niveau le module JavaMail de Glassfish, vous pouvez remplacer le
Glassfish-XX / Glassfish / Modules / Javax.mail.jar Code> avec une nouvelle version de JavaMail. P>
L'incomplet Fix appliqué à JavaMail 1.4.7 était de définir le chargeur de classe de contexte sur le chargeur de classe qui chargés le
mailhandler code> pendant près. L'hypothèse est que le chargeur de classe qui a chargé le
Mailhandler code> doit pouvoir trouver le code d'activation. P>
Si vous ne pouvez pas passer à une version plus récente de JavaMail, vous devez appliquer L'une des solutions suivantes: p>
- Flush ou fermez la messagerie avant que le nettoyeur fonctionne. LI>
- Rincer tous les gestionnaires avant que le nettoyeur fonctionne (c'est-à-dire une application Web Undépape). Vous devez synchroniser sur le logmanager et collecter tous les gestionnaires de chaque enregistreur. Rincez tous les médicaments à l'extérieur du bloc synchronisé. LI>
- Étendez la messagerie et remplacez-vous près de définir et de restaurer le chargeur de classe de contexte si le chargeur de classe de contexte est NULL. li>
- Installez un nouveau logManager et de remplacement
réinitialiser code> pour définir et restaurer le chargeur de classe de contexte si le chargeur de classe de contexte est null. Li>
- Installez un formateur de sujet pour définir le chargeur de classe de contexte si le nettoyeur est en cours d'exécution. Li>
- Définissez le niveau de push sur
TOUT CODE> ou définissez la capacité à 1 afin qu'un e-mail soit envoyé pour chaque enregistrement de journal et être spammé. Li>
- Exécutez sur une version Java avec patchée avec RFE JDK-8025251. li> ol>
Le problème principal est que le logManager $ logManager $ fonctionne fonctionne le chargeur de classement de contexte à NULL avant d'appelle
Fermer code> sur chaque
code> enregistré avec le
logManager code>. Un meilleur choix pour le logmanager aurait été de définir le chargeur de classe de travail sur le chargeur de classe de manutention avant d'appeler la fermeture, puis une fois que tous les gestionnaires sont fermés, définissez le chargeur de classe de contexte sur NULL. Cela pourrait toujours être dupe en nidifiant les gestionnaires mais au moins cela aurait fixé le cas commun. Ceci a été déposé comme rfe JDK-8025251 "Le nettoyeur de logManager doit utiliser le chargeur de classeur de manutention pendant fermer ". P> blockQuote>
Pour tous avoir ce message d'erreur ci-dessus, il s'est avéré que, dans mon cas, les données d'authentification étaient vides, cela était dû que j'avais éteint l'authentification du serveur de messagerie, je n'avais plus besoin d'un nom d'utilisateur et d'un mot de passe, mais les valeurs vides étaient analysé d'une manière ou d'une autre et créé une erreur d'authentification manquante, cela n'a pas été attrapé bien dans le courrier 1.4.0, Mise à jour de la messagerie 1.4.7 forte> et Suppression des deux entrées paramètres ci-dessous forts> résolvé le problème . <appender name="ALARM_MAIL" class="my.utils.SMTPAppender">
<!-- remove this line: <param name="SMTPUsername" value=""/> -->
<!-- remove this line: <param name="SMTPPassword" value=""/> -->
...
J'ai heurté ce problème aujourd'hui et il fallait faire avec le chargeur de classe du fil. P>
Si vous faites un sysout sur: com.sun.mail.handlers.multipart_mixed.class.getClassloader () P>
Il peut ne pas être identique au chargeur de classe du thread actuel: Thread.CurrentThread (). GetContextClassloader () P>
J'ai pu arriver à cette conclusion en ajoutant l'ARG suivant: -Djavax.activation.debug = true p>
Après avoir ajouté cet argument, j'ai vu qu'il était incapable de charger le gestionnaire de contenu de données (DCH) pour multipart_mixed.class. P>
Comment vous résolvez que vos problèmes de classier sont à vous, mais cela devrait vous aider à démarrer. P>
Je vais ajouter qu'il s'agit d'un système Solaris 10. Voici ma version JRE: [/USR/JDK/Instances/jdk1.6.0]: Version Java Java "1.6.0_24" Java (TM) SE Runtime Environment (Build 1.6.0_24-B07) Java Hotspot (TM) Server VM (Build 19.1-B02, mode mixte)