Подтвердить что ты не робот

Компилировать модуль 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>

EDIT Кроме того, выводится ниже

maven --version

указывают, что maven компилирует мой java-код с 1.7?

[email protected]:~/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"

Спасибо, Кевин

4b9b3361

Ответ 1

Существует множество хаков для компиляции исходного кода с другой версией 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 Plugin. Animal Sniffer можно использовать, чтобы убедиться, что вы используете только методы JRE, на которые настроены таргетинг., Общий консенсус сообщества заключается в том, что использование параметров конфигурации source и target в конфигурации плагина Maven Compiler в сочетании с использованием Mojo Animal Sniffer практически устраняет необходимость в инструментальных цепочках в конце компилятора вещей.... на Surefire конец вещей, по-прежнему необходимо для инструментальных цепей... и у меня есть несколько краевых случаев, которые мне нужно обновить плагин компилятора и плагины программных модулей для обработки, но, реально, вы не будете ударять по этим краевым случаям;-)

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

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

Ответ 2

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

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

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

    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%
    
  • Родитель pom.xml определяет:

    <properties>
       <jdk.version>6</jdk.version>
       <jdk>${env.JAVA_HOME_6}</jdk>
    </properties>
    
  • Основной файл 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>
    
  • Модуль, требующий JDK 1.7, должен переопределить следующее свойство:

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

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

Ответ 3

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

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