jlink:ed应用程序中的记录会产生异常。

问题描述 投票:0回答:1

在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 record jlink java-14
1个回答
3
投票

假设最终目标是减少自定义Java运行时映像的大小,在JDK14上的一个选项(仅Linux)是只删除原生的调试符号(真正的肥肉在哪里!),而保留Java调试属性(以避免当前的ASM问题),方法是使用 —-strip-native-debug-symbols.

https:/delabassee.comStrippingDebug-Jlink。 了解一些细节。


8
投票

我建议你用JDK-15试试,它有一个ASM的更新版本(ASM 8.0.1),它们支持 records. 这应该能解决你的问题。这是与ASM更新有关的错误报告(ASM 8.0.1): JDK-8241627. 在我们开发JDK 14时,这个版本的ASM是不可用的。我从来没有看到过ASM对以前的JDK版本的回溯,而且考虑到 record是一个预览功能...


7
投票

我可以用一个简单的 "hello world "来重现这个问题。module 使用 record 功能,而JDK-14也是如此。

另一方面,在JDK-15(从源码回购构建)中,它可以正常工作。


3
投票

移除选项-strip-debug

options = ['--compress', '2', '--no-header-files', '--no-man-pages']
© www.soinside.com 2019 - 2024. All rights reserved.