2010-03-23 14 views
88

Estoy intentando construir un complemento de Hudson que he modificado y requiere jdk1.6. Esto está bien, pero no veo cómo puedo decirle a maven dónde está el jdk. He encontrado pocas menciones en Internet, pero parece que no se aplican a mí. Algunos sugieren agregar alguna configuración al .m2/settings.xml pero no tengo un settings.xml. Además, no quiero usar 1.6 para todas las compilaciones maven.Especifique JDK para que Maven use

One kink es Estoy usando mvn en cygwin, si eso es importante. Parece que debería poder hacer la especificación en el archivo pom del proyecto, pero el pom existente es bastante simple.

Así que, en resumidas cuentas, ¿hay alguna manera de especificar un jdk para una sola invocación de maven?

Respuesta

81

De modo que la conclusión es, ¿hay alguna manera de especificar un jdk para una sola invocación de maven?

Cambie temporalmente su JAVA_HOME.

+7

Ejemplo de ventanas: 'set JAVA_HOME =" C : \ Java \ jdk7 "' – acdcjunior

+4

en lubuntu: JAVA_HOME = "/ home/desa/programas/jdks/jdk1.6.0_45 /" mvn -v –

+3

Y en caso de que alguien más se olvide y pase años preguntándose por qué no pueden cambiarlo : 'JAVA_HOME' se puede configurar para Maven (al menos en Mac) en este archivo:'/private/etc/mavenrc' - Y eso puede usar algo así como (¡fíjate en las comillas!): '' Export JAVA_HOME = '/ usr/libexec/java_home -v 1.7.0_75'' ' – RedYeti

3

Hudson también le permite definir varios tiempos de ejecución de Java y le permite invocar a Maven con uno de estos. Eche un vistazo más de cerca en la página de configuración.

+0

El OP está compilando un complemento hudson en la línea de comandos, no bajo hudson (al menos, esto es lo que entiendo). –

+0

Releí la pregunta, creo que la leyó bien. –

11

te dicen configuración JAVA_HOME como Pascal está diciendo: En cygwin si utiliza bash como shell debe ser "export JAVA_HOME =/cygdrive/c/pathtothejdk" Y nunca perjudica a exportar también el directorio bin de Java para la RUTA con "export PATH = $ {JAVA_HOME}/bin: $ {PATH}"

y también agrega maven-enforce-plugin para asegurarte de que se utiliza el jdk correcto. Esta es una buena práctica para tu pom.

<build> 
<plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-enforcer-plugin</artifactId> 
     <executions> 
     <execution> 
      <id>enforce-versions</id> 
      <goals> 
      <goal>enforce</goal> 
      </goals> 
      <configuration> 
      <rules> 
       <requireJavaVersion> 
       <version>1.6</version> 
       </requireJavaVersion> 
      </rules> 
      </configuration> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 

http://maven.apache.org/plugins/maven-enforcer-plugin/usage.html

+1

Esto fue perfecto para especificar la * exacta * versión del JDK. Por ejemplo, tengo un proyecto que falla al usar el JDK 1.8 inicial, pero si usa JDK 1.8.0_77, funciona bien. Tenía ambos JDK instalados, y con esta solución Maven me dijo que estaba usando la versión incorrecta de 1.8 hasta que cambié mi ruta JAVA_HOME para apuntarme a la carpeta específica 1.8.0_77. Las otras respuestas no le permitieron ser tan detallado en la versión. – bojingo

+0

¡Me alegro de que te haya ayudado! – feniix

17

Como dijo u "Además, no quiero usar 1.6 para todas experto construye." .... Así que mejor voy a decir modificar su archivo POM y especificar qué versión JDK usar.

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <source>1.7</source> 
       <target>1.7</target> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

Garantizará que su proyecto en particular utilice esa versión de jdk.

+3

Este es solo el punto de partida, pero no la solución. Este es el requisito para que el complemento compilador maven compile para 1.7. Y luego, el truco es hacer que maven sea realmente capaz de compilar para 1.7, que no es tan trivial si tu versión java actual es diferente ... –

+0

