Compilazione del codice Java 7 tramite Maven


155

I miei elenchi di file pom

<project>
  <build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.0</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.12.4</version>
            </plugin>
        </plugins>
    </pluginManagement>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
    </plugins>
  ...

Comunque mvn clean install, capisco

[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] Failure executing javac, but could not parse the error:
javac: invalid target release: 1.7
Usage: javac <options> <source files>

/usr/bin/java -versionè ( which javapunti qui)

java version "1.7.0_10"
Java(TM) SE Runtime Environment (build 1.7.0_10-b18)
Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)

javac punta anche alla versione Java corretta

/usr/bin/javac -> /Library/Java/JavaVirtualMachines/jdk1.7.0_10.jdk/Contents/Home/bin/javac

Su questa macchina, sto usando zsh( echo $0ritorna -zsh)

Nel mio .zshrc, ho definito:

 33 # HOME
 34 JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_10.jdk/Contents/Home
 35 SCALA_HOME=/Library/Scala/current
 36 FORGE_HOME=~/tools/forge/
 37 
 38 # PATH
 39 PATH="/Library/Frameworks/Python.framework/Versions/3.2/bin:${PATH}"
 40 PATH=${PATH}:${JAVA_HOME}/bin
 41 PATH=${PATH}:/bin/
 42 PATH=${PATH}:/sbin/
 43 PATH=${PATH}:/usr/bin/
 44 PATH=${PATH}:/usr/sbin/
 45 PATH=${PATH}:/opt/local/bin/
 46 PATH=${PATH}:/opt/local/sbin/
 47 PATH=${PATH}:/usr/local/git/bin
 48 PATH=${PATH}:/usr/local/git/sbin
 49 PATH=${PATH}:/Applications/Xcode.app/Contents/Developer/usr/bin
 50 PATH=${PATH}:${SCALA_HOME}/bin
 51 PATH=${PATH}:${FORGE_HOME}/bin
 52 
 53 export PATH

Quando corro mvn clean install --debugvedo che in effetti utilizzo Java 6

  1 Apache Maven 3.0.3 (r1075438; 2011-02-28 11:31:09-0600)
  2 Maven home: /usr/share/maven
  3 Java version: 1.6.0_35, vendor: Apple Inc.
  4 Java home: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

Dove potrebbe essere definito? Ho fonte (d) il mio .zshrc più volte.


2
Il tuo PERCORSO non ha /usr/binprima nella sua lista di directory. Prova javac -versionsenza specificare una directory.
— Peter Lawrey,

@ PeterLawrey, ho capitojavac 1.7.0_10
— James Raitsev il

2
Che cosa echo $JAVA_HOMEti dice?
— Andrew Logvinov,

2
E la tua variabile JAVA_HOME? mvn utilizzerà JAVA_HOME. Inoltre, stai costruendo dalla riga di comando o all'interno dell'IDE?
— Lucas,

8
Se --debugusi Maven , dovrebbe dirti esattamente la riga di comando che sta usando per correre javac(insieme a tonnellate di altre cose). Cosa dice?
— Emil Sit,

Risposte:


153

Controlla lo mvnscript nell'installazione di Maven per vedere come sta costruendo il comando. Forse tu o qualcun altro avete programmato un codice JAVA_HOMEe vi siete dimenticati.


8
Signore, sei il vincitore. In effetti qualcuno ha codificato JAVA_HOME all'interno della sceneggiatura! GRAZIE
— James Raitsev il

21
Heh, non che io l'abbia mai fatto prima o altro ... :)
— Ryan Stewart il

4
Lo mvnscript non era compatibile con la mia installazione OSX di Oracle JDK 7, e non ho fatto nulla di eccezionale nel configurarlo (lo script cerca una cartella Library/Java/JavaVirtualMachines/CurrentJDKche non esisteva per me (ciò che esisteva è jdk1.7.0_25.jdkinvece di CurrentJDK). una soluzione elegante ma ho appena codificato l'esportazione e ora funziona (PS: maven su OSX è a /usr/share/maven/bin/mvn)
— Raekye

6
OSX 1.9.2 mavericks, con maven installato tramite homebrew, lo script mvn si trovava in/usr/local/bin/mvn
— StackExchange What The Heck

1
Ho avuto un set JAVA_HOME e questo mi ha dato la chiave. GRAZIE!! : D
— Alfonso Nishikawa,

109

prova a utilizzare una versione più recente del plug-in del compilatore maven:

    <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.2</version>
        <configuration>
            <source>1.7</source>
            <target>1.7</target>
        </configuration>
    </plugin>

inoltre, specificare la codifica dei file di origine in maven è meglio fatto a livello globale:

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

EDIT : Dato che questa risposta sta ancora attirando l'attenzione, vorrei solo sottolineare che gli ultimi valori (al momento dell'ultima modifica) sono 3.2 per il plugin del compilatore Maven e 1.8 per Java, poiché le domande sulla compilazione del codice Java 8 tramite Maven sono legate a apparire presto :-)


