Как вы заметили, классы Buffer
были изменены в java9 для добавления ковариантных переопределений нескольких методов. Ранее метод
public Buffer position(int newPosition)
существовал только в базовом классе Buffer
, и поскольку он также возвращал Buffer
, его было не так удобно использовать в сочетании с цепочкой методов. В java9 перегруженные методы были добавлены во все подклассы для возврата конкретного подтипа , например
public ShortBuffer position(int newPosition)
Это само по себе является совместимым изменением, код, скомпилированный со старым методом, будет содержать ссылка на этот метод, и во время загрузки он будет разрешен с учетом конкретной перегрузки.
Проблема возникает, когда код компилируется с файлами классов из jdk9 и выполняется на более старом jdk. В этом случае байт-код содержит ссылку на новую перегрузку, которая не может быть разрешена на более старом jdk.
Это также является причиной предупреждения, которое вы видели:
warning [options] bootstrap class path not set in conjunction with -source 8
Опции source
и target
влияют только на принятый исходный код и сгенерированный байт-код, но при компиляции все равно будут использоваться библиотеки классов текущего jdk. Одним из решений этого было бы установить путь к загрузочному классу так, чтобы он указывал на более старую версию jre.
Лучшее решение, которое было включено в jdk9, , заключается в использовании параметра release
вместо, Это заставляет компилятор использовать некую внутреннюю базу данных, которая содержит информацию о том, когда какие методы были добавлены в jdk, и генерирует байт-код, совместимый с версией выпуска. С maven этот параметр можно установить с помощью свойства maven.compiler.release
внутри блока properties
в pom.xml
.
<properties>
<maven.compiler.release>8</maven.compiler.release>
...
С муравьем, который является для запуска generate-sources.xml
параметр release
можно передать в задачу javac
(обратите внимание, что я на самом деле не проверял это с источниками jrawio)