簡體   English   中英

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

[英]Java 10 Spring Boot Infinispan org.jgroups.logging.Slf4jLogImpl not found

我有一個正在使用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版本。

UPDATE

我們嘗試了Oracle JDK和OpenJDK,行為相同

更新2

我們甚至從容器內部嘗試了java -jar ,沒有運氣

TL; DR

有三個選項可以解決。

  1. 升級到JGroups的4.0.16版本,當前在SNAPSHOT中 編輯:現在在這里發布
  2. 確保設置了“ user.language”和“ user.country”的java屬性。
  3. 使用-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啟動過程中拋出了一個異常,該異常被吞噬了。 從那里,發現在Slf4jLogImpl的實例的創建org.jgroups.logging.LogFactory#getLog(java.lang.Class<?>) new Slf4jLogImpl(clazz) )是一個問題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) )將導致以下new Slf4jLogImpl(clazz)new Slf4jLogImpl(clazz)跟蹤反映了原始發布的問題:

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為null ,因此我們跟蹤了從java.util.Locale#Locale(java.lang.String, java.lang.String, java.lang.String)拋出的先前的NPE。 這是因為JGroup的org.jgroups.logging.Slf4jLogImpl是使用“ user.language”和“ user.country”的java屬性定義的LOCALE字段。 前者未在我們的Locale.java實例中設置,因此Locale.java拋出了NPE。 添加這兩個java屬性應該可以解決此問題。 另外,您可以強制使用JDKLogImpl這樣就不會嘗試實例化Slf4jLogImpl 在前面的答案中,通過傳遞-Djgroups.use.jdk_logger=true提到了這一點。

編輯:在此處發布的最新版本中已修復。

現在,看來這將在即將發布的JGroup 4.0.16.Final( https://github.com/belaban/JGroups/commit/61578c657138f02178c32a564ac9eae7c3976093#diff-93eb0f6a8a49533120120be459bd7ce76 )中得到修復。 在此之前,您可以通過https://repository.jboss.org/nexus/content/repositories/snapshots/org/jgroups/jgroups/4.0.16-SNAPSHOT/獲取帶有修復程序的快照版本。

這不是一個真正的解決方案,但是由於它解除了我們的封鎖,我將與您分享。 另外,也許有人可以通過查看此變通辦法來思考真正的問題。 我們為jgroups通過傳遞SLF4J添加了此JVM參數,並使用JDKLogImpl

-Djgroups.use.jdk_logger=true

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM