Записи в jlink: приложение ed выдает исключение
Использование записей (функция предварительного просмотра java-14) в приложении jlink:ed дает ошибку ниже при использовании параметров:
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 ответа
Предполагая, что конечной целью является уменьшение размера настраиваемого образа среды выполнения Java, в JDK14 (только для Linux) можно удалить только собственные символы отладки (где на самом деле жир!) И сохранить атрибуты отладки Java (чтобы избежать текущая проблема ASM) с помощью —-strip-native-debug-symbols
.
См. https://delabassee.com/StrippingDebug-Jlink/ для получения дополнительной информации.
Я предлагаю вам попробовать JDK-15, в котором есть обновленная версия ASM (ASM 8.0.1
) которые поддерживают record
с. Это должно решить вашу проблему. Это отчет об ошибке, относящийся к обновлению ASM (ASM8.0.1
): JDK-8241627. Эта версия ASM не была доступна, пока мы разрабатывали JDK 14. Я никогда не видел обратного порта ASM для предыдущей версии JDK, и учитывая, чтоrecord
s - это функция предварительного просмотра...
Я могу воспроизвести эту проблему простым "привет, мир" module
который использует record
функция вместе с JDK-14.
С другой стороны, со сборкой JDK-15 (построенной из репозитория исходного кода) она просто отлично работает.
Удалить параметр --strip-debug
options = ['--compress', '2', '--no-header-files', '--no-man-pages']