在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)
假设最终目标是减少自定义Java运行时映像的大小,在JDK14上的一个选项(仅Linux)是只删除原生的调试符号(真正的肥肉在哪里!),而保留Java调试属性(以避免当前的ASM问题),方法是使用 —-strip-native-debug-symbols
.
我建议你用JDK-15试试,它有一个ASM的更新版本(ASM 8.0.1
),它们支持 record
s. 这应该能解决你的问题。这是与ASM更新有关的错误报告(ASM 8.0.1
): JDK-8241627. 在我们开发JDK 14时,这个版本的ASM是不可用的。我从来没有看到过ASM对以前的JDK版本的回溯,而且考虑到 record
是一个预览功能...
我可以用一个简单的 "hello world "来重现这个问题。module
使用 record
功能,而JDK-14也是如此。
另一方面,在JDK-15(从源码回购构建)中,它可以正常工作。
移除选项-strip-debug
options = ['--compress', '2', '--no-header-files', '--no-man-pages']