Jboss 6.4 Infinispan 8.2和JGroups - ClassNotFoundException

时间:2016-03-30 13:56:44

标签: java jboss jboss6.x infinispan jgroups

我需要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>

无论如何 - 这个应用程序在使用带Jetty的spring-boot时没有问题。我很确定它会在任何应用程序服务器上启动。

但是我别无选择,只能在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 以某种方式发现它正在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>

2 个答案:

答案 0 :(得分:4)

目前这是Infinispan 8 + EAP 6.4组合的错误。原因正如@Flavius在评论中所说的那样。目前有讨论在哪里解决它,但它很可能在EAP 6.4中得到修复。我相信它很快就会完成。

我只能为您提供有效的解决方法。

  1. 使用WildFly - 此处不再出现此问题
  2. 有点讨厌的解决方法,但它有效:
    1. 在部署中调用System.clearProperty("jgroups.logging.log_factory_class");
    2. 在您的部署中包含在infinispan-bom中指定的JBoss日志记录(例如,在您的pom.xml中添加jboss-logging Maven依赖项)
    3. 为您的部署提供jboss-deployment-structure.xml,不包括服务器的JBoss日志记录,请参阅以下内容:
  3.     <jboss-deployment-structure>
            <deployment>
                <exclusions>
                    <module name="org.jboss.logging" />
                </exclusions>
            </deployment>
        </jboss-deployment-structure>
    

答案 1 :(得分:0)

如果上述解决方法都不起作用(例如,应用程序使用其他日志机制),则另一种可能性是实现自己的 http://www.jgroups.org/javadoc/org/jgroups/logging/CustomLogFactory.html

日志工厂必须返回一个日志实例,使用方法trace / error / debug等为任何其他logger实现它是很简单的。

然后可以使用System.setProperty("jgroups.logging.log_factory_class","my.company.logging.MyJgroupsLog");

设置此记录器类