11
votes

Erreur de classe DCH avec JavaMail

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: xxx pré>

mon fichier journal.properties contient ceci: p> xxx pré>

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


1 commentaires

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)


7 Réponses :


5
votes

J'ai trouvé la solution ici:

http://blog.hpxn.net/2009/12/02/TOMCAT-JAVA-6-AND-JAVAMail-Cant-lard-DCH/

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: xxx

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.


1 commentaires

Informations supplémentaires: Une fois que j'ai ajouté -xbootclasspath / p: $ {com.sun.aas.installroot} /modules/javax.m ail.jar aux options JVM sur mon domaine de Glassfish et a mis à jour le $ AS_Install / Glassfish / Domaines / {Domaine} /Config/logging.proper liens 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.



11
votes

ajoutez-les avant d'envoyer votre message: xxx

J'ai eu le problème dans mon application Android et ça marche.


3 commentaires

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



5
votes

Dans mon cas, j'ai pu résoudre ceci en ajoutant ceci avant envoi () : xxx

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.

URL: http://blog.hpxn.net/2009/12/02/TOMCAT-JAVA-6-AND-JAVAMail-Cant-lard-DCH/


1 commentaires

Merci du contexte, car l'URL semble décédée maintenant.



3
votes

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 .


0 commentaires

4
votes

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.

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: xxx

lorsque le logmanager $ logmanager $ $ Cleaner Crochet d'arrêt (JDK6 +) le Context Classloader est obligé de Bott Classloader incapable de localiser le com.sun.mail.HandLers. text_plain classe car il est dans un chargeur de classe enfant. À cause de cela, Modification de la messagerie Mailcapcommandmap pour inclure le mailcap Les noms de classe ne résoudront pas le problème. Lorsque vous utilisez l'option -XBOOTCLASSPATH , vous placez toutes les classes pertinentes du chargeur de classement de démarrage qui est visible au logManager $ logManager $ dollder . Cependant, ne modifiez pas votre système pour utiliser -xbootclasspath pour corriger ce problème.

à 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 avec une nouvelle version de JavaMail.

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 pendant près. L'hypothèse est que le chargeur de classe qui a chargé le Mailhandler doit pouvoir trouver le code d'activation.

Si vous ne pouvez pas passer à une version plus récente de JavaMail, vous devez appliquer L'une des solutions suivantes:

  1. Flush ou fermez la messagerie avant que le nettoyeur fonctionne.
  2. 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é.
  3. É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.
  4. Installez un nouveau logManager et de remplacement réinitialiser pour définir et restaurer le chargeur de classe de contexte si le chargeur de classe de contexte est null.
  5. Installez un formateur de sujet pour définir le chargeur de classe de contexte si le nettoyeur est en cours d'exécution.
  6. Définissez le niveau de push sur TOUT ou définissez la capacité à 1 afin qu'un e-mail soit envoyé pour chaque enregistrement de journal et être spammé.
  7. Exécutez sur une version Java avec patchée avec RFE JDK-8025251.

    Le problème principal est que le logManager $ logManager $ Fermer sur chaque enregistré avec le logManager . 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 ".


0 commentaires

0
votes

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=""/> -->
  ...


0 commentaires

1
votes

J'ai heurté ce problème aujourd'hui et il fallait faire avec le chargeur de classe du fil.

Si vous faites un sysout sur: com.sun.mail.handlers.multipart_mixed.class.getClassloader ()

Il peut ne pas être identique au chargeur de classe du thread actuel: Thread.CurrentThread (). GetContextClassloader ()

J'ai pu arriver à cette conclusion en ajoutant l'ARG suivant: -Djavax.activation.debug = true

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.

Comment vous résolvez que vos problèmes de classier sont à vous, mais cela devrait vous aider à démarrer.


0 commentaires