У меня есть проект Java (JavaFX), который я хотел бы запустить на Java 8 и 9.
Это приложение использует некоторые внешние, «созданные пользователем» библиотеки, и одна из них импортирует
пакеты из jdk8, которые недоступны (ограничены) в java 9.
Без этой библиотеки все работает нормально в обеих версиях java, но если я хочу использовать ее функции, программа не запустится на java 9.
Я пробовал редактировать исходный код библиотеки, заменяя проблемный импорт их аналогами jdk9, но, конечно, тогда он будет работать только на java 9. Я также пытался поместить исходный код каждого необходимого класса в файлы библиотеки перед сборкой jar, и это сработало бы, но это кажется глупым и небезопасным, и это сложно из-за количества обязательных занятий.
Возможно ли и безопасно добавить в проект целые библиотеки jdk8 (или библиотеки с эквивалентными классами из java9) с желаемыми пакетами?
Есть ли другое решение?
Похоже, это классический вариант использования Банки с несколькими выпусками, представленный в Java 9. См. здесь для введения.
Спасибо за ваши ответы. Большинство «неправильных» классов были из неподдерживаемых API-интерфейсов sun или com.sun, внутренних, как вы сказали, так что это довольно распространенная проблема. Жаль, что нет простого обходного пути, чтобы сделать его доступным в j9, но я думаю, что в любом случае это будет небезопасно. Прямо сейчас я пытаюсь создать версию библиотеки для java 9, так что, возможно, я смогу объединить ее в эту мульти-релизную банку с версией j8. Однако в jdk9 сложно найти альтернативы некоторым классам.
Возможно, вам сначала стоит взглянуть на альтернативные классы в Java 8 (общедоступный API) или во внешних библиотеках. Если вы сначала посмотрите на классы Java 9, то столкнетесь с проблемами, если они недоступны. Снова сделать внутренние классы доступными - это не хорошая идея. Раньше их обычно не трогали из-за жестокого обращения с ними. Это вряд ли будет правдой сейчас, когда они скрыты внутри модульной системы.
Если библиотека не может решить вашу задачу, если вы не взломаете ее внутреннее устройство и не используете его непреднамеренно, вам следует еще раз подумать, используете ли вы правильную библиотеку ...




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