【问题标题】:Records in jlink:ed application throws exceptionjlink:ed 应用程序中的记录引发异常
【发布时间】:2020-08-13 17:28:03
【问题描述】:

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

【问题讨论】:

  • 有方便试用的链接吗?如果我愿意,可重现示例。
  • @Aksel Willgert,您能否提供一种重现错误的方法?您正在使用的简单源代码+命令?您也可以将详细报告发送至:amber-dev@openjdk.java.net

标签: java jlink java-14 java-record preview-feature


【解决方案1】:

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

【讨论】:

  • 很重要的一点,但为什么不将这种支持也转移到 JDK-14 上呢?据我了解,vesion ASM 8.0.1 在某种程度上对预览功能至关重要,不是吗?
  • 你有错误报告的链接吗?
  • 我已经编辑了我的答案,以添加指向在 JDK 15 中引入 ASM 8.0.1 的错误报告的链接。@Naman,感谢您所做的编辑
【解决方案2】:

我可以通过一个简单的“hello world”module 重现此问题,该record 功能与 JDK-14 一起使用。

另一方面,使用 JDK-15 构建(从源代码库构建),它运行良好。

【讨论】:

  • FWIW,我还使用来自 jdk.java.net 的最新 JDK 15 EA 版本进行了测试。在那里也可以正常工作。
  • 添加到Vicente's answer 中提到的细节,这主要是因为最新 ASM 中的预览功能支持。并不是说我要确认这一点,但这只是您可以进一步研究并更新答案的一点,以便人们真正能够知道“为什么不是 Java-14?”。
【解决方案3】:

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

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

【讨论】:

【解决方案4】:

删除选项--strip-debug

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

【讨论】:

  • 如果使用--strip-debug 开始执行失败,这应该是一个错误,不是吗?
  • @Aksel:你能补充一下为什么这会解决问题吗?
猜你喜欢
  • 1970-01-01
  • 2019-03-11
  • 1970-01-01
  • 2016-12-22
  • 2019-11-04
  • 2010-11-04
  • 1970-01-01
  • 2016-05-04
  • 1970-01-01
相关资源
最近更新 更多