Jak mogę skonfigurować kompilator maven do używania java 5 dla mojego kodu testowego i java 1.4 dla mojego głównego kodu?Różne wersje kompilatora maven do testu i główne
Odpowiedz
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>
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>
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 ' 'wydaje się mieć pierwszeństwo, i nie działa. –
Rozwiązaniem jest ustawienie ' default-testCompile ', które zastępuje domyślne zachowanie. Powyższa odpowiedź dodaje dodatkową realizację. –
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? –