Qu'est-ce qui pousse le projet Maven importé dans Eclipse à utiliser Java 1.5 au lieu de Java 1.6 par défaut et comment puis-je m'assurer qu'il ne fonctionne pas?

209

J'ai importé un projet Maven et il a utilisé Java 1.5 même si j'ai 1.6 configuré comme mon défaut Eclipse Preferences->Java->Installed JREs .

Lorsque j'ai changé le projet Maven pour utiliser le JRE 1.6, il restait les erreurs de build depuis le moment où le projet utilisait Java 1.5 (j'ai décrit ces erreurs de build plus tôt dans: J'ai des erreurs de build avec m2eclipse mais pas avec maven2 sur la ligne de commande - mon m2eclipse est-il mal configuré? )

Je vais supprimer le projet et réessayer mais je veux m'assurer cette fois qu'il utilise Java 1.6 dès le début pour voir si cela élimine les problèmes de construction.

Comment m'assurer que le projet utilise Java 1.6 lorsque je l'importe?

Chris Collins
la source
4
m2eclipse ignore ce que vous configurez pour la valeur par défaut d'Eclipse. Il utilisera toujours 1.5 par défaut. Cependant, dans votre cas, le projet utilise le plugin maven-compiler-plug et définit explicitement la version à 1.5. Vous devrez changer cela dans le pom et mettre à jour la configuration du projet pour changer la version. Cependant, j'ai déjà essayé cela et cela n'a pas fonctionné pour moi. Je suis sûr que ce n'est pas le problème malgré ce que d'autres ont dit dans votre autre question.
Raoul Duke
1
Non, m2eclipse ne sera pas toujours par défaut à 1,5, il sera par défaut aux paramètres du plugin maven-compiler-plugin.
Pascal Thivent
1
Comment changez-vous les paramètres du plugin maven-compiler?
Lokathor
Connexe: Avertissement - Le chemin de
génération

Réponses:

248

Le plugin m2eclipse n'utilise pas les valeurs par défaut d'Eclipse, le plugin m2eclipse dérive les paramètres du POM. Donc, si vous souhaitez qu'un projet Maven soit configuré pour utiliser les paramètres Java 1.6 lors de son importation sous Eclipse, configurez-le maven-compiler-plugincorrectement, comme je l'ai déjà suggéré:

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

Si votre projet est déjà importé, mettez à jour la configuration du projet (faites un clic droit sur le projet puis Maven V Update Project Configuration ).

