Cosa fa sì che il progetto Maven importato in Eclipse utilizzi Java 1.5 anziché Java 1.6 per impostazione predefinita e come posso assicurarmi che non lo faccia?


209

Ho importato un progetto Maven e ha usato Java 1.5 anche se ho 1.6 configurato come predefinito di Eclipse Preferences->Java->Installed JREs.

Quando ho cambiato il progetto Maven per utilizzare 1.6 JRE, gli errori di compilazione rimanevano ancora da quando il progetto utilizzava Java 1.5 (ho descritto questi errori di compilazione in precedenza in: ho errori di compilazione con m2eclipse ma non con maven2 sulla riga di comando - Il mio m2eclipse è configurato in modo errato? )

Ho intenzione di eliminare il progetto e riprovare, ma questa volta voglio assicurarmi che utilizzi Java 1.6 dall'inizio per vedere se questo elimina i problemi di compilazione.

Come posso assicurarmi che il progetto usi Java 1.6 durante l'importazione?


4
m2eclipse ignora ciò che si configura per il valore predefinito di Eclipse. Userà sempre 1.5 per impostazione predefinita. Comunque nel tuo caso il progetto usa il plugin-compilatore-maven e imposta esplicitamente la versione su 1.5. Dovrai cambiarlo nel pom e aggiornare la configurazione del progetto per cambiare la versione. Tuttavia ho già provato questo e non ha funzionato per me. Sono abbastanza sicuro che non sia questo il problema, nonostante ciò che gli altri hanno detto nella tua altra domanda.
Raoul Duke,

1
No, m2eclipse per impostazione predefinita non sarà sempre 1.5, ma avrà come impostazione predefinita le impostazioni del plugin compilatore maven.
Pascal Thivent,

1
Come si cambiano le impostazioni del plugin-compilatore-maven?
Lokathor,

Correlati: Avviso
Stevoisiak,

Risposte:


248

Il plug-in m2eclipse non utilizza le impostazioni predefinite di Eclipse, il plug-in m2eclipse deriva le impostazioni dal POM. Quindi se vuoi che un progetto Maven sia configurato per usare le impostazioni Java 1.6 quando importato in Eclipse, configura il filemaven-compiler-plugin appropriato, come ho già suggerito:

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

Se il progetto è già stato importato, aggiorna la configurazione del progetto ( fai clic con il pulsante destro del mouse sul progetto, quindi Aggiorna configurazione progetto Maven V ).


1
Per favore, non urlare. È maleducato. Ha funzionato dopo aver eliminato e reimportato il progetto. Ma non diversamente.
Raoul Duke,

6
@Raoul Funziona senza reimportare il progetto se aggiorni la configurazione del progetto come ho scritto. L'ho provato 3 volte e funziona solo sulla mia macchina.
Pascal Thivent,

La risposta di Pascal è chiara (ho aggiunto 1) "aggiornare la configurazione del progetto" non sembra funzionare in tutte le circostanze in quanto ho dovuto rimuovere anche il progetto e ho provato molte altre cose (forse un bug in una versione di eclissi)
rogermushroom,

per le versioni Java più recenti, vedere questa risposta
Riga

33

Ho aggiunto questo al mio pom.xml sotto la descrizione del progetto e ha funzionato:

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

1
Questo è più semplice della risposta accettata ed è stato anche un bene per me.
Mattone

1
Questo ha funzionato per me, tuttavia la risposta accettata non ha funzionato.
Sanjay Singh,

1
Qual è la differenza tra questo e la configurazione di maven-compilatore-plugin (secondo la risposta accettata)? Entrambi i modi funzionano per me.
Aamir Rizwan,

Se si utilizza Java 9, tenere presente che la numerazione delle versioni è cambiata. Quindi usa 9 invece di 1.9. <properties> <maven.compiler.source>9</maven.compiler.source> <maven.compiler.target>9</maven.compiler.target> </properties>
chux,

Pensavo fosse sufficiente impostare una proprietà "java.version" e usarla nella configurazione build della configurazione "maven-compiler-plugin". Ovviamente, le proprietà "maven.compiler.source" e "maven.compiler.target" devono avere alcune interazioni con il plugin Eclipse Maven poiché il problema è appena scomparso.
JasonTolotta

