由于 Maven 的 SLF4J 模块加载错误,Hibernate 无法在 Wildfly 上序列化对象

Hibernate can't serialize object on Wildfly due to SLF4J Module load error with Maven

我是 J2EE 的新手,所以请多多关照...

我正在使用 Wildfly (JBOSS) 8.2.0.Final,我遇到了休眠问题。每次我尝试反序列化一个对象时,我都会从休眠中得到一个错误:

Caused by: java.lang.ClassNotFoundException: org.slf4j.impl.Slf4jLogger 
from [Module "org.hibernate:main" from local module loader @4253c155 
(finder: local module finder @8b9d578 (roots: C:\dev\wildfly-8.2.0.Final\modules,
C:\dev\wildfly-8.2.0.Final\modules\system\layers\base))]

据我了解 SLF4J 的狂野世界,wildfly 有一个自定义实现,正确的做法是从您的依赖项中排除对 org.slf4j 以外的任何内容的所有引用,并将 slf4j-api 包含在你的依赖。我可以确认我的 lib 文件夹中确实有 slf4j-api JAR,但我什至不知道如何开始调试它。请注意,应用程序的其他方面正在加载并正确记录,只有当我尝试反序列化 hibernate 尝试记录并失败并出现此异常的内容时。

以下是 pom 的一些摘录:

<!-- logging -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <scope>provided</scope>
</dependency>   

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-ejb-plugin</artifactId>
    <configuration>
        <archive>
            <addMavenDescriptor>false</addMavenDescriptor>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib/</classpathPrefix>
            </manifest>
            <manifestEntries>
                <Dependencies>org.slf4j org.apache.xerces services</Dependencies>
                <Class-Path>xxx-myproject-${project.version}.jar</Class-Path>
            </manifestEntries>
        </archive>
    </configuration>
</plugin>

当前正在下载的slf4j与当前的Hibernate版本不匹配。您尝试将现有的 slf4j 依赖项替换为以下依赖项,或者在 maven 依赖项中提供特定版本。

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.12</version>
</dependency>

我也有类似的问题,但是修正的很不正常。

我有一个可序列化的 class。在 class 中,我使用的是记录器:

private Logger LOGGER = LoggerFactory.getLogger(MyClass.class);

但这 LOGGER 不是短暂的或静态的。因此,在运行时,错误 java.lang.ClassNotFoundException: org.slf4j.impl.Slf4jLogger 发生在我们的 class 对 serialize/unserialize 负责。所以我做了一点改动:

private static Logger logger = LoggerFactory.getLogger(MyClass.class);

问题解决了。