Записи в 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, и учитывая, чтоrecords - это функция предварительного просмотра...

Я могу воспроизвести эту проблему простым "привет, мир" module который использует record функция вместе с JDK-14.

С другой стороны, со сборкой JDK-15 (построенной из репозитория исходного кода) она просто отлично работает.

Удалить параметр --strip-debug

options = ['--compress', '2', '--no-header-files', '--no-man-pages']
Другие вопросы по тегам