Ответ 1
Итак, в нижней строке есть, есть ли способ указать jdk для одного вызова maven?
Временно измените свой JAVA_HOME
.
Я пытаюсь создать плагин Hudson, который я изменил, и для него требуется jdk1.6. Это хорошо, но я не вижу, как я могу сказать maven, где находится другой jdk. Я нашел несколько упоминаний в Интернете, но они, похоже, не обращаются ко мне. Некоторые предлагают добавить некоторую конфигурацию в .m2/settings.xml
, но у меня нет settings.xml
. Кроме того, я не хочу использовать 1.6 для всех сборщиков maven.
Один изгиб - я использую mvn
в cygwin, если это имеет значение вообще. Похоже, что я смогу сделать спецификацию в файле проекта pom, но существующий pom довольно голый.
Итак, в нижней строке есть, есть ли способ указать jdk для одного вызова maven?
Итак, в нижней строке есть, есть ли способ указать jdk для одного вызова maven?
Временно измените свой JAVA_HOME
.
Кажется, что maven теперь дает решение здесь: Компиляция источников с использованием другого JDK
Скажем, ваш JAVA_HOME
указывает на JDK7 (который будет запускать maven-процессы)
Ваш pom.xml
может быть:
<build>
<plugins>
<!-- we want JDK 1.6 source and binary compatiblility -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<!-- ... -->
<!-- we want sources to be processed by a specific 1.6 javac -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<verbose>true</verbose>
<fork>true</fork>
<executable>${JAVA_1_6_HOME}/bin/javac</executable>
<compilerVersion>1.3</compilerVersion>
</configuration>
</plugin>
</plugins>
</build>
Если ваши разработчики просто добавляют (и настраивают) следующие строки в своем settings.xml
, ваш pom будет независимым от платформы:
<settings>
[...]
<profiles>
[...]
<profile>
<id>compiler</id>
<properties>
<JAVA_1_4_HOME>C:\Program Files\Java\j2sdk1.4.2_09</JAVA_1_4_HOME>
<JAVA_1_6_HOME>C:\Program Files\Java\j2sdk1.6.0_18</JAVA_1_6_HOME>
</properties>
</profile>
</profiles>
[...]
<activeProfiles>
<activeProfile>compiler</activeProfile>
</activeProfiles>
</settings>
compile: compile имеет пользовательское свойство, которое позволяет вам указать путь к javac
.
Обратите внимание, что это свойство пользователя работает только в том случае, если fork
установлено в true
, что по умолчанию - false
.
$ mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable=/path/to/the/javac compile
Возможно, вам придется заключить в кавычки значение, если оно содержит пробелы.
> mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable="C:\...\javac" compile
См. также Приоритет пользовательских свойств Maven.
Как вы сказали "Плюс, я не хочу использовать 1.6 для всех сборок maven.".... Поэтому лучше я скажу изменить ваш pom файл и указать, какую версию jdk использовать.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.9</source>
<target>1.9</target>
</configuration>
</plugin>
</plugins>
</build>
Это гарантирует, что ваш конкретный проект использует эту версию JDK.
Я говорю, что вы настраиваете JAVA_HOME, как Паскаль говорит: В cygwin, если вы используете bash, поскольку ваша оболочка должна быть "экспортировать JAVA_HOME =/cygdrive/c/pathtothejdk", И никогда не вредит также экспорт java bin dir в PATH с помощью "export PATH = ${JAVA_HOME}/bin: ${PATH}"
а также добавить maven-enforce-plugin, чтобы убедиться, что используется правый jdk. Это хорошая практика для вашего pom.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<executions>
<execution>
<id>enforce-versions</id>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<requireJavaVersion>
<version>1.6</version>
</requireJavaVersion>
</rules>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
http://maven.apache.org/plugins/maven-enforcer-plugin/usage.html
Я знаю его старую нить. Но у меня были некоторые проблемы с чем-то похожим на это в Maven для Java 8 компилятора. Я понял это с помощью быстрого исправления, упомянутого в в этой статье, подумал, что могу его здесь поместить и, возможно, может помочь другим:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
Maven использует переменную $JAVACMD в качестве последней команды java, устанавливая ее там, где исполняемый файл java переключит maven на другой JDK.
Hudson также позволяет определить несколько сеансов Java и позволить вам вызвать Maven с одним из них. Познакомьтесь более подробно на странице конфигурации.
Для Java 9:
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>9</source>
<target>9</target>
</configuration>
</plugin>
</plugins>
</build>
У меня возникла проблема с maven в Eclipse в Windows 7.
Хотя я заметил, что mvn build отлично работает из командной строки.
mvn -T 5 -B -e -X -U -P test clean install -Dmaven.surefire.debug --settings ..\..\infra-scripts\maven-conf\settings.xml > output.log
Eclipse рассматривал как JVM по умолчанию JRE-установку вместо JDK, поэтому она не срабатывала при компиляции.
Я добавил в eclipse.ini следующую строку:
-vm
C:\Program Files (x86)\Java\jdk1.8.0_25\bin
Также, начиная с eclipse, я использовал следующий раздел: "Цели":
-T 5 -B -e -X -U -P test clean install -Dmaven.surefire.debug --settings ..\..\infra-scripts\maven-conf\settings.xml
Ошибка компиляции решена.