Was bewirkt, dass importierte Maven-Projekte in Eclipse standardmäßig Java 1.5 anstelle von Java 1.6 verwenden, und wie kann ich sicherstellen, dass dies nicht der Fall ist?

209

Ich habe ein Maven-Projekt importiert und es hat Java 1.5 verwendet, obwohl ich 1.6 als Eclipse-Standard konfiguriert habe Preferences->Java->Installed JREs.

Als ich das Maven-Projekt so änderte, dass es die 1.6-JRE verwendete, blieben noch die Build-Fehler übrig, die bei der Verwendung von Java 1.5 durch das Projekt entstanden waren (ich habe diese Build-Fehler weiter oben beschrieben: Ich habe Build-Fehler mit m2eclipse, aber nicht mit maven2 in der Befehlszeile - Ist mein m2eclipse falsch konfiguriert? )

Ich werde das Projekt löschen und es erneut versuchen, aber ich möchte diesmal sicherstellen, dass Java 1.6 von Anfang an verwendet wird, um festzustellen, ob dadurch die Build-Probleme behoben werden.

Wie stelle ich sicher, dass das Projekt beim Importieren Java 1.6 verwendet?

Chris Collins
quelle
4
m2eclipse ignoriert, was Sie für den Eclipse-Standard konfigurieren. Standardmäßig wird immer 1.5 verwendet. In Ihrem Fall verwendet das Projekt jedoch das Maven-Compiler-Plugin und setzt die Version explizit auf 1.5. Sie müssen dies im POM ändern und die Projektkonfiguration aktualisieren, um die Version zu ändern. Allerdings habe ich das schon versucht und es hat bei mir nicht funktioniert. Ich bin mir ziemlich sicher, dass dies nicht das Problem ist, trotz dessen, was andere in Ihrer anderen Frage gesagt haben.
Raoul Duke
1
Nein, m2eclipse ist nicht immer standardmäßig 1.5, sondern standardmäßig die Einstellungen des maven-compiler-plugins.
Pascal Thivent
1
Wie änderst du die Einstellungen des Maven-Compiler-Plugins?
Lokathor

Antworten:

248

Das m2eclipse-Plugin verwendet keine Eclipse-Standardeinstellungen, das m2eclipse-Plugin leitet die Einstellungen vom POM ab. Wenn Sie also möchten, dass ein Maven-Projekt so konfiguriert wird, dass beim Importieren unter Eclipse Java 1.6-Einstellungen verwendet werden, konfigurieren Sie dasmaven-compiler-plugin entsprechend, wie ich bereits vorgeschlagen habe:

<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>

Wenn Ihr Projekt bereits importiert wurde, aktualisieren Sie die Projektkonfiguration ( klicken Sie mit der rechten Maustaste auf das Projekt und dann auf Maven V Update Project Configuration ).

Pascal Thivent
quelle
1
Bitte nicht schreien. Das ist einfach unhöflich. Es hat funktioniert, nachdem das Projekt gelöscht und erneut importiert wurde. Aber nicht anders.
Raoul Duke
6
@ Raoul Es funktioniert ohne erneutes Importieren des Projekts, wenn Sie die Projektkonfiguration wie geschrieben aktualisieren . Ich habe dies 3 Mal getestet und es funktioniert nur auf meinem Computer.
Pascal Thivent
So klar Pascals Antwort ist (ich plus 1 würde es tun), 'Projektkonfiguration aktualisieren' scheint nicht unter allen Umständen zu funktionieren, da ich das Projekt ebenfalls entfernen musste und viele andere Dinge ausprobiert habe (vielleicht ein Fehler) in einer Version von Eclipse)
Rogermushroom
Für neuere Java-Versionen siehe diese Antwort
Zeile
33

Ich habe dies zu meiner pom.xml unterhalb der Projektbeschreibung hinzugefügt und es hat funktioniert:

<properties>
    <maven.compiler.source>1.6</maven.compiler.source>
    <maven.compiler.target>1.6</maven.compiler.target>
</properties>
Hogi
quelle
1
Dies ist einfacher als die akzeptierte Antwort und war auch gut für mich.
Brick
1
Dies funktionierte für mich, aber die akzeptierte Antwort funktionierte nicht.
Sanjay Singh
1
Was ist der Unterschied zwischen diesem und der Konfiguration des Maven-Compiler-Plugins (gemäß akzeptierter Antwort)? Beide Wege funktionieren für mich.
Aamir Rizwan
Wenn Sie Java 9 verwenden, beachten Sie, dass sich die Versionsnummerierung geändert hat. Verwenden Sie also 9 anstelle von 1,9. <properties> <maven.compiler.source>9</maven.compiler.source> <maven.compiler.target>9</maven.compiler.target> </properties>
Chux
Ich dachte, das Festlegen einer Eigenschaft "java.version" und deren Verwendung in der Build-Konfiguration der Konfiguration "maven-compiler-plugin" wäre ausreichend. Offensichtlich müssen die Eigenschaften "maven.compiler.source" und "maven.compiler.target" eine gewisse Eclipse Maven-Plugin-Interaktion aufweisen, da das Problem gerade verschwunden ist.
Jason Tolotta
29

