slf4j не работает в JBOSS при использовании модуля openJpa

Мое приложение EAR работает нормально, когда я не использую openJpa. Как только я использую открытый JPA, я получаю «SLF4J не может загрузить класс blaaa». Как настроить модуль openJpa для использования SL4J, который я предоставляю из pom.xml, и избежать этой ошибки?

Я использую JBOSS 7.1.1.

pom.xml

<properties>

    <slf4j.version>1.7.3</slf4j.version>
    <logback.version>1.0.10</logback.version>
       </properties>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>${logback.version}</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>${logback.version}</version>
    </dependency>

.......

модуль openjpa.xml

<module xmlns="urn:jboss:module:1.1" name="org.apache.openjpa">  
    <resources>  
        <resource-root path="openjpa-2.2.0.jar"/>  
        <resource-root path="openjpa-all-2.2.0.jar"/>  
    </resources>  
        <dependencies>  
            <module name="javax.persistence.api"/>  
            <module name="javax.transaction.api"/>  
            <module name="javax.validation.api"/>  
            <module name="org.apache.commons.lang"/>  
            <module name="org.apache.commons.collections"/>  
            <module name="org.slf4j"/>  
        </dependencies>  
</module>

jboss-deployment-structure.xml

<?xml version="1.0" encoding="UTF-8"?>

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

ошибка

10:17:53,854 ERROR [stderr] (MSC service thread 1-4) SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".

10:17:53,860 ERROR [stderr] (MSC service thread 1-4) SLF4J: Defaulting to no-operation (NOP) logger implementation

10:17:53,866 ERROR [stderr] (MSC service thread 1-4) SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

10:17:53,873 SEVERE [javax.enterprise.resource.webcontainer.jsf.config] (MSC service thread 1-4) Critical error during deployment: : java.lang.LinkageError: loader constraint violation: when resolving interface method "org.slf4j.ILoggerFactory.getLogger(Ljava/lang/String;)Lorg/slf4j/Logger;" the class loader (instance of org/jboss/modules/ModuleClassLoader) of the current class, org/slf4j/LoggerFactory, and the class loader (instance of org/jboss/modules/ModuleClassLoader) for resolved class, org/slf4j/ILoggerFactory, have different Class objects for the type org/slf4j/Logger used in the signature
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:242) [openjpa-all-2.2.0.jar:2.2.0]
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:254) [openjpa-all-2.2.0.jar:2.2.0]
    at net.sf.ehcache.CacheManager.<clinit>(CacheManager.java:131) [ehcache-ee-2.6.2.jar:]
    at com.zreflect.emyed.whiteboard.controller.CacheController.<init>(CacheController.java:39) [classes:]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) [rt.jar:1.6.0_25]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) [rt.jar:1.6.0_25]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) [rt.jar:1.6.0_25]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) [rt.jar:1.6.0_25]
    at java.lang.Class.newInstance0(Class.java:355) [rt.jar:1.6.0_25]
    at java.lang.Class.newInstance(Class.java:308) [rt.jar:1.6.0_25]
    at com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:188) [jsf-impl-2.1.7-jbossorg-2.jar:]
    at com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:102) [jsf-impl-2.1.7-jbossorg-2.jar:]
    at com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:409) [jsf-impl-2.1.7-jbossorg-2.jar:]
    at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:269) [jsf-impl-2.1.7-jbossorg-2.jar:]
    at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:256) [jsf-impl-2.1.7-jbossorg-2.jar:]
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:255) [jsf-impl-2.1.7-jbossorg-2.jar:]
    at org.apache.catalina.core.StandardContext.contextListenerStart(StandardContext.java:3392) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:3850) [jbossweb-7.0.13.Final.jar:]
    at org.jboss.as.web.deployment.WebDeploymentService.start(WebDeploymentService.java:90) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [rt.jar:1.6.0_25]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [rt.jar:1.6.0_25]
    at java.lang.Thread.run(Thread.java:662) [rt.jar:1.6.0_25]

10:17:54,007 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/emyed-whiteboard]] (MSC service thread 1-4) Exception sending context initialized event to listener instance of class com.sun.faces.config.ConfigureListener: java.lang.RuntimeException: java.lang.LinkageError: loader constraint violation: when resolving interface method "org.slf4j.ILoggerFactory.getLogger(Ljava/lang/String;)Lorg/slf4j/Logger;" the class loader (instance of org/jboss/modules/ModuleClassLoader) of the current class, org/slf4j/LoggerFactory, and the class loader (instance of org/jboss/modules/ModuleClassLoader) for resolved class, org/slf4j/ILoggerFactory, have different Class objects for the type org/slf4j/Logger used in the signature
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:292) [jsf-impl-2.1.7-jbossorg-2.jar:]
    at org.apache.catalina.core.StandardContext.contextListenerStart(StandardContext.java:3392) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:3850) [jbossweb-7.0.13.Final.jar:]
    at org.jboss.as.web.deployment.WebDeploymentService.start(WebDeploymentService.java:90) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [rt.jar:1.6.0_25]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [rt.jar:1.6.0_25]
    at java.lang.Thread.run(Thread.java:662) [rt.jar:1.6.0_25]
