Переходим на Java 10: проблемы и решения

Итак, прошел уже месяц с выхода Java 10. Уже даже успел подойти первый апдейт. А это значит — пора переходить и нам :) Вслед за переходом на Java 9.

Установка

Джаву, как всегда, можно скачать и установить вручную. Но это не мой путь. Я обычно предпочитаю устанавливать из готовых пакетов (которые, к сожалению, выходят месяц-два спустя). Например, так:

sudo add-apt-repository ppa:linuxuprising/java
sudo apt-get update
sudo apt-get install oracle-java10-installer

Проблема с IntelliJ IDEA

Первая проблема, с которой я столкнулся, была в IDE. Я сидел на IntelliJ IDEA 2017.3. И при добавлении JDK 10 в проект идея отказывалась признавать корневую директорию JDK как «The selected directory is not a valid home for JDK». Проблема легко решается переходом на 2018.1.2. Но должен предупредить — в новой версии идеи довольно много неприятных мелких багов. Надеюсь, ситуация в Эклипсе получше.

Проблема с maven-compiler-plugin

Первым делом после подключения JDK 10 я попробовал собрать проект мавеном. Не получилось:

Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile (default-compile) on project push: Execution default-compile of goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile failed.: IllegalArgumentException -> [Help 1]</em>

Гуглинг помог быстро найти проблему, а именно в maven-compiler-plugin. Как оказалось, этот плагин использует внутри старую версию библиотеки asm, которая не поддерживает Java 10. К счастью, ее легко можно пофиксить, изменив зависимость в плагине:

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-compiler-plugin</artifactId>
   <version>3.7.0</version>
   <configuration>
       <source>10</source>
       <target>10</target>
   </configuration>
   <dependencies>
       <dependency>
           <groupId>org.ow2.asm</groupId>
           <artifactId>asm</artifactId>
           <version>6.1.1</version>
       </dependency>
   </dependencies>
</plugin>

Проблема с maven-surefire-plugin

Проект собрался. Настало время билда с тестами. И опять получился нежданчик. Теперь уже в maven-surefire-plugin:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.20.1:test (default-test) on project Blynk: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.20.1:test failed.: NullPointerException

Я особо не искал причину, а по опыту переезда на девятку — просто проапдейтил плагин к последней версии 2.21.0, что и решило проблему.

Опять IDE

Сборка с тестами прошла успешно, и ничего не отвалилось, что уже довольно неплохо (в отличие от девятки). Теперь я попробовал запустить тесты из идеи. И получил довольно странную ошибку:

Release version 11 not supported

Выяснилось вот что. Во-первых, «Language Level» в модулях проекта оказался на Level 11. Во-вторых, настройка «Module JDK» в каждом из модулей была на 9-ке. Похоже на какую-то багу новой Идеи. В общем, после проставления корректных версий вручную — тесты запустились и успешно прошли.

Travis CI

Так как наш проект open-source, мы используем бесплатный и публичный Travis Cloud для прогонки тестов. 10-ка все еще не имеет нативной поддержки от Тревиса, поэтому пришлось искать обходные пути.

Travis.yml:

language: java

before_install:
 - wget https://github.com/sormuras/bach/raw/master/install-jdk.sh

matrix:
 include:
     - env: JDK='OpenJDK 10'
       install: . ./install-jdk.sh -F 10 -L GPL</em>

Lombok

Если вы используете или собираетесь использовать библиотеку Lombok в вашем проекте, то с десяткой придется подождать. Так как Lombok fails with JDK 10. Хотя, с другой стороны — это отличный повод выпилить его из вашего проекта.

P. S. 10-ка уже 2 дня крутится на наших продакшн-серверах. Пока никаких проблем выявлено не было. В отличие от 9-ки, никакого изменения по перформансу или потреблении памяти замечено не было.

Я уже перевел часть кода на var. Пока хорошо. Вот, например, кусок кода, который мне нравится больше всего:


А вы уже попробовали Java 10?

Для тех, кто же все-таки решил перейти на 10-ку, — вот отличная рекомендация, когда использовать var:

Похожие статьи:
Нинішній ринок ІТ переповнений новими методологіями управління і контролю робочого процесу. Специфіка роботи кожної компанії чи,...
Привет! Этот дайджест мы решили посвятить Ruby/Rails Gems, собрав гемы для решения типичных задач: от тестирования до безопасности...
Операторо местной проводной связи «Московская городская телефонная сеть», входящий в Группу МТС, сообщил о снижении...
Запись на первое бесплатное занятие онлайн курса. Начало урока 3 сентября в 10:30. Здравствуйте, дорогие друзья...
Разработчики серверных, клиентских или настольных приложений на JavaScript нередко сталкиваются с проблемами,...
Яндекс.Метрика