Ogólnie mówiąc, przyczyną tytułowych problemów jest brak kompatybilności pomiędzy użytą wersją JDK a ustawieniem kompatybilności kodu źródłowego i wynikowego. Wspomniane problemy występuje często w parze z jak poniżej:
Compilation failure: Compilation failure: [ERROR] Source option 5 is no longer supported. Use 6 or later. [ERROR] Target option 1.5 is no longer supported. Use 1.6 or later. [ERROR] -> [Help 1]
Poniższe tabelki zawierają zestawianie wpieranych wartości source/target compatibility w zależności od wersji JDK oraz domyślne ustawienie source/target w zależności od wersji plugina maven-compiler-plugin.
JDK Version | source compatibility version | target compatibility |
---|---|---|
before JDK9 | 5+ | 6+ |
JDK9+ | 1.6+ | 1.6+ |
Default version of maven-compiler-plugin | Default version of source compatiblity | Default version of target compatiblity |
---|---|---|
before 3.8.0 | 5 | 1.5 |
3.8.0+ | 6 | 1.6 |
Kolorem czerwonym oraz żółto-czerwonym zaznaczyłem najczęstszą przyczynę tytułowego problemu. Mam tu na myśli użycie nowej wersji JDK(np. JDK9), która nie wspiera już Javy 1.5 oraz starej wersji maven-compiler-plugin, który domyślnie ustawia source/target compatibility właśnie na Javę 5.
Skoro znamy już przyczynę problemu, to możemy przejść do omówienia rozwiązań, bo różnią się nieco w zależności od okoliczności.
Sytuacja 1: Nowy projekt z użyciem JDK 9+
To najczęstsza sytuacja, w której możemy otrzymać tytułowe błędy. Prawdopodobnie wynikać ona będzie z tego, że domyślnie stworzony projekty nie ustawia source/target compatibility, a w dodatku korzysta ze starszej wersji maven-compiler-plugin(starszej niż 3.8.0).
Rozwiązanie 1: Użyj nowszej wersji maven-compiler-plugin
Możemy wykorzystać fakt, że maven-compiler-plugin począwszy 3.8.0 ustawia domyślnie source/target na Javę 6 i po prostu jawnie wskazać nowszą wersję pluginu. W tym celu edytuj plik pom.xml dodając lub aktualizując poniższą sekcję.
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.bettercoding.hex</groupId> <artifactId>HexagonalArchitectureExample</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>CreditWorkflow</module> </modules> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> </plugin> </plugins> </build> </project>
Jeśli Twoja aplikacja nie musi być kompatybilna z tak starą wersja Javy jak 1.6, to od razu możesz ustawić tę wartość np. na 11, aby móc korzysta ze wszystkich dobrodziejstw Javy 11.
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.bettercoding.hex</groupId> <artifactId>HexagonalArchitectureExample</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>CreditWorkflow</module> </modules> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <release>11</release> </configuration> </plugin> </plugins> </build> </project>
Sytuacja 2: Pełna kontrola nad wersją maven-compiler-plugin oraz source i target compatibility
Jeśli chcesz korzystać z konkretnej wersji maven-compiler-plugin lub po prostu chcesz mieć pełną kontrolę nad zgodnością source oraz target compatibility , możesz wykorzystać poniższe rozwiązanie.
Rozwiązanie 2. Ustaw odpowiednie właściwości maven
W takiej sytuacji możesz do pom.xml dodać poniższą sekcję, która ustawi wartość source/target compatibility na pożądaną wartość- w tym przypadku zgodność z Javą 11.
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.bettercoding.hex</groupId> <artifactId>HexagonalArchitectureExample</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>CreditWorkflow</module> </modules> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> </project>
Na zakończenie mam jeszcze jedną prośbę.
Jeśli pomogłem Ci rozwiązać problem, to udostępnij proszę ten post. Dzięki temu będę miał okazję trafić do szerszej grupy odbiorców. Dziękuję