Co powoduje, że zaimportowany projekt Maven w Eclipse używa domyślnie Java 1.5 zamiast Java 1.6 i jak mogę się upewnić, że nie działa?

209

Zaimportowałem projekt Maven i korzystałem z Java 1.5, mimo że mam 1.6 skonfigurowany jako domyślny Eclipse Preferences->Java->Installed JREs.

Kiedy zmieniłem projekt Maven na wersję 1.6 JRE, nadal istniały błędy kompilacji z okresu, gdy projekt korzystał z Java 1.5 (te błędy kompilacji opisałem wcześniej w: Mam błędy kompilacji z m2eclipse, ale nie z maven2 w wierszu poleceń - czy moja m2eclipse jest źle skonfigurowana? )

Mam zamiar usunąć projekt i spróbować ponownie, ale tym razem chcę upewnić się, że używa on Java 1.6 od początku, aby sprawdzić, czy to wyeliminuje problemy z kompilacją.

Jak upewnić się, że projekt korzysta z Java 1.6 podczas importowania?

Chris Collins
źródło
4
m2eclipse ignoruje konfigurację domyślną Eclipse. Zawsze domyślnie używa 1,5. Jednak w twoim przypadku projekt używa wtyczki kompilatora maven i wyraźnie ustawia wersję na 1.5. Musisz zmienić to w pom i zaktualizować konfigurację projektu, aby zmienić wersję. Jednak już tego próbowałem i nie działało to dla mnie. Jestem pewien, że to nie jest problem, pomimo tego, co inni powiedzieli w twoim drugim pytaniu.
Raoul Duke
1
Nie, m2eclipse nie zawsze będzie miało domyślną wartość 1,5, domyślnie będzie to ustawienie wtyczki maven-kompilatora.
Pascal Thivent
1
Jak zmienić ustawienia wtyczki maven-compiler?
Lokathor,

Odpowiedzi:

248

Wtyczka m2eclipse nie korzysta z domyślnych ustawień Eclipse, wtyczka m2eclipse wyprowadza ustawienia z POM. Jeśli więc chcesz, aby projekt Maven został skonfigurowany do korzystania z ustawień Java 1.6 po zaimportowaniu do Eclipse, skonfiguruj maven-compiler-pluginodpowiednio, jak już zasugerowałem:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>2.1</version>
  <configuration>
    <source>1.6</source>
    <target>1.6</target>
  </configuration>
</plugin>

Jeśli twój projekt jest już zaimportowany, zaktualizuj konfigurację projektu ( kliknij projekt prawym przyciskiem myszy, a następnie Maven V Aktualizuj konfigurację projektu ).

Pascal Thivent
źródło
1
Proszę nie krzycz To po prostu niegrzeczne. Działa po usunięciu i ponownym zaimportowaniu projektu. Ale nie inaczej.
Raoul Duke
6
@ Raoul Działa bez ponownego importowania projektu, jeśli zaktualizujesz konfigurację projektu, tak jak napisałem. Testowałem to 3 razy i po prostu działa na moim komputerze.
Pascal Thivent
Tak jasne, jak odpowiedź Pascala brzmi (dodałem 1), że „aktualizacja konfiguracji projektu” nie działa w każdych okolicznościach, ponieważ musiałem również usunąć projekt i próbowałem wielu innych rzeczy (być może błędu w wersji eclipse)
rogermushroom
w przypadku nowszych wersji Java zobacz odpowiedź
wiersz
33

Dodałem to do mojego pom.xml poniżej opisu projektu i zadziałało:

<properties>
    <maven.compiler.source>1.6</maven.compiler.source>
    <maven.compiler.target>1.6</maven.compiler.target>
</properties>
hogi
źródło
1
To jest prostsze niż zaakceptowana odpowiedź, a także było dla mnie dobre.
Cegła
1
To zadziałało dla mnie, jednak zaakceptowana odpowiedź nie zadziałała.
Sanjay Singh,
1
Jaka jest różnica między tym a konfigurowaniem wtyczki kompilatora maven (zgodnie z przyjętą odpowiedzią)? Oba sposoby działają dla mnie.
Aamir Rizwan
Jeśli używasz Java 9, pamiętaj, że numeracja wersji uległa zmianie. Więc użyj 9 zamiast 1.9. <properties> <maven.compiler.source>9</maven.compiler.source> <maven.compiler.target>9</maven.compiler.target> </properties>
chux
Pomyślałem, że ustawienie właściwości „java.version” i użycie jej w konfiguracji kompilacji konfiguracji „maven-kompilator-wtyczka” było wystarczające. Oczywiście właściwości „maven.compiler.source” i „maven.compiler.target” muszą mieć pewne interakcje z wtyczkami Eclipse Maven, gdy problem zniknął.
JasonTolotta
29