L'aggiunta di "<versione> 3.0 </versione>" ha risolto il problema.
— Sriram,

@radai, adesso è 3.2, ma sciocco continuare ad aggiornarsi perché non smetterà mai di aumentare ...
— Lucas

@Lucas - non voglio essere responsabile per le persone che si attengono a versioni obsolete, tutto qui. non
— posso

Perché questa risposta ha quasi un centinaio di voti quando non è la soluzione corretta alla domanda posta? Mi sono perso ...
— Zero3,

48

Ho avuto lo stesso problema e per risolverlo seguo questo articolo del blog: http://www.mkyong.com/java/how-to-set-java_home-environment-variable-on-mac-os-x/

$ vim .bash_profile 

export JAVA_HOME=$(/usr/libexec/java_home)

$ source .bash_profile

$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home

tk speciali a @mkyong

EDIT: Ora sto usando: jEnv + sdkman


3
Questo ha funzionato per me. Sto usando un mac, con maven di macports e il sun jdk. Apparentemente quella combo era complicata.
— Quantum7,

1
Ottimo lavoro. Grazie per tutti i comandi! Funziona ora su Maveriks
— Maksim il

1
Questa è la soluzione più semplice ed elegante. Grazie!
— BK-

26

Controlla pom.xml per i tag seguenti

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

dovrebbe puntare alla versione jdk richiesta


19

Devi controllare la versione di Maven:

mvn -version

Troverai la versione Java che Maven utilizza per la compilazione. Potrebbe essere necessario ripristinare JAVA_HOME se necessario.


19

Ho avuto lo stesso problema. Ho scoperto che questo è perché lo script Maven guarda il link CurrentJDK di seguito e trova un JDK 1.6. Anche se si installa l'ultimo JDK questo non viene risolto. Mentre potresti semplicemente impostare JAVA_HOME nel tuo script $ HOME / .bash_profile, ho scelto di correggere il collegamento simbolico invece come segue:

ls -l /System/Library/Frameworks/JavaVM.framework/Versions/
total 64
lrwxr-xr-x  1 root  wheel   10 30 Oct 16:18 1.4 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 30 Oct 16:18 1.4.2 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 30 Oct 16:18 1.5 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 30 Oct 16:18 1.5.0 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 30 Oct 16:18 1.6 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 30 Oct 16:18 1.6.0 -> CurrentJDK
drwxr-xr-x  9 root  wheel  306 11 Nov 21:20 A
lrwxr-xr-x  1 root  wheel    1 30 Oct 16:18 Current -> A
lrwxr-xr-x  1 root  wheel   59 30 Oct 16:18 CurrentJDK -> /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents

Si noti che CurrentJDK punta a 1.6.0.jdk

Per risolverlo ho eseguito i seguenti comandi (è necessario controllare la versione installata e adattarsi di conseguenza).

sudo rm /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK
sudo ln -s /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/ /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK

Se mvn clean install -debug mostra java 1.6 questa è la risposta corretta
— cetnar

4

Diagnostica:

Puoi vedere quale versione Java utilizza Maven eseguendo "mvn --version"

Soluzione per Debian:

Lo script mvn imposta internamente la variabile env JAVA_HOME cercando javac (quale javac). Pertanto, se hai più versioni java installate contemporaneamente, ad esempio JDK 6 e JDK 7 e usi il sistema Debian Alternatives per scegliere tra di loro, anche se hai cambiato l'alternativa per "java" in JDK 7, mvn userà comunque JDK 6. Tu cambiare anche l'alternativa a "javac". Per esempio:

# update-alternatives --set javac /usr/lib/jvm/java-7-openjdk-amd64/bin/javac

MODIFICARE:

In realtà, una soluzione ancora migliore è usare update-java-alternatives (ad es.)

# update-java-alternatives -s java-1.7.0-openjdk-amd64

come descritto in https://wiki.debian.org/JavaPackage , perché questo cambierà tutte le alternative ai vari strumenti Java (ce ne sono una dozzina).


Grazie, proprio quello che stavo cercando
— evandongen,

Grazie, sono rimasto confuso dopo aver impostato la versione java con: update-alternatives --config javac
— Leonard Saers

2

Potresti provare un plugin più recente; sul sito del Maven:

<version>3.0</version>

Ho visto anche quanto segue:

<compilerVersion>1.7</compilerVersion>

