spring - 找不到Java 10 Spring Boot Infinispan org.jgroups.logging.Slf4jLogImpl

标签 spring docker spring-boot java-10 infinispan-9

我有一个正在使用Java 10构建并运行的Spring Boot应用程序。

java -jar

一切正常。该应用程序启动就可以了。

但是,如果将我的应用程序放入具有完全相同的Java版本的Docker容器中,则我的应用程序将引发以下异常:
Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.jgroups.logging.Slf4jLogImpl
    at org.jgroups.logging.LogFactory.getLog(LogFactory.java:101)
    at org.jgroups.conf.XmlConfigurator.<clinit>(XmlConfigurator.java:33)
    at org.jgroups.conf.ConfiguratorFactory.getStackConfigurator(ConfiguratorFactory.java:62)
    at org.jgroups.JChannel.<init>(JChannel.java:122)
    at org.infinispan.remoting.transport.jgroups.JGroupsTransport.buildChannel(JGroupsTransport.java:591)
    at org.infinispan.remoting.transport.jgroups.JGroupsTransport.initChannel(JGroupsTransport.java:405)
    at org.infinispan.remoting.transport.jgroups.JGroupsTransport.start(JGroupsTransport.java:389)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at org.infinispan.commons.util.SecurityActions.lambda$invokeAccessibly$0(SecurityActions.java:79)
    ... 104 common frames omitted

我正在使用此版本的Java:
java version "10.0.2" 2018-07-17
Java(TM) SE Runtime Environment 18.3 (build 10.0.2+13)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.2+13, mixed mode)

Docker版本为:
Client:
 Version:           18.06.1-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        e68fc7a
 Built:             Tue Aug 21 17:21:31 2018
 OS/Arch:           darwin/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.1-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       e68fc7a
  Built:            Tue Aug 21 17:29:02 2018
  OS/Arch:          linux/amd64
  Experimental:     true

我的Docker使用Alpine基本镜像alpine:latest。我通过以下链接在容器中安装Java:
curl -jksSLH "Cookie: oraclelicense=accept-securebackup-cookie" -o /tmp/java.tar.gz \
      http://download.oracle.com/otn-pub/java/jdk/10.0.2+13/19aef61b38124481863b1413dce1855f/jdk-10.0.2_linux-x64_bin.tar.gz

我真的很困惑,因为从Docker容器外部我的应用程序运行正常,但是在Docker容器内部却没有。无论哪种情况,我都使用相同的Java版本。

更新

我们尝试了Oracle JDK和OpenJDK,行为相同

更新2

我们甚至从容器内部尝试过java -jar,没有运气

最佳答案

TL; DR

