web-dev-qa-db-fra.com

Maven ne peut pas compiler Java 1.8

J'essaie d'utiliser maven pour construire un pot mais je continue à avoir l'erreur

ERROR] Failed to execute goal org.Apache.maven.plugins:maven-compiler-plugin:3.1:compile 
(default-compile) on project Application: Fatal error compiling: invalid target release: 1.8 -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.Apache.org/confluence/display/MAVEN/MojoExecutionException

sorties mvn -v

mvn -version
Apache Maven 3.2.5 (12a6b3acb947671f09b81f49094c53f426d8cea1; 2014-12-14T09:29:23-08:00)
Maven home: /usr/local/Cellar/maven/3.2.5/libexec
Java version: 1.6.0_65, vendor: Apple Inc.
Java home: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
Default locale: en_US, platform encoding: MacRoman
OS name: "mac os x", version: "10.10.1", Arch: "x86_64", family: "mac"

Donc, on dirait qu'il pointe vers le 1.6jdk 

mais j'ai le 1.8 jdk

Version Java

Java -version
Java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)

POM.xml

 <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.brian.ridecellchallenge</groupId>
    <artifactId>Application</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <build>
        <sourceDirectory>src</sourceDirectory>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>1.6</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer
                                    implementation="org.Apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.group.id.Launcher1</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>


    </build>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.6</version>
        </dependency>
    </dependencies>
</project>
14
Brian

Maven s'appuie sur la variable d'environnement Java_HOME définie. Configurez-le en fonction de votre système d'exploitation et réexécutez votre construction.

Edit: Utilisez export pour définir la variable.

export Java_HOME=/path/to/Java
14
JamesB

En tant qu'utilisateur MacOS, ouvrez une Terminal et créez ou modifiez un fichier .bash_profile (dans le répertoire de votre répertoire utilisateur) et insérez-y l'extrait suivant:

export Java_HOME=`/usr/libexec/Java_home -v 1.8`

Enregistrez ce fichier et rouvrez une instance de terminal. Si vous exécutez export en tant que commande, vous devriez voir un Java_HOME valide indiquant l'emplacement de votre installation JDK 8. Redémarrez votre IDE par la suite et maven devrait pouvoir vous générer du code Java target 1.8 de Nice.

11
MWiesner

vous pouvez essayer la configuration dans le plugin du compilateur. Son travail sur mon local

      <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.3</version>
            <configuration>
                <executable><!--path-to-your-Java8-home-directoru--></executable>
                <compilerVersion>1.8</compilerVersion>
            </configuration>
        </plugin>
7
Bharat Bhagat

Parce que Maven ne connait pas la version de jdk que vous voulez compiler . Vous pouvez essayer avec 

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>
6
Luan Nguyen

J'ai remarqué qu'il semble que maven-compiler-plugin ignore les configurations

<source>1.8</source>
<target>1.8</target>

En fait, en construisant mon projet avec l'option -X maven, je vois que dans la configuration du plugin maven-compiler-plugin, les sources et les cibles ont été forcées à être 1.6:

[DEBUG] --------------------------------------------------------------
[DEBUG] Goal:          org.Apache.maven.plugins:maven-compiler-plugin:3.3:testCompile (default-testCompile)
[DEBUG] Style:         Regular
[DEBUG] Configuration: <?xml version="1.0" encoding="UTF-8"?>
<configuration>
 <basedir default-value="${basedir}"/>
 <buildDirectory default-value="${project.build.directory}"/>
 <classpathElements default-value="${project.testClasspathElements}"/>
 <compileSourceRoots default-value="${project.testCompileSourceRoots}"/>
 <compilerId default-value="javac">${maven.compiler.compilerId}</compilerId>
 <compilerReuseStrategy default-value="${reuseCreated}">${maven.compiler.compilerReuseStrategy}    </compilerReuseStrategy>
 <compilerVersion>${maven.compiler.compilerVersion}</compilerVersion>
 <debug default-value="true">${maven.compiler.debug}</debug>
 <debuglevel>${maven.compiler.debuglevel}</debuglevel>
 <encoding default-value="${project.build.sourceEncoding}">UTF-8</encoding>
 <executable>${maven.compiler.executable}</executable>
 <failOnError default-value="true">${maven.compiler.failOnError}</failOnError>
 <forceJavacCompilerUse default-value="false">${maven.compiler.forceJavacCompilerUse}</forceJavacCompilerUse>
 <fork default-value="false">${maven.compiler.fork}</fork>
 <generatedTestSourcesDirectory default-value="${project.build.directory}/generated-test-sources/test-annotations"/>
 <maxmem>${maven.compiler.maxmem}</maxmem>
 <meminitial>${maven.compiler.meminitial}</meminitial>
 <mojoExecution default-value="${mojoExecution}"/>
 <optimize default-value="false">${maven.compiler.optimize}</optimize>
 <outputDirectory default-value="${project.build.testOutputDirectory}"/>
 <project default-value="${project}"/>
 <session default-value="${session}"/>
 <showDeprecation default-value="false">${maven.compiler.showDeprecation}</showDeprecation>
 <showWarnings default-value="false">${maven.compiler.showWarnings}</showWarnings>
 <skip>${maven.test.skip}</skip>
 <skipMultiThreadWarning default-value="false">${maven.compiler.skipMultiThreadWarning}</skipMultiThreadWarning>
 <source default-value="1.5">1.6</source>
 <staleMillis default-value="0">${lastModGranularityMs}</staleMillis>
 <target default-value="1.5">1.6</target>
 <testSource>${maven.compiler.testSource}</testSource>
 <testTarget>${maven.compiler.testTarget}</testTarget>
 <useIncrementalCompilation default-value="true">${maven.compiler.useIncrementalCompilation}</useIncrementalCompilation>
  <verbose default-value="false">${maven.compiler.verbose}</verbose>

J'ai résolu le problème après beaucoup de recherches et d'essais, en obligeant le compilateur Java à utiliser la source et la cible souhaitées:

<compilerArguments>
  <source>1.8</source>
  <target>1.8</target>
</compilerArguments>

Cela ajoute aux paramètres de javac les deux paramètres ci-dessus, écrasant les valeurs par défaut.

Dans mon cas, tout fonctionne bien.

Juste une remarque: je vois qu'avec la configuration ci-dessus, maven appelle le javac de cette façon:

-d [...] -g -nowarn -target 1.6 -source 1.6 -encoding UTF-8 -source 1.8 -target 1.8

Les deux premiers paramètres "-source" et "-target" sont les paramètres par défaut utilisés par le plug-in maven-compiler-plugin; le second couple de paramètres sont les paramètres ajoutés par le plugin en raison de la configuration "compilerArguments" décrite ci-dessus. Il semble que javac n'utilise que les derniers paramètres (si un paramètre est répété plusieurs fois, le dernier écrase tous les précédents), mais je ne suis pas sûr que cela puisse être considéré comme un comportement standard et "sûr".

J'ai utilisé différentes versions de maven-compiler-plugin, différentes versions de maven. J'ai vérifié toutes mes configurations (par exemple, les variables système, chaque script utilisé pour l'exécution de Java ou de maven, etc.) et je suis sûr que tout va bien. 

C'est étrange, mais ma conclusion est qu'il y a un bogue dans le plugin maven-compiler-avec Java 8.

5
Rick Deckard

Je ne suis pas sûr, mais pouvez-vous essayer de mettre à jour votre version de maven.plugin

essayer

<plugin>
        <groupId>org.Apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
            </configuration>
        <version>3.6.1</version>
</plugin>
2
joan

Si quelqu'un utilise Eclipse Kepler SR2 et a un problème avec Java 1.8 lors de la création d'un projet avec Maven, essayez d'aller sur Eclipse Marketplace et recherchez un plugin appelé support de Java 8 pour m2e pour Eclipse Kepler SR2 cela m'a aidé, et maintenant Maven compile la source Java 1.8 sans problème.

0
DominikStyp