Метод, введенный в java 9, компилируется с использованием цели компилятора java 8. - PullRequest
0 голосов
/ 07 апреля 2020

Я испытываю странное поведение как в maven, так и в самом затмении. Несмотря на то, что я настроил свой проект для компиляции в Java 1.8, я могу скомпилировать и запустить (затмить) фрагмент кода, который был введен в Java 9

<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>

Строка кода, о которой идет речь:

LocalTime.ofInstant(cal.toInstant(), cal.getTimeZone().toZoneId());

Я использую Oracle JDK 11 локально для компиляции и запуска в Eclipse без каких-либо ошибок. Когда я упаковываю его в контейнер docker, используя openjdk: 8-jdk-alpine, он загружается, но выдает следующее исключение при вызове метода:

java.lang.NoSuchMethodError: java.time.LocalTime.ofInstant(Ljava/time/Instant;Ljava/time/ZoneId;)Ljava/time/LocalTime

Как мне избежать и идентифицировать эти ситуации, прежде чем они go для тестирования? Я что-то не так делаю или это ошибка в системе сборки или в JDK11?

заранее спасибо

Ответы [ 2 ]

3 голосов
/ 07 апреля 2020

Параметр source указывает, что исходный код должен быть совместим с Java 8, целевой параметр, с которым классы должны быть совместимы с Java 8. Однако вы все равно будете компилировать с библиотекой классов Java 11, если вы строите с Java 11, и тогда вы можете получить ошибки, подобные той, что у вас есть.

Есть два хороших решения. Одним из них является использование плагина Maven toolchains и сборка с Java 8. Затем вы можете установить несколько версий Java, а Maven будет использовать настроенную версию для каждого проекта.

Другой вариант - используйте новые версии и опции testRelease. Они будут собираться с использованием классов API из данного выпуска. Просто добавьте <release>1.8</release>.

1 голос
/ 07 апреля 2020

Если вы используете JDK 11, настройте свой maven pom.xml следующим образом:

 <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-release-plugin</artifactId>
                <version>2.5.3</version>
            </plugin>
        </plugins>
</build>
...