Question

J'ai un curieux problème.J'avais cette application Java qui avait été précédemment déployée dans Tomcat et j'utilisais avec plaisir Logback Classic comme implémentation de slf4j.Maintenant, lorsque nous avons essayé de déployer la même application sur un serveur jboss 7.1.final, elle ne déploie même pas l'application à propos dejava.lang.ClassCastException: org.slf4j.impl.Slf4jLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContextC'est la ligne de code incriminée

final LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();

La classe qui a la sienne est injectée par Spring et échoue - donc l'ensemble de l'application ne peut pas être déployé.Quelqu'un a-t-il une solution à cela ?Merci d'avance

Après avoir consulté ce site et d'autres forums, j'ai réalisé que Jboss 7 est livré avec sa propre implémentation slf4j et implémente la même interface ILoggerFactory que LoggerContext dans la connexion.Notre application a essayé d'obtenir une instance de la même chose, mais le serveur d'application impose sa propre implémentation de slf4j.

J'ai essayé de modifier le module.xml dans jboss\modules\org\slf4j\impl\main et je l'ai pointé vers les jars de connexion.

<resources>
    <resource-root path="logback-classic-0.9.28.jar"/>
    <resource-root path="logback-core-0.9.28.jar"/>
</resources>

Maintenant, lorsque je démarre l'application, j'obtiens une erreur sérieuse

Exception starting filter WicketFilter: java.lang.ClassCastException: ch.qos.logback.classic.LoggerContext cannot be cast to ch.qos.logback.classic.LoggerContext

Je suis à bout de nerfs.Des experts en jboss et en connexion peuvent-ils vous aider ?Merci d'avance

Était-ce utile?

La solution

Vous devez exclure la version serveurs de slf4j de votre déploiement.Créer un jboss-deployment-structure.xml fichier et placez-le dans votre WARS META-INF ou WEB-INF annuaire.

Le contenu du fichier devrait ressembler à ceci :

<jboss-deployment-structure>
    <deployment>
        <!-- Exclusions allow you to prevent the server from automatically adding some dependencies     -->
        <exclusions>
            <module name="org.slf4j" />
            <module name="org.slf4j.impl" />
        </exclusions>
    </deployment>
</jboss-deployment-structure>

Autres conseils

Si vous utilisez les ponts pour jul ou jcl dans votre application, vous devez également les exclure :

        <module name="org.slf4j" />
        <module name="org.slf4j.jcl-over-slf4j" />
        <module name="org.slf4j.impl" />
        <module name="org.jboss.logging.jul-to-slf4j-stub" />

Il existe une approche alternative :

  • vous avez configuré la journalisation dans votre guerre
  • tu as toutes les dépendances dans ta guerre
  • vous ne configurez rien dans le répertoire du serveur JBoss, pas même des modules JBoss supplémentaires

Désactivez simplement complètement la journalisation JBoss et comptez sur les dépendances de votre guerre.Modifiez votre jboss-deployment-structure.xml comme suit:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
    <deployment>
        <exclusions>
            <module name="org.apache.commons.logging" />
            <module name="org.apache.log4j" />
            <module name="org.jboss.logging" />
            <module name="org.jboss.logging.jul-to-slf4j-stub" />
            <module name="org.jboss.logmanager" />
            <module name="org.jboss.logmanager.log4j" />
            <module name="org.slf4j" />
            <module name="org.slf4j.impl" />
            <module name="org.slf4j.jcl-over-slf4j" />
        </exclusions>
    </deployment>
</jboss-deployment-structure>

Une fois que vous avez déployé votre application, la journalisation d'amorçage (boot.log) continue de fonctionner et server.log affichera la journalisation de déploiement.Mais toutes vos applications sont enregistrées via votre (dans cet exemple) slf4j+logback dans votre guerre.

Notez que vous ne devriez pas avoir besoin d'exécuter JBoss avec -Dorg.jboss.logging.provider=slf4j, si vous spécifiez cela, vous devrez fournir des modules JBoss (généralement slf4j-api, logback-classic et logback-core), mais cela n'en vaut pas la peine, car la journalisation JBoss est désormais utilisée uniquement pour le bootstrap (boot.log) et pour les informations de déploiement (server.log).

Les références:
http://tinyapps.blogspot.com/2013/01/getting-logback-and-slf4j-to-work-in.html
https://stackoverflow.com/a/19695680/2587343

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top