Ответ 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.