Java/Linux/Docker 101:java.lang.NoClassDefFoundError:java/time/ZoneId

Java/Linux/Docker 101:java.lang.NoClassDefFoundError:java/time/ZoneId

我正在尝试在docker中运行一个jar。 我采取了以下步骤:

  1. sudo docker pull java
  2. sudo docker 运行-i-t java /bin/bash
  3. (在 docker 中) curl -LOhttps://github.com/Netflix/atlas/releases/download/v1.4.1/atlas-1.4.1-standalone.jar
  4. java -jar atlas-1.4.1-standalone.jar

我收到以下错误:

Exception in thread "main" java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at com.simontuffs.onejar.Boot.run(Boot.java:340)
        at com.simontuffs.onejar.Boot.main(Boot.java:166)
Caused by: java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
        at com.netflix.atlas.webapi.ApiSettings$.newDbInstance(ApiSettings.scala:33)
        at com.netflix.atlas.webapi.Main$$anon$1.configure(Main.scala:29)
        at com.netflix.atlas.akka.WebServer.start(WebServer.scala:37)
        at com.netflix.atlas.webapi.Main$.main(Main.scala:33)
        at com.netflix.atlas.webapi.Main.main(Main.scala)
        ... 6 more
Caused by: java.lang.NoClassDefFoundError: java/time/ZoneId
        at com.netflix.atlas.core.db.StaticDatabase.<init>(StaticDatabase.scala:33)
        ... 15 more
Caused by: java.lang.ClassNotFoundException: java.time.ZoneId
        at com.simontuffs.onejar.JarClassLoader.findClass(JarClassLoader.java:713)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at com.simontuffs.onejar.JarClassLoader.loadClass(JarClassLoader.java:630)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        ... 16 more

root@17d3f6f54c1b:/# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
root@17d3f6f54c1b:/# echo $CLASSPATH
<not defined>

我相信修复方法非常简单,我只是不确定它是什么。

提前致谢!

答案1

这似乎是java.time.ZoneId在 Java 1.8 中引入的。您可以在 Docker 容器上和/或您构建它的位置java -version执行此操作。javac -version

我的猜测是,你在本地机器上使用 java 1.8 进行了编译,然后将其推送到容器上使用较低版本 java 的 Docker 中。

相关内容