2016-03-30 9 views
1

Мне нужны некоторые функции от Infinispan 8+. Поэтому я обновил свое приложение pom.xml для своей компании с новейшим Infinispan pom.Jboss 6.4 Infinispan 8.2 и JGroups - ClassNotFoundException

Это было довольно просто, но приложение использует jgroups (или его конфигурацию по умолчанию в default-configs/default-jgroups-udp.xml - это место отличается от предыдущих версий infinispan). В версиях по умолчанию есть некоторые параметры (и XSD из Jgroups версии 3.6), поэтому я также столкнулся с jgroups до 3.6.8.Final, поскольку он выглядит как предполагаемая версия (и версия, которая не жалуется на неизвестные параметры в конфигурации по умолчанию в infinispan 8.2)

так П является следующим:

  <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. Я уверен, что он начнется на любом сервере приложений.

Но тогда у меня нет выбора, кроме как запустить его на 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 version 3.2.X).

Есть ли какой-либо способ использовать эту версию jgroups (и, таким образом, Infinispan 8.2) в Jboss 6.4?

Это (приложение) файл уха, поэтому я могу манипулировать файлом jboss-deployment-structure.xml, но до сих пор я только пришел с исключением исходных jgroups Jboss, и это не помогло.

<exclusions> 
     <module name="org.jgroups"/> 
</exclusions> 
+0

JGroups Соблюдает недвижимости 'JGroups. logging.log_factory_class' - можете ли вы установить это на 'org.jgroups.logging.Log4J2LogImpl'? (это отключает интеграцию в протоколы EAP и журналы для того, что там есть log4j2 impl, но это будет отправной точкой ...) –

+0

На самом деле проблема заключается в том, что свойство задано с сервером для внутренней версии JGroups EAP, но его захватывает ваша версия приложения JGroups. Затем приложение JGroups пытается загрузить класс интеграции EAP-JGroups, который не находится в его пути к классам. Таким образом, вы также можете добавить модуль 'org.jgroups.extension' в качестве зависимости, но здесь никаких гарантий нет. –

+0

@Flavius ​​ Ok Я смог изменить свойство Log4J2LogImpl, но (мы используем SL4J) У меня есть java.lang.ClassNotFoundException: org.apache.logging.log4j.Level. Мы используем log4j-over-slf4j, поэтому это должно быть доступно. Я распечатал (в коде) Jar, который загружает класс (Level) - оказалось, что это EAP-6.4.0/modules/system/layers/base/org/jboss/log4j/logmanager/main/log4j-jboss- logmanager-1.1.1.Final-redhat-1.jar. Исключая модуль org.jboss.log4j.logmanager не меняет его. – maslan

ответ

4

В настоящее время это ошибка с комбинацией Infinispan 8 + EAP 6.4. Причина в том, как @Flavius ​​говорит в комментариях. В настоящее время обсуждается, где его исправить, но скорее всего это будет исправлено в EAP 6.4. Я уверен, что это будет сделано в ближайшее время.

Я могу только предложить вам обходные пути.

  1. Использование WildFly - проблема нет там больше
  2. Маленький противный обходной путь, но это работает:
    1. вызов System.clearProperty("jgroups.logging.log_factory_class"); в развертывании
    2. Включить JBoss Logging версии, указанной в infinispan-бом в вашем развертывании (например, добавьте jboss-logging зависимость Maven в вашем pom.XML)
    3. Обеспечение jboss-deployment-structure.xml для развертывания, исключающая JBoss протоколирование сервера, смотрите ниже:

<jboss-deployment-structure> 
     <deployment> 
      <exclusions> 
       <module name="org.jboss.logging" /> 
      </exclusions> 
     </deployment> 
    </jboss-deployment-structure> 
+0

Спасибо, я понимаю, что я должен просто выбрать один из заданных пунктов, а не делать все сразу. :) – maslan

+0

Либо используйте WildFly, либо выполните эти три шага в разделе «Маленькое неприятное обходное решение, но оно работает» :) –

0

Другая возможность, если ни один из перечисленных выше обходные не работают (например, приложение использует другие механизмы регистрации) заключается в реализации собственного http://www.jgroups.org/javadoc/org/jgroups/logging/CustomLogFactory.html

Журнал завод должен вернуть экземпляр журнала, его реализации для любого другого регистратора прямолинеен методы трассировки/ошибки/отладки и т.д.

Тогда этот класс регистратор может быть установлен с System.setProperty("jgroups.logging.log_factory_class","my.company.logging.MyJgroupsLog");