2009-07-31 6 views

Répondre

24

Si vous souhaitez définir la conformité à la version Java appropriée, vous pouvez configurer le plug-in du compilateur pour chaque exécution. En supposant que Maven utilise un JDK au moins aussi courant que la version la plus élevée que vous spécifiez. En utilisant les propriétés que vous pouvez modifier cette configuration sur la ligne de commande ou un enfant en cas de besoin:

<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 vous voulez dire en utilisant différents compilateurs, qui est un peu plus impliqué. Comme vous devez spécifier le chemin vers le JDK et la version du compilateur que vous utilisez. Encore une fois, ceux-ci peuvent être définis dans les propriétés. Bien que vous pouvez les définir dans votre 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> 

Notez qu'il peut être judicieux de définir les configurations du compilateur dans les profils, un pour chaque JDK que vous soutenez, afin que votre normale builds ne comptez pas sur les propriétés étant mis en

En outre, 3.x Maven, vous devez inclure le paramètre fork lors de la spécification de l'exécutable, par exemple:

<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

Lorsque je tente le premier exemple avec la source et la version cible '1.8' pour les tests et' 1.7' pour le code principal, la compilation réussit quand 'mvn compile' est exécuté séparément de 'mvn test-compile', mais dans des commandes telles que' mvn compile test-compile' ou, plus simplement, 'mvn test-compile' (où' compile' est tiré) la configuration principale avec ' 1.7 'semble avoir préséance, et il échoue. –

+2

La solution est que c'est ' default-testCompile' qui remplace le comportement par défaut. La réponse ci-dessus ajoute une exécution supplémentaire. –

+0

Pardonnez mon manque de compréhension à propos des exécutions. Cela entraînera-t-il la compilation du code de l'application principale dans la même version cible que le code de test si vous exécutez des tests maven? Ou les sources principales et de test auront-elles différentes versions de bytecode cibles? –

9

J'ai eu pas de chance avec la réponse acceptée compilation java 7 source et java 8 sources de test utilisant le maven-compiler-plugin, version 3.5.1. Parce que le plugin de compilation utilisait le paramètre source/target pour les sources principale et de test.

Mais j'ai découvert qu'il existe des paramètres de configuration distincts pour la source de test et la cible.

Donc, pour moi, la solution qui a fonctionné était

<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> 
Questions connexes