2009-07-31 14 views

Respuesta

24

Si desea establecer el cumplimiento de la versión de Java correspondiente, puede configurar el complemento del compilador para cada ejecución. Suponiendo que Maven está utilizando un JDK al menos tan actual como la versión más alta que especifique. Mediante el uso de propiedades puede anular esa configuración en la línea de comandos o en un niño si es necesario:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <configuration> 
    <source>${compileSource}</source> 
    <target>${compileSource}</target> 
    </configuration> 
    <executions> 
    <execution> 
     <id>test-compile</id> 
     <phase>process-test-sources</phase> 
     <goals> 
     <goal>testCompile</goal> 
     </goals> 
     <configuration> 
     <source>${testCompileSource}</source> 
     <target>${testCompileSource}</target> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 
... 
<properties> 
    <compileSource>1.4</compileSource> 
    <testCompileSource>1.5</testCompileSource> 
</properties> 

Si se refiere a el uso de diferentes compiladores , eso es un poco más complicado. ya que necesita especificar la ruta al JDK y la versión del compilador que está utilizando. De nuevo, estos se pueden definir en propiedades. Aunque es posible que desee definir en tu settings.xml

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <configuration> 
    <source>${compileSource}</source> 
    <target>${compileSource}</target> 
    <executable>${compileJdkPath}/bin/javac</executable> 
    <compilerVersion>${compileSource}</compilerVersion> 
    </configuration> 
    <executions> 
    <execution> 
     <id>test-compile</id> 
     <phase>process-test-sources</phase> 
     <goals> 
     <goal>testCompile</goal> 
     </goals> 
     <configuration> 
     <source>${testCompileSource}</source> 
     <target>${testCompileSource}</target> 
     <executable>${testCompileJdkPath}/bin/javac</executable> 
     <compilerVersion>${testCompileSource}</compilerVersion> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 
... 
<properties> 
    <compileSource>1.4</compileSource> 
    <testCompileSource>1.5</testCompileSource> 
    <compileJdkPath>path/to/jdk</compileJdkPath> 
    <testCompileJdkPath>path/to/test/jdk<testCompileJdkPath> 
</properties> 

Nota podría tener sentido para definir las configuraciones de compilación de perfiles, uno para cada JDK usted apoya, por lo que su construye normales no se basan en propiedades siendo establecido.

Además, en Maven 3.x, es necesario incluir el parámetro fork al especificar el ejecutable, por ejemplo:

<plugin> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <version>3.1</version> 
    <executions> 
     <execution> 
     <id>default-testCompile</id> 
     <phase>test-compile</phase> 
     <goals> 
      <goal>testCompile</goal> 
     </goals> 
     <configuration> 
      <fork>true</fork> 
      <executable>${testCompileJdkPath}/bin/javac</executable> 
      <source>1.8</source> 
      <target>1.8</target> 
     </configuration>    
     </execution> 
    </executions> 
    </plugin> 
+0

Cuando intento el primer ejemplo con origen y destino la versión '1.8' para las pruebas y' 1.7' de código principal, la compilación tiene éxito cuando 'compile' mvn se ejecuta por separado de 'mvn test-compile', pero en comandos tales como' mvn compile test-compile' o, más simplemente, 'mvn test-compile' (donde' pull' compile' se extrae) la configuración principal con ' 1.7 'parece tener prioridad, y falla. –

+2

La solución es que es ' valor predeterminado-testCompile' que anula el comportamiento predeterminado. La respuesta anterior agrega una ejecución adicional. –

+0

Perdona mi falta de comprensión sobre las ejecuciones. ¿Esto provocará que el código de la aplicación principal se compile en la misma versión de destino que el código de prueba si se ejecutan pruebas de experto? ¿O las fuentes principales y de prueba tendrán diferentes versiones de código de bytes objetivo? –

9

No tuve suerte con la respuesta aceptada la compilación de Java 7 y fuente de Java 8 fuentes de prueba usando el maven-compiler-plugin, versión 3.5.1. Debido a que el plugin de compilación utilizó el parámetro fuente/destino para las fuentes principales, de prueba y de prueba.

Pero descubrí que hay parámetros de configuración separados para la fuente de prueba y el objetivo.

Así que para mí la solución que funcionó fue

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.5.1</version> 
      <configuration> 
       <source>1.7</source> 
       <target>1.7</target> 
       <testSource>1.8</testSource> 
       <testTarget>1.8</testTarget> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 
Cuestiones relacionadas