我正在使用Spring Boot应用程序创建一个容器。使用jlink安装Java和必需的模块。看起来像这样:

RUN jlink --compress=2 --no-header-files --no-man-pages \
     --add-modules java.base,java.desktop,java.instrument,java.logging,java.sql,java.xml \
     --output /opt/jre

入口点看起来像:
ENTRYPOINT [ "sh", "-c", "java -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n -jar /app.jar"]

容器启动失败,因为JVM找不到jdwp的本机库。没有jlink包含jdwp二进制文件的文档。可能是设计使最小的运行时不需要支持调试。

因此,我尝试将所需的库手动放入容器的/opt/jre/lib中。我从运行OpenJDK 11的linux vm复制了libjdwp.so,并使用以下命令将其放入我的容器中:
ADD libjdwp.so /opt/jre/lib/

这在启动时导致崩溃:
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x0000000000001e66, pid=1, tid=6
#
# JRE version: OpenJDK Runtime Environment (Zulu11.33+15-CA) (11.0.4+11) (build 11.0.4+11-LTS)
# Java VM: OpenJDK 64-Bit Server VM (11.0.4+11-LTS, mixed mode, tiered, compressed oops, g1 gc, linux-amd64)
# Problematic frame:
# C  0x0000000000001e66

有没有人想出一种一致的方法来向以jlink开头的Java VM提供jdwp?

最佳答案

您将需要添加jdwp openjdk module

RUN jlink --compress=2 --no-header-files --no-man-pages \
 --add-modules java.base,java.desktop,java.instrument,java.logging,java.sql,java.xml,jdk.jdwp.agent \
 --output /opt/jre

10-06 08:31