2009-07-31 23 views

Odpowiedz

24

Jeśli chcesz ustawić zgodność z odpowiednią wersją Java, możesz skonfigurować wtyczkę kompilatora dla każdego wykonania. Zakładając, że Maven używa JDK przynajmniej tak aktualnego, jak podana jest najwyższa wersja. Za pomocą właściwości można zastąpić tę konfigurację w linii poleceń lub w razie potrzeby dziecka:

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

Jeśli masz na myśli używając różnych kompilatory, to nieco bardziej zaangażowani. ponieważ musisz podać ścieżkę do JDK i jakiej wersji kompilatora używasz. Ponownie można je zdefiniować we właściwościach. Choć może chcesz zdefiniować je w 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> 

Note to może mieć sens, aby zdefiniować konfiguracje kompilatora w profilach, po jednym dla każdego JDK Cię wspierać, tak, że normalny buduje nie opierać się na własnościach jest ustawiony.

Również w Maven 3.x, trzeba to parametr określający fork gdy plik wykonywalny, np

<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

Gdy próbuję pierwszy przykład ze źródłowym i docelowym wersji '1.8' do testów i' 1.7' dla kodu głównego, kompilacja powiedzie gdy jest 'mvn compile' jest uruchamiany oddzielnie od 'mvn test-compile', ale w poleceniach takich jak' mvn compile test-compile' lub, po prostu, 'mvn test-compile' (gdzie' compile' jest wciągnięty), główna konfiguracja z ' 1.7 'wydaje się mieć pierwszeństwo, i nie działa. –

+2

Rozwiązaniem jest ustawienie ' default-testCompile', które zastępuje domyślne zachowanie. Powyższa odpowiedź dodaje dodatkową realizację. –

+0

Przebaczam brak zrozumienia w sprawie egzekucji. Czy spowoduje to, że główny kod aplikacji zostanie skompilowany do tej samej wersji docelowej co kod testowy w przypadku wykonywania testów maven? Czy główne i testowe źródła będą miały różne docelowe wersje kodu bajtowego? –

9

nie miałem szczęścia z przyjętymi odpowiedź kompilacji Java 7 źródło i Java 8 źródła testowe używające maven-compiler-plugin, wersja 3.5.1. Ponieważ wtyczka kompilacji użyła parametru źródło/miejsce docelowe dla źródeł głównych i testowych.

Ale dowiedziałem się, że istnieją oddzielne parametry konfiguracyjne dla źródła testu i celu.

Więc dla mnie rozwiązanie, które pracował był

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