Pascal Thivent
la source
1
Veuillez ne pas crier. C'est juste désagréable. Cela a fonctionné après la suppression et la réimportation du projet. Mais pas autrement.
Raoul Duke
6
@Raoul Cela fonctionne sans réimporter le projet si vous mettez à jour la configuration du projet comme je l'ai écrit. J'ai testé cela 3 fois et cela fonctionne sur ma machine.
Pascal Thivent
Aussi clair que la réponse de Pascal est (je l'ai ajouté), «mettre à jour la configuration du projet» ne semble pas fonctionner dans toutes les circonstances car j'ai dû supprimer le projet également, et j'ai essayé beaucoup d'autres choses (peut-être un bogue dans une version d'éclipse)
rogermushroom
pour les nouvelles versions de Java, voir cette réponse
Ligne
33

J'ai ajouté cela à mon pom.xml sous la description du projet et cela a fonctionné:

<properties>
    <maven.compiler.source>1.6</maven.compiler.source>
    <maven.compiler.target>1.6</maven.compiler.target>
</properties>
hogi
la source
1
C'est plus simple que la réponse acceptée et c'était aussi bon pour moi.
Brique
1
Cela a fonctionné pour moi, mais la réponse acceptée n'a pas fonctionné.
Sanjay Singh
1
Quelle est la différence entre cela et la configuration de maven-compiler-plugin (selon la réponse acceptée)? Les deux méthodes fonctionnent pour moi.
Aamir Rizwan le
Si vous utilisez Java 9, sachez que la numérotation des versions a changé. Utilisez donc 9 au lieu de 1.9. <properties> <maven.compiler.source>9</maven.compiler.source> <maven.compiler.target>9</maven.compiler.target> </properties>
chux
Je pensais que définir une propriété "java.version" et l'utiliser dans la configuration de construction de la configuration "maven-compiler-plugin" était suffisant. De toute évidence, les propriétés "maven.compiler.source" et "maven.compiler.target" doivent avoir une certaine interaction avec le plug-in Eclipse Maven car le problème vient de disparaître.
JasonTolotta
29

Je voulais ajouter quelque chose à la réponse déjà fournie. maven-compiler-plugin par défaut compilera votre projet en utilisant Java 1.5 qui est l'endroit où m2e obtient ses informations.

C'est pourquoi vous devez déclarer explicitement le plugin maven-compiler dans votre projet avec autre chose que 1.5. Votre efficace pom.xmlutilisera implicitement l'ensemble par défaut dans le plugin maven-compiler pom.xml .

Nicolas
la source
6
pour moi cela répond plus clairement "pourquoi est-ce 1.5 quand je fais un nouveau projet Maven?"
Don Cheadle
1
@LIttleAncientForestKami vérifié avec 3.7.0, maintenant les valeurs sont définies comme constantes DEFAULT_SOURCEet DEFAULT_TARGET, mais toujours les deux à 1,5.
Adam Burley
maintenant, il devrait être de 1,6, non? Je me demande parce qu'il semble toujours utiliser 1.5 pour moi.
Ligne
@Line: Non, il sera probablement de 1,5 jusqu'à la fin du verset maven connu, car le pom parent super efficace ne devrait jamais changer.
Nicholas
Est-ce l'ironie? ;) Le site qui est lié dans la réponse dit "Notez également qu'actuellement le paramètre source par défaut est 1.6 et le paramètre cible par défaut est 1.6" ..
Ligne
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
la source
8
Inside <build> </build>
Phillip Kamikaze
n'aime pas cette réponse, car ce n'est que du code, et je ne vois pas d'avantage sur la réponse acceptée (peut-être parce qu'elle n'est pas décrite ..)
Ligne
8

Voici la cause première de Java 1.5:

Notez également qu'à l'heure actuelle, le paramètre source par défaut est 1,5 et le paramètre cible par défaut est 1,5, indépendamment du JDK avec lequel vous exécutez Maven. Si vous souhaitez modifier ces valeurs par défaut, vous devez définir la source et la cible.

Référence: Plugin Apache Mavem Compiler

Voici les détails:

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

Le plugin suivant est extrait d'une version POM étendue (Effective POM),

Cela peut être obtenu par cette commande à partir de la ligne de commande C:\mvn help:effective-pomJe viens de mettre ici un petit extrait au lieu d'un pom entier.

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

Même ici, vous ne voyez pas où est définie la version java, allons plus loin ...

Téléchargez le plugin, Apache Maven Compiler Plugin »3.1 comme il est disponible dans le bocal et ouvrez-le dans n'importe quel outil de compression de fichiers comme 7-zip

Traversez le pot et découvrez

plugin.xml

fichier dans le dossier

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

Vous verrez maintenant la section suivante dans le fichier,

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

Regardez le code ci-dessus et découvrez les 2 lignes suivantes

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

Bonne chance.

garçon voyou
la source
1
Oui. Cela n'a rien à voir avec Eclipse. Par exemple, vous obtenez le même problème dans IntelliJ IDEA si vous créez un projet Maven avec l' quickstartartefact.
Jan Hettich
Salut, merci d'avoir signalé la cause du problème :) Je l'apprécie vraiment!
IanGabes
6

Votre JRE a probablement été défini dans la configuration d'exécution. Suivez ces étapes dans Eclipse pour modifier le JRE de génération.

1) Faites un clic droit sur le projet et sélectionnez Exécuter en tant que > Exécuter les configurations

2) Dans la fenêtre Exécuter les configurations, sélectionnez la configuration de construction de votre projet dans le panneau de gauche. Sur la droite, vous verrez différents onglets: Principal, JRE, Actualiser, Source, ...

3) Cliquez sur l'onglet JRE, vous devriez voir quelque chose comme ça

entrez la description de l'image ici

