jlink:ed 应用程序中的记录引发异常

Records in jlink:ed application throws exception

在 jlink:ed 应用程序中使用记录(预览功能 java-14),在使用选项时出现以下错误:

options = ['--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages']

java.lang.ClassFormatError: Invalid constant pool index 11 for name in Record attribute in class file 
myproj/MyClass$MyRecord
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(Unknown Source)
    at java.base/java.lang.ClassLoader.defineClass(Unknown Source)

删除选项 --strip-debug

options = ['--compress', '2', '--no-header-files', '--no-man-pages']

我可以用一个简单的 "hello world" module 重现这个问题,它使用 record 功能和 JDK-14。

另一方面,使用 JDK-15 构建(从源代码库构建),它工作正常。

我建议您尝试使用 JDK-15,它具有支持 records 的更新版本的 ASM (ASM 8.0.1)。那应该可以解决您的问题。这是与 ASM (ASM 8.0.1) 更新相关的错误报告:JDK-8241627。在我们开发 JDK 14 时,此版本的 ASM 不可用。我从未见过将 ASM 反向移植到以前的 JDK 版本,并且考虑到 records 是一个预览功能...

假设最终目标是减小自定义 Java 运行时映像的大小,JDK14 上的一个选项(仅 Linux)是只删除本机调试符号(胖子确实是!)并通过使用 —-strip-native-debug-symbols.

保留 Java 调试属性(以避免当前的 ASM 问题)

有关详细信息,请参阅 https://delabassee.com/StrippingDebug-Jlink/