9

在 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)
4

4 回答 4

7

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

于 2020-04-29T16:52:03.917 回答
6

我可以通过一个简单的“hello world”来重现这个问题,module它使用record了 JDK-14 的特性。

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

于 2020-04-29T16:51:55.397 回答
3

假设最终目标是减小自定义 Java 运行时映像的大小,JDK14(仅限 Linux)上的一个选项是仅删除本机调试符号(实际上是胖子!)并保留 Java 调试属性(以避免当前的 ASM 问题)通过使用—-strip-native-debug-symbols.

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

于 2020-04-30T08:50:14.097 回答
3

删除选项 --strip-debug

options = ['--compress', '2', '--no-header-files', '--no-man-pages']
于 2020-04-29T15:01:15.420 回答