Ich wollte der bereits gegebenen Antwort etwas hinzufügen. Maven-Compiler-Plugin kompiliert Ihr Projekt standardmäßig mit Java 1.5, wo m2e seine Informationen erhält.

Aus diesem Grund müssen Sie das Maven-Compiler-Plugin in Ihrem Projekt explizit mit etwas anderem als 1.5 deklarieren . Ihr effektiver pom.xmlwird implizit den im maven-compiler-plugin festgelegten Standard verwenden pom.xml.

Nikolaus
quelle
6
Für mich antwortet dies deutlicher: "Warum ist es 1,5, wenn ich ein neues Maven-Projekt mache?"
Don Cheadle
1
@LIttleAncientForestKami mit 3.7.0 verifiziert, jetzt sind die Werte als Konstanten DEFAULT_SOURCEund DEFAULT_TARGET, aber immer noch beide auf 1.5 gesetzt.
Adam Burley
jetzt sollte es 1.6 sein, oder? Ich frage mich, weil es immer noch 1,5 für mich zu verwenden scheint.
Linie
@Line: Nein, es wird wahrscheinlich 1,5 bis zum Ende des bekannten Maven-Verses sein, da sich der super effektive Eltern-Pom niemals ändern sollte.
Nicholas
Ist das Ironie? ;) Die Site, die in der Antwort verlinkt ist, sagt "Beachten Sie auch, dass derzeit die Standardquelleneinstellung 1.6 und die Standardzieleinstellung 1.6 ist".
Zeile
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
quelle
8
Innerhalb <build> </ build>
Phillip Kamikaze
mag diese Antwort nicht, weil es nur Code ist und ich keinen Vorteil gegenüber dem akzeptierten sehe (vielleicht weil es nicht beschrieben ist ..)
Zeile
8

Hier ist die Hauptursache von Java 1.5:

Beachten Sie auch, dass derzeit die Standardquelleneinstellung 1,5 und die Standardzieleinstellung 1,5 ist, unabhängig von dem JDK, mit dem Sie Maven ausführen. Wenn Sie diese Standardeinstellungen ändern möchten, sollten Sie Quelle und Ziel festlegen.

Referenz: Apache Mavem Compiler Plugin

Es folgen die Details:

Einfach 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>

Das folgende Plugin stammt aus einer erweiterten POM-Version (Effective POM).

Dies kann durch diesen Befehl über die Befehlszeile abgerufen werden. C:\mvn help:effective-pomIch habe hier nur einen kleinen Ausschnitt anstelle eines ganzen Poms eingefügt.

    <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>

Auch hier sehen Sie nicht, wo die Java-Version definiert ist, lassen Sie uns mehr graben ...

Laden Sie das Plugin Apache Maven Compiler Plugin »3.1 herunter, das in jar verfügbar ist, und öffnen Sie es in einem beliebigen Dateikomprimierungstool wie 7-zip

Durchquere das Glas und finde es heraus

plugin.xml

Datei im Ordner

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

Jetzt sehen Sie den folgenden Abschnitt in der Datei:

      <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>

Schauen Sie sich den obigen Code an und finden Sie die folgenden 2 Zeilen heraus

    <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>

Viel Glück.

Schurkenjunge
quelle
1
Ja. Dies hat nichts mit Eclipse zu tun. Beispielsweise tritt in IntelliJ IDEA das gleiche Problem auf, wenn Sie ein Maven-Projekt mit dem quickstartArtefakt erstellen .
Jan Hettich
Hallo, danke, dass du die Grundursache des Problems veröffentlicht hast :) Ich weiß das wirklich zu schätzen!
IanGabes
6

Ihre JRE wurde wahrscheinlich in der Ausführungskonfiguration definiert. Befolgen Sie diese Schritte in Eclipse, um die Build-JRE zu ändern.

1) Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie Ausführen als > Konfigurationen ausführen

2) Wählen Sie im Fenster "Konfigurationen ausführen" im linken Bereich Ihre Projekterstellungskonfiguration aus. Auf der rechten Seite sehen Sie verschiedene Registerkarten: Main, JRE, Refresh, Source, ...

3) Klicken Sie auf die Registerkarte JRE. Sie sollten so etwas sehen

Geben Sie hier die Bildbeschreibung ein

4) Standardmäßig wird Work Default JRE (Die JRE, die Sie standardmäßig unter Einstellungen-> Java-> Installierte JREs auswählen ) verwendet. Wenn Sie eine andere installierte JRE verwenden möchten, aktivieren Sie das Kontrollkästchen Alternative JRE und wählen Sie Ihre bevorzugte JRE aus der Dropdown-Liste aus.