29

Volevo aggiungere qualcosa alla risposta già fornita. Maven-compiler-plugin di default compilerà il tuo progetto usando Java 1.5 che è dove m2e ottiene le sue informazioni.

Ecco perché devi dichiarare esplicitamente il plugin maven-compilatore nel tuo progetto con qualcosa di diverso da 1.5. Il tuo efficace pom.xmlutilizzerà implicitamente il set predefinito nel plug-in del compilatore maven pom.xml .


6
per me questo risponde più chiaramente "perché è 1.5 quando realizzo un nuovo progetto Maven?"
Don Cheadle,

1
@LIttleAncientForestKami verificato con 3.7.0, ormai i valori sono impostati come costanti DEFAULT_SOURCEe DEFAULT_TARGET, ma entrambi sono ancora impostati su 1.5.
Adam Burley,

ora dovrebbe essere 1.6, giusto? Mi chiedo perché sembra ancora usare 1.5 per me.
Linea

@Line: No, sarà probabilmente 1,5 fino alla fine del versetto noto dato che il pom genitore super efficace non dovrebbe mai cambiare.
Nicholas

Questa è ironia? ;) Il sito che è collegato nella risposta dice "Si noti inoltre che attualmente l'impostazione predefinita della sorgente è 1.6 e l'impostazione predefinita della destinazione è 1,6" ..
Riga

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>

8
Inside <build> </build>
Phillip Kamikaze,

non mi piace questa risposta, perché è solo un codice, e non vedo alcun vantaggio rispetto a quello accettato (forse perché non è descritto ..)
Riga

8

Ecco la causa principale di Java 1.5:

Si noti inoltre che al momento l'impostazione di origine predefinita è 1.5 e l'impostazione di destinazione predefinita è 1,5, indipendentemente dal JDK con cui si esegue Maven. Se si desidera modificare queste impostazioni predefinite, è necessario impostare origine e destinazione.

Riferimento: plug-in per compilatore Apache Mavem

Di seguito sono riportati i dettagli:

Pom.xml normale

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

Il seguente plug-in è tratto da una versione POM estesa (Effective POM),

Questo può essere ottenuto da questo comando dalla riga di comando che C:\mvn help:effective-pomho appena inserito qui un piccolo frammento anziché un intero 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>

Anche qui non vedi dove è definita la versione java, scaviamo di più ...

Scarica il plug-in, Apache Maven Compiler Plugin »3.1 come disponibile in jar e aprilo in qualsiasi strumento di compressione dei file come 7-zip

Attraversa il barattolo e scoprilo

plugin.xml

file all'interno della cartella

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

Ora vedrai la seguente sezione nel file,

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

Guarda il codice sopra e scopri le seguenti 2 righe

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

In bocca al lupo.


1
Sì. Questo non ha nulla a che fare con Eclipse. Ad esempio, si ottiene lo stesso problema in IntelliJ IDEA se si crea un progetto Maven con l' quickstartartefatto.
Jan Hettich,

Ciao, grazie per aver pubblicato la causa principale del problema:) Lo apprezzo davvero!
IanGabes,

6

Probabilmente il tuo JRE è stato definito nella configurazione di esecuzione. Seguire questi passaggi in Eclipse per modificare il build JRE.

1) Fare clic con il tasto destro sul progetto e selezionare Esegui come > Esegui configurazioni

2) Dalla finestra Esegui configurazioni, selezionare la configurazione di compilazione del progetto nel pannello di sinistra. A destra, vedrai varie schede: Principale, JRE, Aggiorna, Sorgente, ...

3) Fai clic sulla scheda JRE, dovresti vedere qualcosa del genere

inserisci qui la descrizione dell'immagine

4) Per impostazione predefinita, verrà utilizzato il JRE predefinito di lavoro (il JRE selezionato come predefinito in Preferenze-> Java-> JRE installati ). Se si desidera utilizzare un altro JRE installato, selezionare la casella di controllo Alternativo JRE e selezionare il proprio JRE preferito dall'elenco a discesa.


