Перенос проекта Java 8 на Java 11 - PullRequest
1 голос
/ 11 февраля 2020

У нас есть хранилище, построенное с использованием Java 8. В хранилище есть несколько служб отдыха. Мы хотим перейти на Java 11 и попытаться найти лучший способ сделать это. Мы рассматриваем возможность делать модуль за модулем. Например, изменив одну службу на Java 11, а остальные - Java 8. Мы не уверены, поддерживает ли Maven это?

Ответы [ 2 ]

2 голосов
/ 11 февраля 2020

Мое предложение - обновить весь проект. Попытка иметь некоторые Java8 и некоторые модули Java11 может быть очень сложной. Как вы уже знаете, начиная с Java9 появляется модуль. Ответ очень общий c, поэтому сложно дать подробный ответ. Я полагаю:

  • Ваш проект управляется с помощью maven
  • У вас много артефактов (jar)
  • Вы используете какую-то библиотеку или фреймворк (кто сказал Spring?)
  • Вы используете Source Version Control (например, Git или Subversion)
  • У вас есть многомодульный проект
  • Написанный вами код работает на Java8 и на Платформа Java11

Мой предложенный план:

  1. Создайте ветку на вашем SV C для версии проекта Java11 и начните работать над ней.
  2. Создайте родительский модуль для общих определений
  3. Обновите плагин maven и всю вашу библиотеку до последней версии. Для компилятора Maven установите цель Java11 (Java11 поддерживается только последней версией плагина компилятора Maven).
  4. Для каждого модуля определите экспортируемые пакеты (и укажите, какие пакеты требуются)
  5. Если имеется много модулей, начните с нескольких из них, а затем включите остатки.

Если это может помочь вам, давайте взглянем на этот простой проект на github (Он нацелен на Java11, и это многомодульный проект Maven).

Надеюсь, это поможет.

1 голос
/ 11 февраля 2020

Отказ от ответственности: это не ответ, а лишь частичный отчет о моем недавнем опыте. Не стесняйтесь пометить этот ответ, если считаете, что он не соответствует стандартам SO.

Поддерживает ли Maven это?

Да, используйте плагин компилятора 3.8. 0 / 3.8.1

Однако эта миграция требует дополнительной заботы.

Недавно мы сделали что-то подобное, мигрировав с ORACLE JDK 8 на OPENJDK 11. Так как у нас есть хаудреды репозиториев с разными миссии, мы столкнулись со всеми видами проблем. Просто чтобы привести некоторые из них, которые я получил здесь в своем почтовом ящике, помеченном как [jdk11_migration]:

  • Это совершенно очевидно, но я хотел бы подчеркнуть это для перехода с java 8–11, мы также должны соответствовать требованиям java 9 и 10

  • Некоторые плагины Maven, такие как cobertura, не поддерживают Java 11, и я думаю, что они никогда не будут поддержать это. В некоторых случаях эти плагины достигли заброшенной стадии жизненного цикла. Решение было искать альтернативы в зависимости от конкретного случая. Например, мы заменили cobertura на Jacoco.

  • rt.jar и tools.jar были удалены! Все, на что вы ссылались из-за откровенности, вероятно, сломается.

  • некоторые классы, которые мы не должны использовать в java 9 или меньше, сейчас в java 11 больше не существуют. Я говорю о доступе к классам в таких пакетах, как sun. *, Sun.mis c et c. Решение состоит в том, чтобы искать замену кода «один к одному» или рефакторинг кода, чтобы избежать его использования.

  • Отражение обычно является последним используемым маркером и, в этих случаях, в java 9 и выше мы получаем предупреждающие сообщения, такие как:

    WARNING: An illegal reflective access operation has occurred
    WARNING: Illegal reflective access by ...
    WARNING: Please consider reporting this to the maintainers of ...
    WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
    WARNING: All illegal access operations will be denied in a future release
    

Хотя это не совсем решение, есть флаг, чтобы избавиться от этого предупреждения --illegal-access = разрешать . Это особенно важно при использовании подключаемого модуля surefire maven.

  • Java 9 представил модульную систему, тогда «сейчас» мы имеем явление cla sh упаковок. Например, сообщения типа «Пакет org.w3 c .dom доступен из более чем одного модуля:, java. xml». Решение состоит в том, чтобы найти источник избыточного включения (особенно дублированные зависимости maven или зависимости) и удалить его.

Хотя это не было проблемой для нас, я только что отметил, что ваш репозиторий состоит в REST компонентов в большинстве. Возможно, вы столкнетесь с проблемами ClassNotFound в отношении некоторых пакетов, таких как javax. xml .bind, которые в основном были исключены из java стандартной версии. Вы можете исправить это, включив их явно в ваш pom. xml.

К счастью, вы можете найти хорошие вопросы и ответы для каждой проблемы, которые вы найдете в вашей миграции здесь, в SO или через inte rnet. В дикой природе есть несколько руководств по миграции, которые являются хорошей отправной точкой. Специфические проблемы c, такие как запутывание и интеграция с IDE, могут занять немного времени, но, по моему опыту, эта миграция прошла безболезненно, чем я предполагал.

...