我在尝试从我的应用程序而不是 JBoss 附带的库加载时遇到了一些问题。
我正在尝试在我的应用程序中使用最新、最好的 SLF4J,这样做时我收到以下消息:
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [vfszip:/C:/devtools/workspace/g2/.metadata/.plugins/org.jboss.ide.eclipse.as.core/JBoss_5.1_Runtime_Server1302541739184/deploy/ecotrakEar.ear/ecotrak.war/WEB-INF/lib/slf4j-log4j12-1.6.1.jar/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [vfszip:/C:/devtools/jboss-5.1.0.GA/common/lib/slf4j-jboss-logging.jar/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
在我的应用程序中,我的 WAR lib 目录中有以下 jar:
我的项目部署为带有 WAR 的 EAR。所有库都驻留在 WAR 中。
根据一些研究,建议为 JBoss 5.1 创建 jboss-classloading.xml 文件。我为我的 EAR 创建了一个:
<classloading xmlns="urn:jboss:classloading:1.0"
name="ecotrak.ear"
domain="ecotrak.ear"
export-all="NON_EMPTY"
import-all="true"
parent-first="false">
</classloading>
这表明将首先加载 EAR 文件。
我还为我的战争创建了一个:
<classloading xmlns="urn:jboss:classloading:1.0"
name="ecotrak.war"
domain="ecotrak.war"
parent-domain="ecotrak.ear"
top-level-classloader="true"
export-all="NON_EMPTY"
import-all="true"
parent-first="true">
</classloading>
使用此配置,我在启动日志中收到以下错误:
11:18:07,949 ERROR [[/ecotrak]] Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;[Ljava/lang/Object;Ljava/lang/Throwable;)V
at org.apache.commons.logging.impl.SLF4JLocationAwareLog.trace(SLF4JLocationAwareLog.java:107)
为了让我的项目中的 jar 在 JBoss 的之前加载,正确的方法是什么?
您应该使用类似以下内容:
<jboss-app>
<loader-repository>
com.example:archive=unique-archive-name
</loader-repository>
</jboss-app>
在 META-INF/jboss-app.xml 中定义自己的类加载器。
我们将它用于应用程序内部自己的 Hibernate jar 部署。
请参阅https://community.jboss.org/wiki/ClassLoadingConfiguration了解详细信息
我知道这个线程很旧,但我今天遇到了类似的问题,所以我认为问题本身可能会发生在某人身上。
我需要在不同的上下文中运行两个类似的“ear”,并在其子项目中使用相同的包/类名称(JBoss 5.1.0 GA)。
因此,经过一些研究,并尝试使用此处和一些博客提供的完整“jboss-classloading.xml”版本,我在 EAR 上使用了“jboss-classloading.xml”文件的简单版本(没有特定的“jboss”) -classloading.xml' 用于我的子项目 JAR/WAR/等):
<classloading xmlns="urn:jboss:classloading:1.0"
domain="IsolatedDomain"
export-all="NON_EMPTY"
import-all="true">
</classloading>
这包含在我的 EAR 项目 META-INF 目录中。希望这可以帮助其他有类似问题的人。
我从这个网站获得了工作版本: