null

Проблема совместимости Liferay 7 и OpenJDK 11.0.6

Люди делятся на два типа: те, кто постоянно обновляют ПО, и те, кто старается лишний раз не трогать то, что уже работает. Я отношусь к первым, наивно полагая, что обновления приносят исправления багов и новые фичи. К сожалению, в реальности они также приносят новые баги и проблемы совместимости. Это произошло с последней версией OpenJDK 11.0.6, вышедшей менее месяца назад (14.01.2020), после обновления которой перестали работать встроенные портлеты Liferay, а в логах появился NPE.

Caused by: java.lang.NullPointerException: entry
    at java.base/java.util.Objects.requireNonNull(Objects.java:246)
    at java.base/java.util.zip.ZipFile.getInputStream(ZipFile.java:372)
    at com.liferay.portal//com.liferay.portal.kernel.zip.ZipFileUtil.openInputStream(ZipFileUtil.java:36)
    at com.liferay.portal.osgi.web.servlet.jsp.compiler.internal.JarJavaFileObject.openInputStream(JarJavaFileObject.java:39)

Проблема LPS-107983 зарегистрирована и ждет решения, но тем временем работа ждать не может, и разработчику нужен рабочий Liferay, чтобы продолжать трудиться над проектом. Было бы неплохо откатиться до предыдущей версии JDK, где проблемы не было. Звучит как вполне типичная задача - даунгрейднуть пакет до предыдущей версии, но всё ли так просто.

Смотрим доступные в репозитории версии пакета.

$ sudo apt policy openjdk-11-jdk

openjdk-11-jdk:
  Установлен: 11.0.6+10-1ubuntu1~18.04.1
  Кандидат:   11.0.6+10-1ubuntu1~18.04.1
  Таблица версий:
 *** 11.0.6+10-1ubuntu1~18.04.1 500
        500 http://ru.archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages
        500 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages
        100 /var/lib/dpkg/status
     10.0.1+10-3ubuntu1 500
        500 http://ru.archive.ubuntu.com/ubuntu bionic/main amd64 Packages

И тут нас ожидает разочарование: предыдущая доступная версия пакета - JDK 10, а не 11. Не хотелось бы откатываться настолько далеко. На launcpad также можно видеть, что пакет openjdk-lts версии  11.0.5+10-0ubuntu1.1 (в состав которого входит в том числе JDK) был удалён 30.01.2020 в связи с выходом новой версии. Исходники доступны, можно собрать их самому, но не хочется.

$ sudo apt install openjdk-11-jdk=11.0.5+10-0ubuntu1.1~18.04
Чтение списков пакетов… Готово
Построение дерева зависимостей       
Чтение информации о состоянии… Готово
E: Версия «11.0.5+10-0ubuntu1.1~18.04» для «openjdk-11-jdk» не найдена

Честно говоря, найти и скачать предыдущую версию пакета openjdk-11-jdk оказалось сложнее, чем можно было подумать. В архиве проекта OpenJDK нашлась только версия 11.0.2, что в общем нам подходит. Качаем её, распаковываем и кладём в /usr/lib/jvm/.

$ sudo cp -r ~/Downloads/java-11.0.2-openjdk /usr/lib/jvm/

Тут есть два варианта: можно использовать старую версию параллельно с новой, просто создав символическую ссылку с именем java11, как показано ниже, или удалить текущий JDK 11 версии 11.0.6 и переправить все ссылки (java, javac и т.д.) на JDK 11.0.2.

$ sudo ln -s /usr/lib/jvm/java-11.0.2-openjdk/bin/java /usr/bin/java11

Поскольку это временное решение, мне достаточно одной ссылки на правильную java для компиляции проета и исправления пути к JVM в конфигах сервера, на котором развёрнут Liferay (у меня бандл с Wildfly, так что править пришлось JAVA_HOME в [wildfly-home]/bin/standalone.conf).

В принципе такие проблемы легко обходятся использованием докер контейнеров, где версии пакетов фиксированы и легко выбрать нужную.