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.