Совместимость с Java 8 и 9

У меня есть проект Java (JavaFX), который я хотел бы запустить на Java 8 и 9.
Это приложение использует некоторые внешние, «созданные пользователем» библиотеки, и одна из них импортирует пакеты из jdk8, которые недоступны (ограничены) в java 9. Без этой библиотеки все работает нормально в обеих версиях java, но если я хочу использовать ее функции, программа не запустится на java 9.

Я пробовал редактировать исходный код библиотеки, заменяя проблемный импорт их аналогами jdk9, но, конечно, тогда он будет работать только на java 9. Я также пытался поместить исходный код каждого необходимого класса в файлы библиотеки перед сборкой jar, и это сработало бы, но это кажется глупым и небезопасным, и это сложно из-за количества обязательных занятий.

Возможно ли и безопасно добавить в проект целые библиотеки jdk8 (или библиотеки с эквивалентными классами из java9) с желаемыми пакетами?
Есть ли другое решение?

Короткий ответ: нет. Суть в том, что если ваше приложение или библиотека, от которой оно зависит, использует непубличный API, оно не будет обратно совместимо. Вам нужно будет создать разные версии вашего приложения для Java 8 и Java 9 (используя версию библиотеки, совместимую с Java 9).

James_D 10.05.2018 14:54

Похоже, это классический вариант использования Банки с несколькими выпусками, представленный в Java 9. См. здесь для введения.

Stefan Zobel 10.05.2018 15:38

Спасибо за ваши ответы. Большинство «неправильных» классов были из неподдерживаемых API-интерфейсов sun или com.sun, внутренних, как вы сказали, так что это довольно распространенная проблема. Жаль, что нет простого обходного пути, чтобы сделать его доступным в j9, но я думаю, что в любом случае это будет небезопасно. Прямо сейчас я пытаюсь создать версию библиотеки для java 9, так что, возможно, я смогу объединить ее в эту мульти-релизную банку с версией j8. Однако в jdk9 сложно найти альтернативы некоторым классам.

Sonny Forelli 10.05.2018 22:29

Возможно, вам сначала стоит взглянуть на альтернативные классы в Java 8 (общедоступный API) или во внешних библиотеках. Если вы сначала посмотрите на классы Java 9, то столкнетесь с проблемами, если они недоступны. Снова сделать внутренние классы доступными - это не хорошая идея. Раньше их обычно не трогали из-за жестокого обращения с ними. Это вряд ли будет правдой сейчас, когда они скрыты внутри модульной системы.

Maarten Bodewes 11.05.2018 22:57

Если библиотека не может решить вашу задачу, если вы не взломаете ее внутреннее устройство и не используете его непреднамеренно, вам следует еще раз подумать, используете ли вы правильную библиотеку ...

Holger 12.05.2018 12:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
5
628
0

Другие вопросы по теме