Tony Vu
quelle
Vielen Dank für diese Antwort. Meine Ausführungskonfiguration wurde mit der Standardeinstellung für den Arbeitsbereich ausgeführt. Dies hat also wirklich geholfen!
Damir Ciganović-Janković
Das hat geholfen, kann nicht glauben, dass wir das übersehen haben!
Phil oO
3

Einfachste Lösung in Springboot

Ich gebe Ihnen die einfachste, wenn Sie Springboot verwenden:

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

Klicken Sie dann mit der rechten Maustaste auf Ihr Eclipse-Projekt: Maven> Projekt aktualisieren> Projektkonfiguration von pom.xml aktualisieren

Das sollte reichen.

sancho21
quelle
2

Projektspezifische Einstellungen

Ein weiterer Ort, an dem dies schief gehen kann, sind die projektspezifischen Einstellungen in Eclipse.

  1. Projekteigenschaften: Klicken Sie auf Ihr Projekt und eine der folgenden Optionen:

    • Alt + Eingabetaste
    • Menü> Projekt> Eigenschaften
    • Klicken Sie mit der rechten Maustaste auf Ihr Projekt> Projekteigenschaften (letzter Eintrag im Menü).
  2. Klicken Sie auf "Java Compiler"

  3. Deaktivieren Sie "Projektspezifische Einstellungen aktivieren" (oder ändern Sie sie alle von Hand).

Aufgrund der Kundenanforderungen hatten wir sie aktiviert, um unsere Projekte in 1.6 zu halten. Als ein Upgrade auf 1.7 erforderlich war, hatten wir es schwer, weil wir die Java-Version überall ändern mussten:

  • Projekt POM
  • Eclipse Workspace Standard
  • projektspezifische Einstellungen
  • Ausführen der virtuellen Maschine (1.6 wurde für alles verwendet)
manuelvigarcia
quelle
1

Ein weiterer möglicher Grund, wenn Sie Tycho und Maven zum Erstellen von Bundles verwenden, ist, dass Sie Bundle-RequiredExecutionEnvironmentin der definierten Manifestdatei ( manifest.mf) eine falsche Ausführungsumgebung ( ) haben. Beispielsweise:

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: ...
...

In meinem Fall war alles andere in Ordnung. Die Compiler-Plugins (auch normaler Maven und Tycho) wurden korrekt eingestellt, dennoch hat m2 aufgrund des Manifests eine alte Konformitätsstufe generiert. Ich dachte, ich teile die Erfahrung.

Gábor Lipták
quelle
1

Ich stellte fest, dass mein Problem darin bestand, dass jemand die Dateien .project und .classpath festgeschrieben hatte, die Verweise auf Java1.5 als Standard-JRE enthielten.

<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>

Durch Schließen des Projekts, Entfernen der Dateien und anschließendes erneutes Importieren als Maven-Projekt konnte ich das Projekt so einstellen, dass Workspace JRE oder das entsprechende JDK verwendet werden, ohne dass es auf 1.5 zurückgesetzt wird. Vermeiden Sie es daher, die Dateien .project und .classpath in Ihren SVN einzuchecken

Hoffe das hilft anderen.

iowatiger08
quelle
0

Wenn Sie sicherstellen möchten, dass neu erstellte oder importierte Projekte in Eclipse eine andere Standard-Java-Version als Java 1.5 verwenden, können Sie die Konfiguration im Maven-Compiler-Plugin ändern.

  • Wechseln Sie in den Ordner .m2 / repository / org / apache / maven / plugins / maven-compiler-plugin / 3.1
  • Öffnen Sie maven-compiler-plugin-3.1.jar mit einem Zip-Programm.
  • Gehen Sie zu META-INF / maven und öffnen Sie die Datei plugin.xml
  • In den folgenden Zeilen:
    <Quellimplementierung = "java.lang.String" Standardwert = "1.5"> $ {maven.compiler.source} </ Quelle>
    < Zielimplementierung = "java.lang.String" Standardwert = "1.5"> $ {maven.compiler.target} </ target>

  • Ändern Sie den Standardwert auf 1,6 oder 1,8 oder was auch immer Sie möchten.

  • Speichern Sie die Datei und stellen Sie sicher, dass sie in die Zip-Datei zurückgeschrieben wird.

Ab sofort verwenden alle neuen Maven-Projekte die von Ihnen angegebene Java-Version.

Informationen stammen aus dem folgenden Blog-Beitrag: https://sandocean.wordpress.com/2019/03/22/directly-generating-maven-projects-in-eclipse-with-java-version-newer-than-1-5/

user1201626
quelle
0

So ändern Sie die JDK-Version:

1- Projekt> Eigenschaften
2- Gehen Sie zu Java Build Path.
3-
Wählen Sie in Libraries JRE System ... aus und klicken Sie auf Edit. 4- Wählen Sie die entsprechende Version aus und validieren Sie

Achref EL Mouelhi
quelle