zatrzymaj IntelliJ IDEA, aby zmienić poziom języka java za każdym razem, gdy pom jest ponownie ładowany (lub zmień domyślny poziom języka projektu)

145

Używając IntelliJ 12, mam projekt java i używam maven z pom.xml. Mój projekt używa java8, ale wygląda na to, że domyślny poziom języka projektu został ustawiony na 6 podczas importowania projektu.

Mogę zmienić poziom języka na 8.0 (F4 -> Moduły -> Poziom języka), jednak za każdym razem, gdy edytuję plik pom.xml, poziom projektu jest przełączany z powrotem na „użyj poziomu języka projektu” i muszę ponownie edytować te ustawienia i jeszcze raz.

Czy jest coś, co muszę dodać do pom.xml, aby ustawić domyślny poziom języka na 8.0?

Quentin
źródło
2
Czy twój pom określa poziom źródłowy i docelowy w konfiguracji wtyczki kompilatora?
Mark Rotteveel,
tak, źródło i cel ustawione na 1.8. Jednak nie zostało to określone podczas importu projektu
Quentin
@Quentin W takiej sytuacji najłatwiej będzie przełożyć projekt do nowej lokalizacji i pozwolić IntelliJ zaimportować go od nowa.
Thorbjørn Ravn Andersen

Odpowiedzi:

174