Caused by: java.lang.LinkageError: loader constraint violation: when resolving interface method "org.slf4j.ILoggerFactory.getLogger(Ljava/lang/String;)Lorg/slf4j/Logger;" the class loader (instance of org/jboss/modules/ModuleClassLoader) of the current class, org/slf4j/LoggerFactory, and the class loader (instance of org/jboss/modules/ModuleClassLoader) for resolved class, org/slf4j/ILoggerFactory, have different Class objects for the type org/slf4j/Logger used in the signature
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:242) [openjpa-all-2.2.0.jar:2.2.0]
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:254) [openjpa-all-2.2.0.jar:2.2.0]
    at net.sf.ehcache.CacheManager.<clinit>(CacheManager.java:131) [ehcache-ee-2.6.2.jar:]
    at com.zreflect.emyed.whiteboard.controller.CacheController.<init>(CacheController.java:39) [classes:]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) [rt.jar:1.6.0_25]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) [rt.jar:1.6.0_25]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) [rt.jar:1.6.0_25]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) [rt.jar:1.6.0_25]
    at java.lang.Class.newInstance0(Class.java:355) [rt.jar:1.6.0_25]
    at java.lang.Class.newInstance(Class.java:308) [rt.jar:1.6.0_25]
    at com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:188) [jsf-impl-2.1.7-jbossorg-2.jar:]
    at com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:102) [jsf-impl-2.1.7-jbossorg-2.jar:]
    at com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:409) [jsf-impl-2.1.7-jbossorg-2.jar:]
    at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:269) [jsf-impl-2.1.7-jbossorg-2.jar:]
    at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:256) [jsf-impl-2.1.7-jbossorg-2.jar:]
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:255) [jsf-impl-2.1.7-jbossorg-2.jar:]
    ... 8 more

person user1595858    schedule 25.04.2013    source источник


Ответы (1)


Похоже, вы, вероятно, получаете две разные версии sfl4j. Добавьте <scope>provided</scope> к вашей зависимости slf4j. Другой вариант — предоставить файл jboss-deployment. -structure.xml, чтобы исключить серверы slf4j.

Пример jboss-deployment-structure.xml:

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
    <deployment>
        <exclusions>
            <module name="org.slf4j" />
        </exclusions>
    </deployment>
</jboss-deployment-structure>

Также убедитесь, что у вас нет транзитивных зависимостей slf4j, таких как sfl4j-jdk14.jar.

person James R. Perkins    schedule 25.04.2013
comment
Я также включил jboss-deployment-structure.xml, а в lib есть только одна версия slf4j. Я не получаю никаких ошибок, если не включаю openjpa. Я думаю, что это проблема с openjpa. - person user1595858; 25.04.2013
comment
Как вы включаете OpenJPA? Через модуль или в каталоге lib вашего развертывания? - person James R. Perkins; 25.04.2013
comment
Я включил через модуль - person user1595858; 25.04.2013
comment
Есть ли способ обойтись без использования модуля? По какой-то причине, когда я удаляю модуль openjpa, развертывание завершается сбоем, поскольку он пытается открыть модуль openjpa. - person user1595858; 26.04.2013
comment
Вам также необходимо исключить slf4j для каждого подмодуля, который его использует, так как он будет добавлен по умолчанию в каждый модуль развертывания. - person James R. Perkins; 26.04.2013
comment
Не могли бы вы уточнить пример? - person user1595858; 26.04.2013
comment
Взгляните на docs.jboss.org/ автор/отображение/AS71/. Он показывает, как ссылаться на подмодуль. Проще всего попробовать не исключать серверную версию slf4j, а вместо этого пометить ее как предоставленную в вашем POM. - person James R. Perkins; 26.04.2013
comment
теперь я использую jboss slf4j, но получаю эту ошибку 19:23:48,389 ОШИБКА [stderr] (поток службы MSC 1-6) SLF4J: не удалось загрузить класс org.slf4j.impl.StaticLoggerBinder. 19:23:48,394 ОШИБКА [stderr] (поток службы MSC 1-6) SLF4J: по умолчанию используется реализация регистратора бездействия (NOP) 19:23:48,398 ОШИБКА [stderr] (поток службы MSC 1-6) SLF4J: см. slf4j.org/codes.html#StaticLoggerBinder для получения дополнительной информации. - person user1595858; 26.04.2013
comment
давайте продолжим это обсуждение в чате - person James R. Perkins; 26.04.2013
comment
Также необходимо добавить openJPA в исключение, что устранило проблему. - person user1595858; 29.05.2013
comment
Мне это кажется действительно странным. У меня нет модуля openJPA по умолчанию. - person James R. Perkins; 31.05.2013
comment
Что ж, мы добавили openJPA в качестве модуля, иначе у нас возникли проблемы при добавлении в качестве внешнего jar. - person user1595858; 02.06.2013