Chciałem dodać coś do już udzielonej odpowiedzi. maven-compiler-plugin domyślnie skompiluje twój projekt przy użyciu Java 1.5, gdzie m2e otrzymuje jego informacje.

Dlatego musisz jawnie zadeklarować wtyczkę kompilatora maven w swoim projekcie za pomocą czegoś innego niż 1.5. Twój efekt pom.xmlbędzie domyślnie używał domyślnego zestawu we wtyczce kompilatora maven pom.xml .

Mikołaj
źródło
6
dla mnie to bardziej jednoznacznie odpowiada „dlaczego to 1.5, kiedy robię nowy projekt Maven?”
Don Cheadle
1
@LIttleAncientForestKami zweryfikowane 3.7.0, teraz wartości ustawione są stałe DEFAULT_SOURCEa DEFAULT_TARGET, ale ustawione na 1,5.
Adam Burley,
teraz powinno być 1.6, prawda? Zastanawiam się, bo nadal wydaje mi się, że używa 1,5.
Linia
@Line: Nie, najprawdopodobniej będzie to 1,5 do końca znanego wersetu maven, ponieważ super skuteczny pom-rodzic nigdy nie powinien się zmienić.
Nicholas
Czy to ironia? ;) Witryna, do której link znajduje się w odpowiedzi, mówi: „Zwróć też uwagę, że obecnie domyślnym ustawieniem źródła jest 1.6, a domyślnym ustawieniem docelowym jest 1.6”.
Linia
27
<project>

    <!-- ... -->

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

</project>
pitchblack408
źródło
8
Inside <build> </build>
Phillip Kamikaze
nie podoba mi się ta odpowiedź, ponieważ jest to tylko kod i nie widzę przewagi nad przyjętą (być może dlatego, że nie jest opisana ..)
Line
8

Oto podstawowa przyczyna java 1.5:

Zauważ również, że obecnie domyślnym ustawieniem źródła jest 1,5, a domyślnym ustawieniem docelowym jest 1,5, niezależnie od JDK, z którym uruchamiasz Maven. Jeśli chcesz zmienić te ustawienia domyślne, powinieneś ustawić źródło i cel.

Odniesienia: Wtyczka kompilatora Apache Mavem

Oto szczegóły:

Zwykły pom.xml

    <?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.pluralsight</groupId>
    <artifactId>spring_sample</artifactId>
    <version>1.0-SNAPSHOT</version>

</project>

Po pobraniu wtyczki z rozszerzonej wersji POM (Effective POM),

Można to uzyskać za pomocą tego polecenia z wiersza polecenia C:\mvn help:effective-pomPo prostu umieściłem tutaj mały fragment zamiast całego pom.

    <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
    <executions>
      <execution>
        <id>default-compile</id>
        <phase>compile</phase>
        <goals>
          <goal>compile</goal>
        </goals>
      </execution>
      <execution>
        <id>default-testCompile</id>
        <phase>test-compile</phase>
        <goals>
          <goal>testCompile</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

Nawet tutaj nie widzisz, gdzie jest zdefiniowana wersja Java, pozwala kopać więcej ...

Pobierz wtyczkę Apache Maven Compiler Plugin »3.1 jako dostępną w słoiku i otwórz ją w dowolnym narzędziu do kompresji plików, takim jak 7-zip

Przejdź przez słoik i znajdź

plugin.xml

plik w folderze

maven-compiler-plugin-3.1.jar \ META-INF \ maven \