4) Par défaut, le JRE par défaut de travail (le JRE que vous sélectionnez par défaut sous Préférences-> Java-> JRE installés ) sera utilisé. Si vous souhaitez utiliser un autre JRE installé, cochez la case Autre JRE et sélectionnez votre JRE préféré dans la liste déroulante.

Tony Vu
la source
Merci pour cette réponse, ma configuration d'exécution fonctionnait avec l'espace de travail par défaut, donc cela a vraiment aidé!
Damir Ciganović-Janković
Cela a aidé, je ne peux pas croire que nous ayons oublié cela!
phil oO
3

Solution la plus simple dans Springboot

Je vais vous donner le plus simple si vous utilisez Springboot:

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

Ensuite, faites un clic droit sur votre projet Eclipse: Maven> Mettre à jour le projet> Mettre à jour la configuration du projet à partir de pom.xml

Cela devrait suffire.

sancho21
la source
2

Paramètres spécifiques au projet

Un autre endroit où cela peut mal tourner est dans les paramètres spécifiques au projet, dans Eclipse.

  1. propriétés du projet: cliquez sur votre projet et sur l'une des options suivantes:

    • Alt + Entrée
    • Menu> Projet> Propriétés
    • clic droit sur votre projet> propriétés du projet (dernier élément du menu)
  2. cliquez sur "Java Compiler"

  3. Décochez "Activer les paramètres spécifiques au projet" (ou modifiez-les tous à la main).

En raison des exigences des clients, nous leur avons permis de conserver nos projets en 1.6. Quand il a été nécessaire de passer à la version 1.7, nous avons eu du mal car nous devions changer la version java partout:

  • projet POM
  • Eclipse Workspace par défaut
  • paramètres spécifiques au projet
  • exécution de machine virtuelle (1.6 a été utilisé pour tout)
manuelvigarcia
la source
1

Une raison de plus possible si vous utilisez Tycho et Maven pour construire des bundles, c'est que vous avez un mauvais environnement d'exécution ( Bundle-RequiredExecutionEnvironment) dans le fichier manifeste ( manifest.mf) défini. Par exemple:

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

Dans mon cas, tout le reste allait bien. Les plugins du compilateur (maven normal et tycho également) ont été définis correctement, m2 a toujours généré l'ancien niveau de conformité en raison du manifeste. Je pensais partager l'expérience.

Gábor Lipták
la source
1

J'ai trouvé que mon problème était que quelqu'un avait validé le fichier .project et .classpath qui avait des références à Java1.5 comme JRE par défaut.

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

En fermant le projet, en supprimant les fichiers, puis en réimportant en tant que projet Maven, j'ai pu correctement configurer le projet pour utiliser l'espace de travail JRE ou le jdk correspondant sans qu'il revienne à 1.5. Ainsi, évitez de vérifier dans votre SVN les fichiers .project et .classpath

J'espère que cela aide les autres.

iowatiger08
la source
0

Si vous voulez vous assurer que les projets nouvellement créés ou les projets importés dans Eclipse utilisent une autre version java par défaut que Java 1.5, vous pouvez modifier la configuration dans le plug-in maven-compiler-plugin.

  • Accédez au dossier .m2 / repository / org / apache / maven / plugins / maven-compiler-plugin / 3.1
  • Ouvrez maven-compiler-plugin-3.1.jar avec un programme zip.
  • Accédez à META-INF / maven et ouvrez le plugin.xml
  • Dans les lignes suivantes:
    <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>

  • changez la valeur par défaut en 1.6 ou 1.8 ou ce que vous voulez.

  • Enregistrez le fichier et assurez-vous qu'il est réécrit dans le fichier zip.

Désormais, tous les nouveaux projets Maven utilisent la version java que vous avez spécifiée.

Les informations proviennent du billet de blog suivant: https://sandocean.wordpress.com/2019/03/22/directly-generating-maven-projects-in-eclipse-with-java-version-newer-than-1-5/

user1201626
la source
0

Pour changer la version de JDK, vous pouvez faire:

1- Projet> Propriétés
2- Allez sur Java Build Path
3- Dans les bibliothèques, sélectionnez JRE System ... et cliquez sur Edit
4- Choisissez votre version appropriée et validez

Achref EL Mouelhi
la source