2009-07-31 15 views

risposta

24

Se si desidera impostare la conformità alla versione Java pertinente, è possibile configurare il plug-in del compilatore per ogni esecuzione. Supponendo che Maven stia usando un JDK almeno attuale come la versione più alta che hai specificato. Utilizzando le proprietà è possibile ignorare che la configurazione sulla riga di comando o in un bambino, se necessario:

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

se si intende utilizzare diversi compilatori , che è un po 'più complesso. poiché è necessario specificare il percorso del JDK e la versione del compilatore che si sta utilizzando. Di nuovo questi possono essere definiti nelle proprietà. Anche se si consiglia di definirli in 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 potrebbe avere senso per definire le configurazioni del compilatore nei profili, uno per ogni JDK sostenete, in modo che il vostro normale costruisce non fare affidamento sulle proprietà essere impostato.

Inoltre, in Maven 3.x, è necessario includere il parametro fork quando si specifica l'eseguibile, esempio:

<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

Quando tento il primo esempio con la versione sorgente e la destinazione '1.8' per le prove e' 1.7' per codice principale, la compilazione riesce quando 'compile' mvn viene eseguito separatamente da 'mvn test-compile', ma in comandi come' mvn compile test-compile' o, più semplicemente, 'mvn test-compile' (dove' compile' viene estratto) la configurazione principale con ' 1.7 'sembra avere la precedenza, e fallisce. –

+2

La soluzione è che è ' default-testCompile' sovrascrive il comportamento predefinito. La risposta sopra aggiunge un'esecuzione aggiuntiva. –

+0

Perdona la mia mancanza di comprensione delle esecuzioni. Ciò causerà la compilazione del codice principale dell'applicazione sulla stessa versione di destinazione del codice di prova se si eseguono test di tipo Maven? O le fonti principali e di test avranno versioni di bytecode target diverse? –

9

ho avuto fortuna con la risposta accettata la compilazione di Java 7 source e Java 8 fonti di test usando maven-compiler-plugin, versione 3.5.1. Poiché il plug-in di compilazione utilizzava il parametro source/target per entrambe le fonti, main e test.

Ma ho scoperto, ci sono parametri di configurazione separati per la fonte di prova e la destinazione.

Quindi per me la soluzione che ha funzionato è stato

<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> 
Problemi correlati