Teraz zobaczysz następującą sekcję w pliku,

      <configuration>
    <basedir implementation="java.io.File" default-value="${basedir}"/>
    <buildDirectory implementation="java.io.File" default-value="${project.build.directory}"/>
    <classpathElements implementation="java.util.List" default-value="${project.testClasspathElements}"/>
    <compileSourceRoots implementation="java.util.List" default-value="${project.testCompileSourceRoots}"/>
    <compilerId implementation="java.lang.String" default-value="javac">${maven.compiler.compilerId}</compilerId>
    <compilerReuseStrategy implementation="java.lang.String" default-value="${reuseCreated}">${maven.compiler.compilerReuseStrategy}</compilerReuseStrategy>
    <compilerVersion implementation="java.lang.String">${maven.compiler.compilerVersion}</compilerVersion>
    <debug implementation="boolean" default-value="true">${maven.compiler.debug}</debug>
    <debuglevel implementation="java.lang.String">${maven.compiler.debuglevel}</debuglevel>
    <encoding implementation="java.lang.String" default-value="${project.build.sourceEncoding}">${encoding}</encoding>
    <executable implementation="java.lang.String">${maven.compiler.executable}</executable>
    <failOnError implementation="boolean" default-value="true">${maven.compiler.failOnError}</failOnError>
    <forceJavacCompilerUse implementation="boolean" default-value="false">${maven.compiler.forceJavacCompilerUse}</forceJavacCompilerUse>
    <fork implementation="boolean" default-value="false">${maven.compiler.fork}</fork>
    <generatedTestSourcesDirectory implementation="java.io.File" default-value="${project.build.directory}/generated-test-sources/test-annotations"/>
    <maxmem implementation="java.lang.String">${maven.compiler.maxmem}</maxmem>
    <meminitial implementation="java.lang.String">${maven.compiler.meminitial}</meminitial>
    <mojoExecution implementation="org.apache.maven.plugin.MojoExecution">${mojoExecution}</mojoExecution>
    <optimize implementation="boolean" default-value="false">${maven.compiler.optimize}</optimize>
    <outputDirectory implementation="java.io.File" default-value="${project.build.testOutputDirectory}"/>
    <showDeprecation implementation="boolean" default-value="false">${maven.compiler.showDeprecation}</showDeprecation>
    <showWarnings implementation="boolean" default-value="false">${maven.compiler.showWarnings}</showWarnings>
    <skip implementation="boolean">${maven.test.skip}</skip>
    <skipMultiThreadWarning implementation="boolean" default-value="false">${maven.compiler.skipMultiThreadWarning}</skipMultiThreadWarning>
    <source implementation="java.lang.String" default-value="1.5">${maven.compiler.source}</source>
    <staleMillis implementation="int" default-value="0">${lastModGranularityMs}</staleMillis>
    <target implementation="java.lang.String" default-value="1.5">${maven.compiler.target}</target>
    <testSource implementation="java.lang.String">${maven.compiler.testSource}</testSource>
    <testTarget implementation="java.lang.String">${maven.compiler.testTarget}</testTarget>
    <useIncrementalCompilation implementation="boolean" default-value="true">${maven.compiler.useIncrementalCompilation}</useIncrementalCompilation>
    <verbose implementation="boolean" default-value="false">${maven.compiler.verbose}</verbose>
    <mavenSession implementation="org.apache.maven.execution.MavenSession" default-value="${session}"/>
    <session implementation="org.apache.maven.execution.MavenSession" default-value="${session}"/>
  </configuration>

Spójrz na powyższy kod i znajdź następujące 2 linie

    <source implementation="java.lang.String" default-value="1.5">${maven.compiler.source}</source>
    <target implementation="java.lang.String" default-value="1.5">${maven.compiler.target}</target>

Powodzenia.

nieuczciwy chłopak
źródło
1
Tak. To nie ma nic wspólnego z Eclipse. Na przykład ten sam problem występuje w IntelliJ IDEA, jeśli utworzysz projekt Maven z quickstartartefaktem.
Jan Hettich
Cześć, dziękuję za opublikowanie przyczyny problemu:) Naprawdę to doceniam!
IanGabes
6

Twoje środowisko JRE zostało prawdopodobnie zdefiniowane w konfiguracji uruchamiania. Wykonaj następujące kroki w Eclipse, aby zmienić środowisko JRE kompilacji.

1) Kliknij prawym przyciskiem myszy projekt i wybierz Uruchom jako > Uruchom konfiguracje

2) W oknie Uruchom konfiguracje wybierz konfigurację kompilacji projektu na lewym panelu. Po prawej stronie zobaczysz różne zakładki: Main, JRE, Refresh, Source, ...

3) Kliknij zakładkę JRE, powinieneś zobaczyć coś takiego

wprowadź opis zdjęcia tutaj

4) Domyślnie będzie używane Domyślne środowisko JRE pracy (środowisko JRE wybrane jako domyślne w Preferencje-> Java-> Zainstalowane środowiska JRE ). Jeśli chcesz użyć innego zainstalowanego środowiska JRE, zaznacz pole wyboru Alternatywne środowisko JRE i wybierz preferowane środowisko JRE z menu rozwijanego.

Tony Vu
źródło
Dzięki za tę odpowiedź, moja konfiguracja uruchamiania działała z domyślnym obszarem roboczym, więc to naprawdę pomogło!
Damir Ciganović-Janković
Pomogło to, nie mogę uwierzyć, że przeoczyliśmy to!
phil oO
3

Najprostsze rozwiązanie w Springboot

Dam ci najprostszy, jeśli używasz Springboot:

<properties>
  <java.version>1.8</java.version>
</properties>

