Скомпилируйте модуль Maven с другой версией Java

Мой проект Maven имеет несколько модулей: сервер, веб и т. Д.

Я хотел бы собрать все, кроме моего серверного модуля, на Java 6. Для серверного модуля я бы хотел скомпилировать его с Java 7.

Вот мой pom.xml ниже, но я думаю, что если я изменю его до 1.7, то все мои модули будут скомпилированы с Java 7. Кроме того, maven использует переменную среды JAVA_HOME, чтобы определить, какую версию Java использовать?

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
                        <version>2.3.2</version>
        <configuration>
            <source>1.6</source>
            <target>1.6</target>
            <memmax>2048m</memmax>
        </configuration>
    </plugin>

РЕДАКТИРОВАТЬ Кроме того, делает ниже вывод

Maven - версия

указать, что maven компилирует мой код Java с 1.7?

vagrant@dev:~/bin/apache-tomcat-7.0.29/bin$ mvn --version
Apache Maven 3.0.4 (r1232337; 2012-01-17 08:44:56+0000)
Maven home: /home/vagrant/bin/apache-maven-3.0.4
Java version: 1.7.0_07, vendor: Oracle Corporation
Java home: /home/vagrant/bin/jdk1.7.0_07/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.2.0-23-generic", arch: "amd64", family: "unix"

Спасибо кевин

3 ответа

Решение

Существует множество хаков для компиляции исходного кода с другой версией JDK, чем вы используете для запуска Maven, например, вы можете использовать что-то вроде

<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.5.1</version>
        <configuration>
          <executable><!-- path-to-javac --></executable>
        </configuration>
      </plugin>
    </plugins>
    [...]
  </build>
  [...] 
</project>

Проблема с этим подходом заключается в том, что вы теперь жестко запрограммировали путь к JDK в свой POM. Все будет отлично работать на вашей машине, но когда вам придется перестраивать вашу машину из-за сбоя жесткого диска или когда вы хотите собрать другую машину, вы застрянете, поскольку путь, скорее всего, не будет совпадать.

Правильный лучший способ справиться с этим - через Toolchains. Это увидит, что вы создаете ~/.m2/toolchains.xml файл, который описывает, где находятся различные цепочки инструментов в вашей системе. Затем версия JDK может быть применена плагином Maven Toolchains, например

<plugins>
 ...
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-toolchains-plugin</artifactId>
    <version>1.0</version>
    <executions> 
      <execution>
        <phase>validate</phase>
        <goals>
          <goal>toolchain</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <toolchains>
        <jdk>
          <version>1.6</version>
        </jdk>
      </toolchains>
    </configuration>
  </plugin>
  ...
</plugins>

Следующее, что вам это не нужно так часто, как вы думаете. Например, используя source а также target значения, которые вы можете сгенерировать правильный байт-код для JRE, на который вы нацеливаетесь... единственная проблема, на которую вы затем попадете, - это использование методов, которые являются новыми в JRE 1.7... вот где появляется плагин Mojo Animal Sniffer. Animal Sniffer может быть использован, чтобы убедиться, что вы используете только те методы JRE, на которые вы нацелены. Общее мнение сообщества заключается в том, что использование source а также target Варианты конфигурации в конфигурации Maven Compiler Plugin в сочетании с использованием Mojo's Animal Sniffer практически исключают необходимость в наборах инструментов на стороне компилятора... на стороне Surefire все еще есть потребность в наборах инструментов... и у меня есть несколько крайних случаев, для которых мне нужно обновить плагин компилятора и плагины наборов инструментов, для обработки которых вы реально не добьетесь этих крайних случаев;-)

Просто чтобы быть уверенным, что на ваш первоначальный вопрос дан полный ответ (поскольку вышеизложенный отвечает на вопрос, который вы хотели задать - в отличие от того, который вы задавали)

В настоящее время вы компилируете с JDK 1.7, однако, в зависимости от версии используемого плагина компилятора Maven, вы можете компилировать либо <source>1.4</source><target>1.4</target> или же <source>1.5</source><target>1.5</target> если вы не изменили конфигурацию подключаемого модуля Maven в своем pom.xml, Это будет определять, какие языковые функции доступны вам, но не какие классы... так что вы будете генерировать код, который будет работать на JRE 1.7, и при условии, что вы не использовали какие-либо новые классы / методы, представленные с 1.4 / 1.5 (такие как String.isEmpty()) также должен работать на JRE 1.4/1.5... единственный способ убедиться, что он работает на такой старой JVM - это либо запустить его на старой JVM, либо использовать Animal Sniffer.

FlexyPool собран с JDK 1.6, в то время как один модуль должен быть скомпилирован с 1.7 (из-за зависимости DBCP2).

Я написал статью на эту тему, так что в основном это то, как я это сделал:

  1. Вы начинаете определять переменные JDK env:

    JAVA_HOME_6     C:\Program Files\Java\jdk1.6.0_38
    JAVA_HOME_7     C:\Program Files\Java\jdk1.7.0_25
    JAVA_HOME       %JAVA_HOME_6%
    
  2. Родитель pom.xml определяет:

    <properties>
       <jdk.version>6</jdk.version>
       <jdk>${env.JAVA_HOME_6}</jdk>
    </properties>
    
  3. Основной файл pom.xml определяет следующий плагин сборки:

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${jdk.version}</source>
                    <target>${jdk.version}</target>
                    <showDeprecation>true</showDeprecation>
                    <showWarnings>true</showWarnings>
                    <executable>${jdk}/bin/javac</executable>
                    <fork>true</fork>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <jvm>${jdk}/bin/java</jvm>
                    <forkMode>once</forkMode>
                </configuration>
            </plugin>
        </plugins>
    </build>
    
  4. Модуль, требующий JDK 1.7, должен переопределить следующее свойство:

    <properties>
        <jdk.version>7</jdk.version>
        <jdk>${env.JAVA_HOME_7}</jdk>
    </properties>
    

И это все, теперь мы можем создавать каждый модуль, используя свое собственное требование минимальной версии Java.

Используйте настройку для JDK6 на вашей верхней панели, она будет унаследована всеми модулями, и перезапишите ее для вашей части сервера с другой требуемой конфигурацией.

Что касается пути JDK, вы можете указать его, см. Здесь: http://maven.apache.org/plugins/maven-compiler-plugin/examples/compile-using-different-jdk.html

Другие вопросы по тегам