Non funziona. [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.0:compile (default-compile) on project divs: Fatal error compiling: invalid target release: 1.7 -
— James Raitsev,

Ho usato con successo 2.3.2 per compilare 1.7 prima ... Ma sempre buono usare l'ultimo se possibile.
— Lucas,

Cercato ulteriormente. Controlla la gestione del tuo plugin di dipendenza se lo usi.
— Joop Eggen,

Aggiunto <pluginDependency>, stesso problema
— James Raitsev il

Se si tratta di un progetto del modulo, vale la pena esaminare il progetto principale. Questo non può essere il caso qui. Maven funziona con Java 1.7?
— Joop Eggen,

2

Prova a cambiare le impostazioni del compilatore Java in Proprietà in Eclipse-

Vai a: Preferenze-> Java-> Compilatore-> Livello di conformità del compilatore-> 1.7 Applica Ok

Riavvia IDE.

Conferma l'impostazione del compilatore per il progetto: Vai a: Proprietà progetto-> Compilatore Java-> Deseleziona (Usa Conformità dall'ambiente di esecuzione 'JavaSE-1.6' sul percorso di compilazione Java.) E seleziona 1.7 dal menu a discesa. (Ignora se già 1.7)

Riavvia IDE.

Se il problema persiste, eseguire i singoli casi di test utilizzando il comando nel terminale-

mvn -Dtest=<test class name> test

2

Non sei sicuro di quale sia il sistema operativo in uso qui, ma puoi eliminare molte versioni java vanificando un debian / ubuntu con update-java-alternative per impostare il sistema jvm predefinito su larga scala.

#> update-java-alternatives -l
java-1.6.0-openjdk-amd64 1061 /usr/lib/jvm/java-1.6.0-openjdk-amd64
java-1.7.0-openjdk-amd64 1071 /usr/lib/jvm/java-1.7.0-openjdk-amd64
java-6-sun 63 /usr/lib/jvm/java-6-sun
java-7-oracle 1073 /usr/lib/jvm/java-7-oracle

Per impostarne uno nuovo, utilizzare:

#> update-java-alternatives -s java-7-oracle

Non è necessario impostare JAVA_HOME per la maggior parte delle app.


2

fai clic con il tasto destro del mouse sul tuo progetto in eclipse e apri "Esegui configurazioni" .. controlla lì la versione jre. alcune volte questo non cambierà di default in eclipse, dopo aver anche cambiato la versione nel buildpath.


2

Per una compilazione specifica che richiede una /etc/alternatives/javaJVM (non predefinita ), considera il prefisso del mvncomando in JAVA_HOMEquesto modo,

JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/ mvn package

Qui assumiamo che il valore predefinito sia Java 8, mentre per il progetto specifico a portata di mano abbiamo bisogno di Java 7.


Questo ha funzionato meglio per me poiché non è necessario apportare modifiche alla fonte del progetto6 scaricato da GIT (o SCM)
— jwilleke,

Questa risposta merita più voti. Mi ha aiutato a compilare un codice che richiedeva Java 7 sulla mia macchina in cui il valore predefinito era Java 8 - senza dover installare e reinstallare Java7 e Java 8.
— R11G

1

{JAVA_1_4_HOME} / bin / javacy puoi provare anche ...

<plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
                <source>1.7</source>
                <target>1.7</target>
                <showDeprecation>true</showDeprecation>
                <showWarnings>true</showWarnings>
                <executable>{JAVA_HOME_1_7}/bin/javac</executable>
                <fork>true</fork>
        </configuration>
    </plugin>

4
Non è necessario codificare il percorso su alcun codice che verrà mai condiviso.
— Jan Segre,

@Jan Segre, ok lo cambio :)
— baybora.oren

0

Ok, ho appena risolto questo problema anche da solo. È più importante il tuo JAVA_HOME, se non hai una versione inferiore o nessuna rispetto alle proprietà di origine / destinazione del plug-in Maven, otterrai questo errore.

Assicurati di avere una buona versione nel tuo JAVA_HOME e di averlo incluso nel PERCORSO.


0

È possibile che tu stia specificando una versione errata di java. java -version (nel tuo terminale) per verificare la versione di java che stai utilizzando. Vai a maven-compile-plugin per l'ultima versione del compilatore maven Il tuo plugin potrebbe apparire così se stai usando java 6 e l'ultima versione del plugin del compilatore maven è 3.1

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>

0

Nessuna delle risposte precedenti ha risolto completamente il mio caso d'uso.

Necessario per rimuovere la directory che si stava creando. Pulito. E quindi reinstallare. Sembra un problema di autorizzazioni silenziose.


0

Ho avuto questo problema in IntelliJ IDEA 14 fino a quando non sono entrato nel menu File -> Struttura del progetto, cambiando l'SDK del progetto in 1.7 e il livello del linguaggio del progetto in 7.


0

Ho avuto questo problema quando ho lavorato con Eclipse, ho dovuto cambiare il percorso di compilazione del progetto in modo che si riferisse a jre 7

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.