2015-01-15 25 views
12

Sto cercando di usare Maven per costruire un vaso, ma continuo a ricevere l'erroreMaven non può compilare java 1.8

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 

MVN -v uscite

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" 

in modo che appaia come il suo indicando la 1.6jdk

ma ho la 1.8 JDK

java -version

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

Qual è il tuo JAVA_HOME? – user944849

+0

@Brian Una delle risposte ha risolto il tuo problema? – MWiesner

risposta

13

Maven si basa sulla variabile di ambiente JAVA_HOME fase di impostazione. Impostalo in base al tuo sistema operativo e riesegui la build.

Modifica: Utilizzare l'esportazione per impostare la variabile.

export JAVA_HOME=/path/to/java 
9

Come utente MacOS, aprire un Terminal e creare o modificare un file .bash_profile (nella directory della vostra casa dell'utente) e mettere il seguente frammento c'è:

export JAVA_HOME=`/usr/libexec/java_home -v 1.8` 

Salvare il file e riaprire un'istanza di terminale. Se esegui il comando export come comando, dovresti vedere uno JAVA_HOME valido con il percorso dell'installazione di JDK 8. Riavvia il tuo IDE in seguito e Maven dovrebbe essere in grado di creare un bel codice java target 1.8.

7

puoi provare la configurazione nel plugin del compilatore. Il suo lavoro sul mio locale

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

ho notato che sembra che Maven-compiler-plugin ignora le configurazioni

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

In realtà, costruire il mio progetto con l'opzione -X Maven, vedo che nel configurazione del maven-compilatore-plugin sorgente e di destinazione sono stati costretti ad essere 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> 

ho risolto il problema dopo molto molto ricerche e tentativi, forzando il compilatore java di utilizzare la sorgente e destinazione desiderate:

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

Questo aggiunge ai parametri di javac i due parametri sopra, sovrascrivendo il valore predefinito.

Nel mio caso, tutto funziona bene.

Solo una nota: vedo che con la configurazione di cui sopra, esperto di chiama il javac in questo modo:

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

I primi due parametri "-source" "-target" sono i parametri di default che i utilizza maven-compiler-plugin; la seconda coppia di parametri sono i parametri aggiunti dal plugin a causa della configurazione "compilerArguments" descritta sopra.Sembra che javac usi solo l'ultimo paio di parametri (se un parametro viene ripetuto più volte, l'ultimo sovrascrive tutti i precedenti), ma non sono sicuro che questo possa essere considerato un comportamento standard e "sicuro".

Ho utilizzato diverse versioni di Maven-Compiler-Plugin, versione diversa di Maven. Ho controllato in profondità tutte le mie configurazioni (ad esempio variabili di sistema, ogni singolo script utilizzato nell'esecuzione di Java o Maven e così via) e sono sicuro che tutto è ok.

E 'strano, ma la mia conclusione è che c'è un bug nel Maven-compiler-plugin con java 8.

0

se qualcuno ha Eclipse Keplero SR2 e ha un problema con Java 1.8, mentre la costruzione del progetto con Maven, prova ad andare a Eclipse Marketplace e cerca il plugin chiamato supporto Java 8 per m2e per Eclipse Kepler SR2 questo mi ha aiutato, e ora Maven compila Java 1.8 fonte senza problemi.

-1

Sì, sembra un errore nel maven-compiler-plugin. Quando ho aggiornato da 3.1 a 3.5.1, funziona.

+0

Non so cosa hai trovato, ma scriviamo 2017 e non c'è ancora nessuna versione 3.5.1 di Maven ... –

+0

@ BartisÁron potresti voler controllare le versioni disponibili per maven-compiler-plugin: https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-compiler-plugin – Stultuske

+0

Strano. Ora vedo quelle versioni. Non so cosa ho visto allora ... –

2

non sono sicuro, ma si può provare ad aggiornare la versione maven.plugin

provare

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

Perché Maven non conosce la versione di JDK si vuole costruire. Puoi provare con

<properties> 
    <maven.compiler.source>1.8</maven.compiler.source> 
    <maven.compiler.target>1.8</maven.compiler.target> 
</properties> 
+0

Mentre questo codice può rispondere alla domanda, fornendo un contesto aggiuntivo su come e/o perché risolve il problema, migliorare il valore a lungo termine della risposta. Leggere questo [come risposta] (http://stackoverflow.com/help/how-to-answer). – thewaywewere