scala - akka-http web-app 无法在最小的 docker jre 11 上启动(scala12 akka-http 的哪些 java 模块)?

标签 scala docker akka-http java-11

我正在尝试对我的(否则运行良好)非常小的 akka-http webapp 进行 Dockerize。我正在使用指示的构建文件 here .为了方便添加:

FROM alpine:latest as packager

RUN apk --no-cache add openjdk11-jdk openjdk11-jmods

ENV JAVA_MINIMAL="/opt/java-minimal"

# build minimal JRE
RUN /usr/lib/jvm/java-11-openjdk/bin/jlink \
    --verbose \
    --add-modules \
        java.base,java.sql,java.naming,java.desktop,java.management,java.security.jgss,java.instrument \
    --compress 2 --strip-debug --no-header-files --no-man-pages \
    --release-info="add:IMPLEMENTOR=radistao:IMPLEMENTOR_VERSION=radistao_JRE" \
    --output "$JAVA_MINIMAL"

FROM alpine:latest

ENV JAVA_HOME=/opt/java-minimal
ENV PATH="$PATH:$JAVA_HOME/bin"

COPY --from=packager "$JAVA_HOME" "$JAVA_HOME"
COPY build/libs/application.jar app.jar

ENTRYPOINT ["java","-jar","/app.jar"]

但是它无法启动并出现以下错误。因为我使用的是 jre11 的简约设置,所以我想我可能会遗漏一些模块。但我不确定,我不知道哪些 java 模块对于 akka-http scala-12 应用程序是必需的。希望有人知道??

Exception in thread "main" java.lang.ExceptionInInitializerError
    at akka.dispatch.AbstractNodeQueue.<clinit>(AbstractNodeQueue.java:181)
    at akka.actor.LightArrayRevolverScheduler.<init>(LightArrayRevolverScheduler.scala:157)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.base/java.lang.reflect.Constructor.newInstance(Unknown Source)
    at akka.actor.ReflectiveDynamicAccess.$anonfun$createInstanceFor$1(ReflectiveDynamicAccess.scala:33)
    at scala.util.Try$.apply(Try.scala:209)
    at akka.actor.ReflectiveDynamicAccess.createInstanceFor(ReflectiveDynamicAccess.scala:28)
    at akka.actor.ReflectiveDynamicAccess.$anonfun$createInstanceFor$5(ReflectiveDynamicAccess.scala:39)
    at scala.util.Success.flatMap(Try.scala:247)
    at akka.actor.ReflectiveDynamicAccess.createInstanceFor(ReflectiveDynamicAccess.scala:39)
    at akka.actor.ActorSystemImpl.createScheduler(ActorSystem.scala:925)
    at akka.actor.ActorSystemImpl.<init>(ActorSystem.scala:786)
    at akka.actor.ActorSystem$.apply(ActorSystem.scala:246)
    at akka.actor.ActorSystem$.apply(ActorSystem.scala:289)
    at akka.actor.ActorSystem$.apply(ActorSystem.scala:234)
    at akka.actor.ActorSystem$.apply(ActorSystem.scala:225)
    at nl.d8r.stretchsketch.WebServer$.main(Server.scala:37)
    at nl.d8r.stretchsketch.WebServer.main(Server.scala)
Caused by: java.lang.ExceptionInInitializerError
    at akka.util.Unsafe.<clinit>(Unsafe.java:42)
    at akka.dispatch.AbstractNodeQueue.<clinit>(AbstractNodeQueue.java:179)
    ... 19 more
Caused by: java.lang.NoClassDefFoundError: sun/misc/Unsafe
    at akka.util.Unsafe.<clinit>(Unsafe.java:22)
    ... 20 more
Caused by: java.lang.ClassNotFoundException: sun.misc.Unsafe
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
    at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
    ... 21 more

最佳答案

您需要在 ENTRYPOINT 子句中添加一个 jvm 参数:

--add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED

应该如下所示:

ENTRYPOINT ["java", "--add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED", "-jar","/app.jar"]

关于scala - akka-http web-app 无法在最小的 docker jre 11 上启动(scala12 akka-http 的哪些 java 模块)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57749183/

相关文章:

使用 mockito 库的 Scala 单元测试

scala - 为什么在 LiftWeb/Scala 中使用 Box/Option 而不是 Exception?

docker - 如何在 docker 容器中导出 DGraph 数据库 (Windows)

bash - 使用非root用户在Dockerfile中运行root服务

postgresql - 使用 spray-json、Slick 和 PostgreSQL 的 DateTime 堆栈溢出

scala - 在流中链接 Akka-http-client 请求

scala - 为什么 Scala 将 List[Any] 提升为 List[Long]?

scala - 为什么这个 LR 代码在 spark 上运行太慢?

java - Scala 将很长的字符串解析为日期

docker-compose:容器时区