Zgodnie z komentarzem Marka, oto jak to zrobić:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.5.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
</build>
vikingsteve
źródło
10
wtyczka jest obecna w pomie, z celem 1.8, ale nic to nie zmienia :(
Quentin
2
Czy masz włączony automatyczny import swoich Maven Pom's? Czy sprawdziłeś poms rodziców (i dziadków), czy są tam jakieś ustawienia 1.6, które mogą być w konflikcie?
vikingsteve
1
Rzeczywiście, projekt macierzysty jest zdefiniowany za pomocą spring-boot-starter-parent-1.1.9.RELEASE.pom.xml, aw pluginManagement wtyczka maven-compiler-plugin jest ustawiona na 1.6 ... Próbowałem nadpisać te ustawienia bez żadnego sukcesu. Wygląda na to, że spring boot 1.2.RC nie zawiera już wtyczki maven-compiler-plugin, spróbuję. - automatyczny import jest włączony.
Quentin
Świetnie, to może być powód. Jeśli określisz tę samą wersję wtyczki kompilatora maven, może być możliwe zastąpienie ustawień źródła / celu. Być może spróbuj tego w katalogu głównym projektu pom.xml.
vikingsteve
2
W moim przypadku to nie zadziałało. Musiałem usunąć ustawienie wspomniane w tej odpowiedzi i zamiast tego dodać:<properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties>
genonimowy
99

Krótsza wersja odpowiedzi vikingsteve to:

<properties>
  <maven.compiler.source>1.8</maven.compiler.source>
  <maven.compiler.target>1.8</maven.compiler.target>
</properties>
DieterDP
źródło
6
Jedna irytacja mniej!
Artur Cichosz
4
To nie była tylko krótka wersja, ale w moim przypadku konieczna. odpowiedź vikingsteve nie działa dla mnie. Usunąłem więc to ustawienie i użyłem tego.
genonimowy
23

Myślę, że ma to związek z koncepcyjnym konfliktem między wtyczką kompilatora Maven a ideą IntelliJ. Najwyraźniej nowsze wersje wtyczki kompilatora mają domyślny poziom 1,5 (patrz http://maven.apache.org/plugins/maven-compiler-plugin/ ). Więc jeśli wtyczka kompilatora jest w ogóle używana w projekcie, a poziom kompilatora nie jest jawnie ustawiony w pom.xml, za każdym razem, gdy POM jest ponownie przetwarzany, poziom powróci do domyślnego.

Istnieje więc konflikt pojęciowy, który jest ignorowany przez Intellij IDEA. IDE nadal pozwala na ustawienie projektu i ustawień modułu, ale nie zapewnia żadnego ostrzeżenia ani informacji zwrotnej, że to ustawienie jest kontrolowane przez pom.xml. Rozwiązaniem byłoby albo jawne zezwolenie na nadpisywanie ustawienia wtyczki kompilatora POM (być może niezbyt mądre, ponieważ co się stanie, gdy użyjesz maven w wierszu poleceń) lub dezaktywacja elementów sterujących w IDE, gdy to ustawienie z POM jest aktywne.

Obecnie rozwiązaniem jest ustawienie żądanego poziomu kompilatora we wtyczce kompilatora w pom, a następnie ponowne zaimportowanie zamiast próby ustawienia go w ustawieniach modułu.

Peter N. Steinmetz
źródło
1
Zgoda. Brak informacji zwrotnej, że ustawienia w IDEA zostaną po prostu zignorowane i ponownie zaimportowane z POM, jest bardzo mylący, szczególnie gdy używasz macierzystego POM.
Gillfish
9

Uaktualniam projekt z JDK 8 do JDK 10+. Miałem właściwości kompilatora określone poprawnie w następujący sposób:

<properties>
  <maven.compiler.source>10</maven.compiler.source>
  <maven.compiler.target>10</maven.compiler.target>
</properties>

Jednak projekt Idea ciągle resetowałby poziom języka do 8.

W końcu doszedłem do wniosku, że proces importu Maven firmy Idea używał JDK 8 do importowania projektu, co ograniczyło poziom języka do <= 8.

Aby to naprawić , zaktualizowałem właściwość `` JDK dla importera '' w Ustawieniach -> Kompilacja, wykonanie, wdrażanie -> Narzędzia kompilacji -> Maven -> Importowanie, aby użyć JDK 11.

wprowadź opis obrazu tutaj

danw
źródło
Rozwiązałem mój problem. Wygląda na to, że IntelliJ zaktualizował swoje wewnętrzne środowisko JRE w późniejszych wersjach (około 2019.2). Dość trudno wytropić ...
Hasan Aslam
8

Możesz to zrobić na dwa sposoby, dodaj jeden z nich do pliku pom.xml:

Najpierw dodaj właściwości

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

po drugie - Dodaj wtyczkę

<plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.5.1</version>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
        </configuration>
</plugin>

Daj mi znać, jeśli to pomoże.

Anuj Teotia
źródło
Zrobiłem jedno i drugie, a kompilator wciąż jest resetowany do 1.5 za każdym razem, gdy próbuję uruchomić kompilację mvn z poziomu IntelliJ. Jednak działa dobrze, gdy jest uruchamiany z wiersza poleceń poza IntelliJ.
user26270
1
w IntelliJ pamiętaj o ponownym zaimportowaniu ustawień Maven po modyfikacji. Rozwiązanie zadziałało dla mnie.
Pierluigi Vernetto
4

Żadne z rozwiązań nie pomogło w moim przypadku. Nie musiałem określać żadnej wersji Java w moim pom.xml.

Musiałem otworzyć <project-name>.imlplik i zmienić tam wersję JDK.

Oryginalny:

<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_5">
    <!-- ...                                                   ^ -->
    <!-- ...                                                   | -->

Zaktualizowano:

<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
    <!-- ...                                                   ^ -->
    <!-- ...                                                   | -->

To w ogóle nie ma sensu. W żadnym momencie nie określiłem wersji JDK dla Java 1.5.

kleinfreund
źródło
To samo w sobie rozwiązało problem w IntelliJ 2019.3, bez konieczności zmiany czegokolwiek w moich pomachach ani gdziekolwiek indziej. Podobnie nigdzie nie podałem JDK 1.5.
Michael Christoff
Przykład: <... LANGUAGE_LEVEL = "JDK_11">
Daniel De León
1

Bardzo zmagałem się z tym problemem ze względu na budowanie mikroserwisów z Dropwizard. W końcu dowiedziałem się, że moje właściwości kompilacji znajdowały się w niewłaściwym pliku pom (głównej usługi pom.xml).

Tak więc, mimo że inne pakiety bardziej przypominają biblioteki , nie byłem w stanie użyć składni Java 8.

Kiedy refaktoryzowałem wtyczkę kompilacji do .pom.xmlpliku „globalnego” , wszystkie kontenery potomne mogły używać nowej składni.

Może pomóc komuś, kto ma problemy z projektami z wieloma kontenerami

user3677636
źródło
0

U mnie zadziałało rozwiązanie polegające na aktualizacji POM (wtyczki plus właściwości) do wymaganej wersji kompilatora Javy (w moim przypadku 1_7). Jednak ponieważ plik .iml dla każdego projektu został wygenerowany przy użyciu oryginalnego pom (z domyślną wersją kompilatora 1_5, jak wyjaśnił ktoś powyżej) ma wersję JDK 1_5, to nadal zastępuje wersję pom.

Usunąłem ręcznie folder .idea i zaimportowałem moduł do IntelliJ z ponownym importem ze zaktualizowanego pliku pom. Kiedy ponownie zaimportowałem moduł ze zaktualizowanego POM, zobaczyłem, że pliki iml mają zaktualizowaną wersję JDK (1_7 w moim przypadku).

Shirish Sakhare
źródło