Grazie per questa risposta, la mia configurazione di esecuzione era in esecuzione con l'area di lavoro predefinita, quindi questo mi ha davvero aiutato!
Damir Ciganović-Janković,

Questo ha aiutato, non posso credere che l'abbiamo trascurato!
phil oO,

3

La soluzione più semplice in Springboot

Ti darò il più semplice se usi Springboot:

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

Quindi, fai clic con il pulsante destro del mouse sul tuo progetto Eclipse: Maven> Aggiorna progetto> Aggiorna configurazione progetto da pom.xml

Quello dovrebbe fare.


2

Impostazioni specifiche del progetto

Un altro posto in cui ciò può andare storto è nelle impostazioni specifiche del progetto, in Eclipse.

  1. proprietà del progetto: fare clic sul progetto e su una delle seguenti opzioni:

    • Alt + Invio
    • Menu> Progetto> Proprietà
    • fai clic con il pulsante destro del mouse sul progetto> proprietà del progetto (ultimo elemento nel menu)
  2. fai clic su "Compilatore Java"

  3. Deseleziona "Abilita impostazioni specifiche del progetto" (o modificale tutte manualmente).

A causa delle esigenze del cliente, li abbiamo abilitati a mantenere i nostri progetti in 1.6. Quando è stato necessario eseguire l'aggiornamento a 1.7, abbiamo avuto difficoltà perché dovevamo cambiare la versione java dappertutto:

  • progetto POM
  • Impostazione predefinita dell'area di lavoro Eclipse
  • impostazioni specifiche del progetto
  • esecuzione macchina virtuale (1.6 è stato usato per tutto)

1

Un motivo in più se si stanno usando Tycho e Maven per creare bundle, si ha un ambiente di esecuzione errato ( Bundle-RequiredExecutionEnvironment) nel file manifest ( manifest.mf) definito. Per esempio:

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

Nel mio caso tutto il resto era ok. I plug-in del compilatore (anche normali maven e tycho) sono stati impostati correttamente, ma m2 hanno generato un vecchio livello di conformità a causa del manifest. Ho pensato di condividere l'esperienza.


1

Ho scoperto che il mio problema riguardava il commit di un file .project e .classpath con riferimenti a Java1.5 come JRE predefinito.

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

Chiudendo il progetto, rimuovendo i file e quindi reimportandoli come progetto Maven, sono stato in grado di impostare correttamente il progetto in modo da utilizzare l'area di lavoro JRE o il jdk pertinente senza tornare a 1.5. Pertanto, evitare di archiviare nel file SVN i file .project e .classpath

Spero che questo aiuti gli altri.


0

Se vuoi assicurarti che i nuovi progetti creati o importati in Eclipse utilizzino una versione java predefinita diversa da Java 1.5, puoi cambiare la configurazione nel plugin del compilatore maven.

  • Vai alla cartella .m2 / repository / org / apache / maven / plugins / maven-compiler-plugin / 3.1
  • Apri maven-compiler-plugin-3.1.jar con un programma zip.
  • Vai a META-INF / maven e apri plugin.xml
  • Nelle righe seguenti:
    <source deployment = "java.lang.String" default-value = "1.5"> $ {maven.compiler.source} </source>
    <target deployment = "java.lang.String" default-value = "1.5"> $ {maven.compiler.target} </ target>

  • cambia il valore predefinito in 1.6 o 1.8 o come preferisci.

  • Salvare il file e assicurarsi che sia riscritto nel file zip.

Da ora in poi tutti i nuovi progetti Maven utilizzano la versione java che hai specificato.

Le informazioni sono tratte dal seguente post sul blog: https://sandocean.wordpress.com/2019/03/22/directly-generating-maven-projects-in-eclipse-with-java-version-newer-than-1-5/


0

Per cambiare la versione di JDK, puoi fare:

1- Progetto> Proprietà
2- Vai a Java Build Path
3- In Librerie, selezionare JRE System ... e fare clic su Modifica
4- Scegliere la versione appropriata e confermare

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.