Następnie kliknij prawym przyciskiem myszy projekt Eclipse: Maven> Aktualizuj projekt> Zaktualizuj konfigurację projektu z pom.xml

To powinno wystarczyć.

sancho21
źródło
2

Ustawienia specyficzne dla projektu

Kolejnym miejscem, w którym może się to nie udać, są ustawienia specyficzne dla projektu, w Eclipse.

  1. właściwości projektu: kliknij swój projekt i jedną z następujących opcji:

    • Alt + Enter
    • Menu> Projekt> Właściwości
    • kliknij prawym przyciskiem myszy swój projekt> właściwości projektu (ostatni element w menu)
  2. kliknij „Kompilator Java”

  3. Odznacz „Włącz ustawienia specyficzne dla projektu” (lub zmień je wszystkie ręcznie).

Ze względu na wymagania klientów umożliwiliśmy im utrzymanie naszych projektów w wersji 1.6. Gdy potrzebna była aktualizacja do wersji 1.7, mieliśmy trudności, ponieważ musieliśmy zmienić wersję Java w całym miejscu:

  • projekt POM
  • Domyślnie obszar roboczy Eclipse
  • ustawienia specyficzne dla projektu
  • wykonanie maszyny wirtualnej (do wszystkiego użyto 1.6)
manuelvigarcia
źródło
1

Jeszcze jeden możliwy powód, jeśli używasz Tycho i Maven do budowania pakietów, że masz zdefiniowane nieprawidłowe środowisko wykonywania ( Bundle-RequiredExecutionEnvironment) w pliku manifestu ( manifest.mf). Na przykład:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Engine Plug-in
Bundle-SymbolicName: com.foo.bar
Bundle-Version: 4.6.5.qualifier
Bundle-Activator: com.foo.bar.Activator
Bundle-Vendor: Foobar Technologies Ltd.
Require-Bundle: org.eclipse.core.runtime,
 org.jdom;bundle-version="1.0.0",
 org.apache.commons.codec;bundle-version="1.3.0",
 bcprov-ext;bundle-version="1.47.0"
Bundle-RequiredExecutionEnvironment: JavaSE-1.5
Export-Package: ...
...
Import-Package: ...
...

W moim przypadku wszystko inne było w porządku. Wtyczki kompilatora (normalne maven i teo) zostały ustawione poprawnie, wciąż m2 generowało stary poziom zgodności z powodu manifestu. Myślałem, że dzielę się doświadczeniem.

Gábor Lipták
źródło
1

Odkryłem, że moim problemem był ktoś, który zatwierdził plik .project i .classpath, który miał odniesienia do Java1.5 jako domyślnego środowiska JRE.

<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
    <attributes>
        <attribute name="owner.project.facets" value="java"/>
    </attributes>
</classpathentry>

Zamykając projekt, usuwając pliki, a następnie ponownie importując jako projekt Maven, byłem w stanie poprawnie ustawić projekt do korzystania z JRE obszaru roboczego lub odpowiedniego jdk bez powrotu do 1.5. Dlatego unikaj sprawdzania w SVN plików .project i .classpath

Mam nadzieję, że to pomaga innym.

iowatiger08
źródło
0

Jeśli chcesz się upewnić, że nowo utworzone projekty lub importowane projekty w Eclipse używają innej domyślnej wersji Java niż Java 1.5, możesz zmienić konfigurację we wtyczce maven-kompilator.

  • Przejdź do folderu .m2 / repository / org / apache / maven / plugins / maven-compiler-plugin / 3.1
  • Otwórz maven-compiler-plugin-3.1.jar za pomocą programu zip.
  • Przejdź do META-INF / maven i otwórz plugin.xml
  • W następujących wierszach:
    <source Implementation = "java.lang.String" default-value = "1.5"> $ {maven.compiler.source} </source>
    <target Implementation = "java.lang.String" wartość domyślna = "1.5"> $ {maven.compiler.target} </target>

  • zmień wartość domyślną na 1.6 lub 1.8 lub cokolwiek chcesz.

  • Zapisz plik i upewnij się, że został zapisany z powrotem w pliku zip.

Odtąd wszystkie nowe projekty Maven używają podanej wersji Java.

Informacje pochodzą z następującego postu na blogu: https://sandocean.wordpress.com/2019/03/22/directly-generating-maven-projects-in-eclipse-with-java-version-newer-than-1-5/

użytkownik1201626
źródło
0

Aby zmienić wersję JDK, możesz:

1- Projekt> Właściwości
2- Idź do ścieżki kompilacji Java
3- W bibliotekach wybierz System JRE ... i kliknij Edytuj
4- Wybierz odpowiednią wersję i sprawdź poprawność

Achref EL Mouelhi
źródło