Esa es otra pregunta http://stackoverflow.com/questions/16723533/how-do -usted-especifica-el-compilador-java-versión-en-un-pom-xml-archivo –

4

Maven utiliza la variable $ JAVACMD como el último comando de java, configúralo en el lugar donde el ejecutable de Java cambiará a otro JDK.

61

Parece que Maven ahora da una solución a este problema: Compiling Sources Using A Different JDK

Digamos que sus JAVA_HOME puntos a JDK7 (que se desarrollará procesos de Maven)

Su pom.xml podrían ser:

<build> 
    <plugins> 
     <!-- we want JDK 1.6 source and binary compatiblility --> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <source>1.6</source> 
       <target>1.6</target> 
      </configuration> 
     </plugin> 
     <!-- ... --> 
     <!-- we want sources to be processed by a specific 1.6 javac --> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.1</version> 
      <configuration> 
       <verbose>true</verbose> 
       <fork>true</fork> 
       <executable>${JAVA_1_6_HOME}/bin/javac</executable> 
       <compilerVersion>1.3</compilerVersion> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

Si su los desarrolladores solo agregan (y personalizan) las siguientes líneas en su settings.xml, su pom será independiente de la plataforma:

<settings> 
    [...] 
    <profiles> 
    [...] 
    <profile> 
     <id>compiler</id> 
     <properties> 
      <JAVA_1_4_HOME>C:\Program Files\Java\j2sdk1.4.2_09</JAVA_1_4_HOME> 
      <JAVA_1_6_HOME>C:\Program Files\Java\j2sdk1.6.0_18</JAVA_1_6_HOME> 
     </properties> 
    </profile> 
    </profiles> 
    [...] 
    <activeProfiles> 
    <activeProfile>compiler</activeProfile> 
    </activeProfiles> 
</settings> 
+11

¡Votado!Descubrí que puedo usar '-Dmaven.compiler.fork = true' y' -Dmaven.compiler.executable =/path/to/target/javac' en la línea de comandos. –

+0

incluso usando esos java-opts, todavía debe agregar esto al complemento del compilador $ {maven.compiler.executable}

+1

@JinKwon Pasar opciones con -D funciona bien, incluso sin definirlo en la sección del complemento del compilador. Esto es bueno para el uso ocasional o para secuencias de comandos. ¡Debería ponerlo en una respuesta separada para que podamos votarlo! –

0

tuve construir problema con Maven dentro de Eclipse en Windows 7.

Aunque he observado acumulación mvn estaba funcionando muy bien desde la línea de comandos.

mvn -T 5 -B -e -X -U -P test clean install -Dmaven.surefire.debug --settings ..\..\infra-scripts\maven-conf\settings.xml > output.log 

Eclipse estaba considerando como predeterminado JVM una instalación de JRE en lugar de JDK por lo que estaba fallando en la compilación.

he añadido a eclipse.ini siguiente línea:

-vm 
C:\Program Files (x86)\Java\jdk1.8.0_25\bin 

también cuando se parte de Eclipse que utilicé en la sección "Objetivos" lista siguiente:

-T 5 -B -e -X -U -P test clean install -Dmaven.surefire.debug --settings ..\..\infra-scripts\maven-conf\settings.xml 

Error de compilación se resolvió.

16

compile:compile tiene a user property que le permite especificar una ruta al javac.

Tenga en cuenta que esta propiedad de usuario solo funciona cuando fork es true que es false de forma predeterminada.

$ mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable=/path/to/the/javac compile 

Es posible que tenga que doblar el valor si contiene espacios.

> mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable="C:\...\javac" compile 

Véase también Maven custom properties precedence.

7

Sé que es un hilo viejo. Pero tenía algunos problemas con algo similar a esto en la fuente de compilación de Maven para Java 8. Me di cuenta de esto con una solución rápida mencionado en this article pensé que puedo ponerlo aquí y tal vez puede ayudar a los demás:

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <maven.compiler.source>1.8</maven.compiler.source> 
    <maven.compiler.target>1.8</maven.compiler.target> 
</properties> 
1

Para Java 9: ​​

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.7.0</version> 
      <configuration> 
       <source>9</source> 
       <target>9</target> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 
Cuestiones relacionadas