Compilando código Java 7 a través de Maven

7 minutos de lectura

avatar de usuario
james raitsev

Mis listas de archivos 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>
  ...

Sin embargo, sobre mvn clean installYo obtengo

[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 es (which java puntos aquí)

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 también apunta a la versión correcta de Java

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

En esta máquina, estoy usando zsh (echo $0 devoluciones -zsh)

En mi .zshrche definido:

 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

cuando estoy corriendo mvn clean install --debug Veo que de hecho uso 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

¿Dónde se podría definir? Tengo source(d) mi .zshrc varias veces.

  • Tu PATH no tiene /usr/bin primero en su lista de directorios. Probar javac -version sin especificar un directorio.

    – Peter Lawrey

    26 de diciembre de 2012 a las 16:09


  • @PeterLawrey, entiendo javac 1.7.0_10

    –James Raitsev

    26 de diciembre de 2012 a las 16:11

  • Que hace echo $JAVA_HOME ¿decirte?

    – Andrew Logvinov

    26 de diciembre de 2012 a las 16:12

  • ¿Qué pasa con su variable JAVA_HOME? mvn usará JAVA_HOME. Además, ¿está construyendo desde la línea de comandos o dentro de IDE?

    – Lucas

    26 de diciembre de 2012 a las 16:12

  • Si ejecuta Maven con --debugdebería decirle la línea de comando exacta que está usando para ejecutar javac (junto con toneladas de otras cosas). ¿Qué dice?

    – Emil Siéntate

    26 de diciembre de 2012 a las 16:12

Comprobar el mvn script en su instalación de maven para ver cómo está construyendo el comando. Tal vez usted u otra persona ha codificado de forma rígida un JAVA_HOME allí y lo olvidé.

  • Usted señor es el ganador. ¡De hecho, alguien codificó JAVA_HOME dentro del script! GRACIAS

    –James Raitsev

    26 de diciembre de 2012 a las 17:02

  • Je, no es que me haya hecho eso antes ni nada… 🙂

    –Ryan Stewart

    26 de diciembre de 2012 a las 17:56

  • los mvn El script no era compatible con mi instalación OSX de JDK 7 de Oracle, y no hice nada sofisticado al configurarlo (el script busca una carpeta Library/Java/JavaVirtualMachines/CurrentJDK que no existió para mí (lo que existió es jdk1.7.0_25.jdk en vez de CurrentJDK). No es una solución elegante, pero codifiqué la exportación y ahora funciona (PD: maven en OSX está en /usr/share/maven/bin/mvn)

    – Raekye

    4 de agosto de 2013 a las 6:55

  • Mavericks de OSX 1.9.2, con maven instalado a través de homebrew, el script mvn estaba ubicado en /usr/local/bin/mvn

    – StackExchange Qué diablos

    19 de marzo de 2014 a las 11:45

  • Tenía un conjunto JAVA_HOME y esto dio la pista. ¡¡GRACIAS!! 😀

    –Alfonso Nishikawa

    8 de abril de 2014 a las 7:05

avatar de usuario
radai

intente usar una versión más nueva del complemento del compilador maven:

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

Además, es mejor especificar la codificación del archivo fuente en maven a nivel mundial:

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

EDITAR: Como esta respuesta aún está recibiendo atención, me gustaría señalar que los valores más recientes (a partir de la última edición) son 3.2 para el complemento del compilador maven y 1.8 para java, ya que es probable que aparezcan preguntas sobre la compilación del código java 8 a través de maven pronto 🙂

  • Agregar “3.0” solucionó el problema.

    – Sri

    27 de diciembre de 2013 a las 15:18

  • @radai, es 3.2 ahora, pero es una tontería seguir actualizando ya que nunca dejará de aumentar…

    – Lucas

    16 de noviembre de 2014 a las 19:06

  • @Lucas: simplemente no quiero ser responsable de que las personas se adhieran a versiones desactualizadas, eso es todo. no podría vivir conmigo mismo 🙂

    – radai

    20 de noviembre de 2014 a las 8:58

  • ¿Por qué esta respuesta tiene casi cien votos a favor cuando no es la solución correcta a la pregunta planteada? Estoy perdido…

    – cero3

    9 de enero de 2016 a las 4:40

avatar de usuario
eliocapelati

Tuve el mismo problema y para resolverlo sigo este artículo 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

Gracias especiales a @mkyong

EDITAR: Ahora estoy usando: jEnv + sdkman

  • Esto funcionó para mí. Estoy usando una mac, con maven de macports y sun jdk. Aparentemente ese combo fue complicado.

    – Quantum7

    5 mayo 2014 a las 14:03

  • Buen trabajo. ¡Gracias por todos los comandos! Funciona ahora en Maveriks

    – Maksim

    30 de agosto de 2014 a las 3:05

  • Esta es la solución más fácil y elegante. ¡Gracias!

    – BK-

    24 de febrero de 2015 a las 1:08

avatar de usuario
usuario4010880

Por favor revise su pom.xml para las siguientes etiquetas

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

debe señalar la versión jdk requerida

avatar de usuario
Loi Cao

Tienes que comprobar la versión de Maven:

mvn -version

Encontrará la versión de Java que utiliza Maven para la compilación. Es posible que deba restablecer JAVA_HOME si es necesario.

avatar de usuario
Chris McCarthy

Yo tuve el mismo problema. Descubrí que esto se debe a que el script Maven mira el enlace CurrentJDK a continuación y encuentra un JDK 1.6. Incluso si instala el último JDK, esto no se resuelve. Si bien podría configurar JAVA_HOME en su secuencia de comandos $HOME/.bash_profile, elegí corregir el enlace simbólico de la siguiente manera:

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

Observe que CurrentJDK apunta a 1.6.0.jdk

Para solucionarlo, ejecuté los siguientes comandos (debe verificar su versión instalada y adaptarse en consecuencia).

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

Diagnósticos:

Puede ver qué versión de Java usa Maven ejecutando “mvn –version”

Solución para Debian:

El script mvn establece la variable de entorno JAVA_HOME internamente buscando javac (cuál javac). Por lo tanto, si tiene varias versiones de Java instaladas al mismo tiempo, por ejemplo, JDK 6 y JDK 7, y usa el sistema Debian Alternatives para elegir entre ellas, aunque haya cambiado la alternativa de “java” a JDK 7, mvn seguirá usando JDK 6. también tengo que cambiar la alternativa por “javac”. P.ej:

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

EDITAR:

En realidad, una solución aún mejor es usar update-java-alternatives (p. ej.)

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

como se detalla en https://wiki.debian.org/JavaPackageporque esto va a cambiar todos las alternativas a varias herramientas de Java (hay una docena más o menos).

  • Gracias, justo lo que estaba buscando

    – evandongen

    19 de junio de 2014 a las 12:05

  • Gracias, estaba confundido después de configurar la versión de Java con: update-alternatives –config javac

    – Leonard Saers

    10 de julio de 2014 a las 9:00

¿Ha sido útil esta solución?