Jboss 6.4 Infinispan 8.2 和 JGroups - ClassNotFoundException
Jboss 6.4 Infinispan 8.2 and JGroups - ClassNotFoundException
我需要 Infinispan 8+ 的一些功能。因此,我用最新的 Infinispan pom 更新了我公司的应用程序 pom.xml。
这很简单,但该应用程序使用 jgroups(或其在 default-configs/default-jgroups-udp.xml 中的默认配置 - 此位置与之前版本的 infinispan 不同)。默认版本有一些参数(以及 Jgroups 版本 3.6 中的 XSD)——所以我也将 jgroups 升级到 3.6.8.Final,因为它看起来像是预期的版本(以及不抱怨的版本关于 infinispan 8.2 中默认配置中的未知参数)
所以 pom 如下:
<dependency>
<groupId>org.jgroups</groupId>
<artifactId>jgroups</artifactId>
<version>3.6.8.Final</version>
</dependency>
<dependency>
<groupId>org.infinispan</groupId>
<artifactId>infinispan-core</artifactId>
<version>8.2.0.Final</version>
</dependency>
无论如何 - 使用 spring-boot 和 Jetty 启动此应用程序没有任何问题。我很确定它会在任何应用程序服务器上启动。
但我别无选择,只能在 JBoss 6.4 上 运行 它。
在部署期间,我遇到了一个涉及 jboss.as 类 的异常(这有点出乎意料):
Caused by: org.infinispan.commons.CacheException: Unable to invoke method public void org.infinispan.remoting.transport.jgroups.JGroupsTransport.start() on object of type JGroupsTransport
at org.infinispan.commons.util.ReflectionUtil.invokeAccessibly(ReflectionUtil.java:172)
at org.infinispan.factories.AbstractComponentRegistry$PrioritizedMethod.invoke(AbstractComponentRegistry.java:859)
at org.infinispan.factories.AbstractComponentRegistry.invokeStartMethods(AbstractComponentRegistry.java:628)
at org.infinispan.factories.AbstractComponentRegistry.internalStart(AbstractComponentRegistry.java:617)
at org.infinispan.factories.AbstractComponentRegistry.start(AbstractComponentRegistry.java:542)
at org.infinispan.factories.GlobalComponentRegistry.start(GlobalComponentRegistry.java:234)
... 141 more
Caused by: java.lang.ExceptionInInitializerError
at org.jgroups.conf.XmlConfigurator.<clinit>(XmlConfigurator.java:35)
at org.jgroups.conf.ConfiguratorFactory.getStackConfigurator(ConfiguratorFactory.java:62)
at org.jgroups.JChannel.<init>(JChannel.java:129)
at org.infinispan.remoting.transport.jgroups.JGroupsTransport.buildChannel(JGroupsTransport.java:419)
at org.infinispan.remoting.transport.jgroups.JGroupsTransport.initChannel(JGroupsTransport.java:320)
at org.infinispan.remoting.transport.jgroups.JGroupsTransport.initChannelAndRPCDispatcher(JGroupsTransport.java:366)
at org.infinispan.remoting.transport.jgroups.JGroupsTransport.start(JGroupsTransport.java:190)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.infinispan.commons.util.ReflectionUtil.invokeAccessibly(ReflectionUtil.java:168)
... 146 more
Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: org.jboss.as.clustering.jgroups.LogFactory from [Module "deployment.mymodule-5.0.0.0-SNAPSHOT.ear.appName.war:main" from Service Module Loader]
at org.jgroups.logging.LogFactory.<clinit>(LogFactory.java:31)
... 158 more
Caused by: java.lang.ClassNotFoundException: org.jboss.as.clustering.jgroups.LogFactory from [Module "deployment.mymodule-5.0.0.0-SNAPSHOT.ear.appName.war:main" from Service Module Loader]
at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:213)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:459)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:408)
at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:389)
at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:134)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at org.jgroups.logging.LogFactory.<clinit>(LogFactory.java:28)
... 158 more
我的猜测是 org.jgroups.logging.LogFactory 以某种方式发现 运行ning 在 Jboss 上并尝试使用 org.jboss.as.clustering.jgroups.LogFactory 但是这个版本的 Jboss 没有。 (服务器目录 EAP-6.4.0\modules\system\layers\base\org\jgroups\main 包含 jgroups 版本 3.2.X)。
是否有在 Jboss 6.4 中使用此 jgroups 版本(以及 Infinispan 8.2)的解决方法?
这是(应用程序)一个 ear 文件,因此我可以操作 jboss-deployment-structure.xml 文件,但到目前为止我只附带了排除 Jboss 原始 jgroups,并且这没有帮助。
<exclusions>
<module name="org.jgroups"/>
</exclusions>
这是目前 Infinispan 8 + EAP 6.4 组合的错误。原因正如@Flavius 在评论中所说。目前正在讨论在哪里修复它,但它很可能会在 EAP 6.4 中修复。我相信很快就会完成。
我只能为您提供一个可行的解决方法。
- 使用 WildFly - 问题不再存在
- 有点讨厌的解决方法,但它有效:
- 在部署中调用
System.clearProperty("jgroups.logging.log_factory_class");
- 在您的部署中包含 JBoss 记录 infinispan-bom 中指定的版本(例如,在您的 pom.xml 中添加 jboss-logging Maven 依赖项)
- 为您的部署提供
jboss-deployment-structure.xml
,其中不包括服务器的 JBoss 日志记录,见下文:
<jboss-deployment-structure>
<deployment>
<exclusions>
<module name="org.jboss.logging" />
</exclusions>
</deployment>
</jboss-deployment-structure>
另一种可能性,如果 none 以上解决方法有效(例如,应用程序使用其他日志机制)是实现自己的
http://www.jgroups.org/javadoc/org/jgroups/logging/CustomLogFactory.html
日志工厂必须 return 一个日志实例,为任何其他记录器实现它很简单,方法 trace/error/debug 等
然后这个记录器class可以设置为System.setProperty("jgroups.logging.log_factory_class","my.company.logging.MyJgroupsLog");
我需要 Infinispan 8+ 的一些功能。因此,我用最新的 Infinispan pom 更新了我公司的应用程序 pom.xml。
这很简单,但该应用程序使用 jgroups(或其在 default-configs/default-jgroups-udp.xml 中的默认配置 - 此位置与之前版本的 infinispan 不同)。默认版本有一些参数(以及 Jgroups 版本 3.6 中的 XSD)——所以我也将 jgroups 升级到 3.6.8.Final,因为它看起来像是预期的版本(以及不抱怨的版本关于 infinispan 8.2 中默认配置中的未知参数)
所以 pom 如下:
<dependency>
<groupId>org.jgroups</groupId>
<artifactId>jgroups</artifactId>
<version>3.6.8.Final</version>
</dependency>
<dependency>
<groupId>org.infinispan</groupId>
<artifactId>infinispan-core</artifactId>
<version>8.2.0.Final</version>
</dependency>
无论如何 - 使用 spring-boot 和 Jetty 启动此应用程序没有任何问题。我很确定它会在任何应用程序服务器上启动。
但我别无选择,只能在 JBoss 6.4 上 运行 它。 在部署期间,我遇到了一个涉及 jboss.as 类 的异常(这有点出乎意料):
Caused by: org.infinispan.commons.CacheException: Unable to invoke method public void org.infinispan.remoting.transport.jgroups.JGroupsTransport.start() on object of type JGroupsTransport
at org.infinispan.commons.util.ReflectionUtil.invokeAccessibly(ReflectionUtil.java:172)
at org.infinispan.factories.AbstractComponentRegistry$PrioritizedMethod.invoke(AbstractComponentRegistry.java:859)
at org.infinispan.factories.AbstractComponentRegistry.invokeStartMethods(AbstractComponentRegistry.java:628)
at org.infinispan.factories.AbstractComponentRegistry.internalStart(AbstractComponentRegistry.java:617)
at org.infinispan.factories.AbstractComponentRegistry.start(AbstractComponentRegistry.java:542)
at org.infinispan.factories.GlobalComponentRegistry.start(GlobalComponentRegistry.java:234)
... 141 more
Caused by: java.lang.ExceptionInInitializerError
at org.jgroups.conf.XmlConfigurator.<clinit>(XmlConfigurator.java:35)
at org.jgroups.conf.ConfiguratorFactory.getStackConfigurator(ConfiguratorFactory.java:62)
at org.jgroups.JChannel.<init>(JChannel.java:129)
at org.infinispan.remoting.transport.jgroups.JGroupsTransport.buildChannel(JGroupsTransport.java:419)
at org.infinispan.remoting.transport.jgroups.JGroupsTransport.initChannel(JGroupsTransport.java:320)
at org.infinispan.remoting.transport.jgroups.JGroupsTransport.initChannelAndRPCDispatcher(JGroupsTransport.java:366)
at org.infinispan.remoting.transport.jgroups.JGroupsTransport.start(JGroupsTransport.java:190)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.infinispan.commons.util.ReflectionUtil.invokeAccessibly(ReflectionUtil.java:168)
... 146 more
Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: org.jboss.as.clustering.jgroups.LogFactory from [Module "deployment.mymodule-5.0.0.0-SNAPSHOT.ear.appName.war:main" from Service Module Loader]
at org.jgroups.logging.LogFactory.<clinit>(LogFactory.java:31)
... 158 more
Caused by: java.lang.ClassNotFoundException: org.jboss.as.clustering.jgroups.LogFactory from [Module "deployment.mymodule-5.0.0.0-SNAPSHOT.ear.appName.war:main" from Service Module Loader]
at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:213)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:459)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:408)
at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:389)
at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:134)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at org.jgroups.logging.LogFactory.<clinit>(LogFactory.java:28)
... 158 more
我的猜测是 org.jgroups.logging.LogFactory 以某种方式发现 运行ning 在 Jboss 上并尝试使用 org.jboss.as.clustering.jgroups.LogFactory 但是这个版本的 Jboss 没有。 (服务器目录 EAP-6.4.0\modules\system\layers\base\org\jgroups\main 包含 jgroups 版本 3.2.X)。
是否有在 Jboss 6.4 中使用此 jgroups 版本(以及 Infinispan 8.2)的解决方法?
这是(应用程序)一个 ear 文件,因此我可以操作 jboss-deployment-structure.xml 文件,但到目前为止我只附带了排除 Jboss 原始 jgroups,并且这没有帮助。
<exclusions>
<module name="org.jgroups"/>
</exclusions>
这是目前 Infinispan 8 + EAP 6.4 组合的错误。原因正如@Flavius 在评论中所说。目前正在讨论在哪里修复它,但它很可能会在 EAP 6.4 中修复。我相信很快就会完成。
我只能为您提供一个可行的解决方法。
- 使用 WildFly - 问题不再存在
- 有点讨厌的解决方法,但它有效:
- 在部署中调用
System.clearProperty("jgroups.logging.log_factory_class");
- 在您的部署中包含 JBoss 记录 infinispan-bom 中指定的版本(例如,在您的 pom.xml 中添加 jboss-logging Maven 依赖项)
- 为您的部署提供
jboss-deployment-structure.xml
,其中不包括服务器的 JBoss 日志记录,见下文:
- 在部署中调用
<jboss-deployment-structure>
<deployment>
<exclusions>
<module name="org.jboss.logging" />
</exclusions>
</deployment>
</jboss-deployment-structure>
另一种可能性,如果 none 以上解决方法有效(例如,应用程序使用其他日志机制)是实现自己的 http://www.jgroups.org/javadoc/org/jgroups/logging/CustomLogFactory.html
日志工厂必须 return 一个日志实例,为任何其他记录器实现它很简单,方法 trace/error/debug 等
然后这个记录器class可以设置为System.setProperty("jgroups.logging.log_factory_class","my.company.logging.MyJgroupsLog");