有三个选项可以解决。

  • 升级到JGroups的4.0.16版本,当前在SNAPSHOT中。编辑:现在released here
  • 确保已设置“user.language”和“user.country”的java属性。
  • 使用-Djgroups.use.jdk_logger=true强制JDKLogImpl。 (由Perimosh提及)

  • 说明

    在以下情况下遇到此问题。

    Apache Camel + JGroups在本地环境中运行良好。将其部署在Docker实例中的其他位置,我们在其中获得了以下堆栈跟踪:
    2018-11-19 13:38:03.063  INFO 582 --- [           main] o.a.camel.spring.boot.RoutesCollector    : Loading additional Camel XML routes from: classpath:camel/*.xml
    2018-11-19 13:38:03.064  INFO 582 --- [           main] o.a.camel.spring.boot.RoutesCollector    : Loading additional Camel XML rests from: classpath:camel-rest/*.xml
    2018-11-19 13:38:03.107  INFO 582 --- [           main] o.a.camel.spring.SpringCamelContext      : Apache Camel 2.22.2 (CamelContext: camel-1) is starting
    2018-11-19 13:38:03.111  INFO 582 --- [           main] o.a.c.m.ManagedManagementStrategy        : JMX is enabled
    2018-11-19 13:38:03.480  INFO 582 --- [           main] o.a.camel.spring.SpringCamelContext      : StreamCaching is not in use. If using streams then its recommended to enable stream caching. See more details at     http://camel.apache.org/stream-caching.html
    2018-11-19 13:38:03.597  INFO 582 --- [           main] o.a.camel.spring.SpringCamelContext      : Apache Camel 2.22.2 (CamelContext: camel-1) is shutting down
    2018-11-19 13:38:03.616  WARN 582 --- [           main] o.a.camel.spring.SpringCamelContext      : Error occurred while shutting down service: org.apache.camel.component.jgroups.cluster.    JGroupsLockClusterService@10fa5af5. This exception will be ignored.
    java.lang.NullPointerException: null
        at org.apache.camel.component.jgroups.cluster.JGroupsLockClusterView.doStop(JGroupsLockClusterView.java:109)
        at org.apache.camel.support.ServiceSupport.stop(ServiceSupport.java:102)
        at org.apache.camel.impl.cluster.AbstractCamelClusterService.lambda$doStop$2(AbstractCamelClusterService.java:134)
        at org.apache.camel.util.concurrent.LockHelper.doWithReadLockT(LockHelper.java:54)
        at org.apache.camel.impl.cluster.AbstractCamelClusterService.doStop(AbstractCamelClusterService.java:130)
        at org.apache.camel.support.ServiceSupport.stop(ServiceSupport.java:102)
        at org.apache.camel.util.ServiceHelper.stopService(ServiceHelper.java:142)
        at org.apache.camel.util.ServiceHelper.stopAndShutdownService(ServiceHelper.java:205)
        at org.apache.camel.impl.DefaultCamelContext.shutdownServices(DefaultCamelContext.java:3663)
        at org.apache.camel.impl.DefaultCamelContext.shutdownServices(DefaultCamelContext.java:3688)
        at org.apache.camel.impl.DefaultCamelContext.shutdownServices(DefaultCamelContext.java:3676)
        at org.apache.camel.impl.DefaultCamelContext.doStop(DefaultCamelContext.java:3567)
        at org.apache.camel.support.ServiceSupport.stop(ServiceSupport.java:102)
        at org.apache.camel.impl.DefaultCamelContext.stop(DefaultCamelContext.java:3220)
        at org.apache.camel.spring.SpringCamelContext.stop(SpringCamelContext.java:148)
        ...
    
    2018-11-19 13:38:03.679  INFO 582 --- [           main] o.a.camel.spring.SpringCamelContext      : Apache Camel 2.22.2 (CamelContext: camel-1) uptime 0.570 seconds
    2018-11-19 13:38:03.680  INFO 582 --- [           main] o.a.camel.spring.SpringCamelContext      : Apache Camel 2.22.2 (CamelContext: camel-1) is shutdown in 0.082 seconds
    2018-11-19 13:38:03.716  INFO 582 --- [           main] org.mongodb.driver.connection            : Closed connection [connectionId{localValue:2, serverValue:2}] to localhost:43115 because the pool has been closed.
    

    如您所见,Apache Camel尝试启动,但是从不启动,最终关闭。因此,JGroups获得了NPE,因为它希望Camel能够成长。
    调试代码后,似乎在Camel启动过程中抛出了一个异常,该异常被吞噬了。
    从那里发现在org.jgroups.logging.LogFactory#getLog(java.lang.Class<?>)(new Slf4jLogImpl(clazz))中创建Slf4jLogImpl实例是一个问题Method threw 'java.lang.ExceptionInInitializerError' exception.:
    java.lang.NullPointerException: null
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at org.jgroups.logging.LogFactory.getLog(LogFactory.java:101)
    at org.jgroups.conf.XmlConfigurator.<clinit>(XmlConfigurator.java:33)
    at org.jgroups.conf.ConfiguratorFactory.getXmlConfigurator(ConfiguratorFactory.java:210)
    at org.jgroups.conf.ConfiguratorFactory.getStackConfigurator(ConfiguratorFactory.java:91)
    at org.jgroups.JChannel.<init>(JChannel.java:130)
    ...
    

    在调试器中第二次运行(new Slf4jLogImpl(clazz))会导致以下堆栈跟踪,反射(reflect)了原始发布的问题:
    java.lang.NoClassDefFoundError: Could not initialize class org.jgroups.logging.Slf4jLogImpl
    at org.jgroups.logging.LogFactory.getLog(LogFactory.java:101)
    at org.jgroups.conf.XmlConfigurator.<clinit>(XmlConfigurator.java:33)
    at org.jgroups.conf.ConfiguratorFactory.getXmlConfigurator(ConfiguratorFactory.java:210)
    at org.jgroups.conf.ConfiguratorFactory.getStackConfigurator(ConfiguratorFactory.java:91)
    at org.jgroups.JChannel.<init>(JChannel.java:130)
    

    结果上的这种差异是由于类加载器先前缓存Class.forName()调用的结果以确定未找到类定义而导致的。

    最后,由于country是java.util.Locale#Locale(java.lang.String, java.lang.String, java.lang.String),所以我们跟踪了先前从null抛出的NPE。这是因为JGroup的org.jgroups.logging.Slf4jLogImpl是使用“user.language”和“user.country”的java属性定义的LOCALE字段。前者未在我们的docker实例中设置,因此Locale.java抛出了NPE。添加这两个java属性应该可以解决此问题。另外,您可以强制使用JDKLogImpl,以便永远不会尝试将Slf4jLogImpl实例化。在前面的答案中,通过传递-Djgroups.use.jdk_logger=true提到了这一点。

    编辑:在最新版本released here中修复。

    现在,看起来这将在即将发布的JGroup 4.0.16.Final(https://github.com/belaban/JGroups/commit/61578c657138f02178c32a564ac9eae7c3976093#diff-93eb0f6a8a4953312098be459bd7ce76)中修复。在此之前,您可以在https://repository.jboss.org/nexus/content/repositories/snapshots/org/jgroups/jgroups/4.0.16-SNAPSHOT/处获得带有修复程序的快照版本。

    关于spring - 找不到Java 10 Spring Boot Infinispan org.jgroups.logging.Slf4jLogImpl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52368423/

    相关文章:

    java - 以 Json 形式对 <T> 进行通用响应

    Spring 没有唯一的 bean 类型

    java - 从国家列表中填充州的下拉菜单 - angularjs

    docker - VisualVM 无​​法连接到除 1099 以外的任何端口

    linux - docker错误elasticsearch镜像无法使用安装文件提供的参数访问

    java - 如何在 JSESSIONID Cookie 中设置 SameSite=None

    java - 私有(private)方法的方法拦截器

    azure - 部署 Azure 容器而不运行它们

    spring-boot - 在 gradle 5 中查找 BOM 贡献的所有依赖项

    java - 如何并行运行更多相同@Scheduled 作业的执行?