Укажите JDK для Maven для использования
Я пытаюсь создать плагин Hudson, который я модифицировал, и он требует jdk1.6. Это хорошо, но я не понимаю, как я могу сказать maven, где находится другой jdk. Я нашел несколько упоминаний в Интернете, но они, кажется, не относятся ко мне. Некоторые предлагают добавить некоторые настройки .m2/settings.xml
но у меня нет settings.xml
, Кроме того, я не хочу использовать 1.6 для всех maven сборок.
Один излом - я использую mvn
в cygwin, если это вообще имеет значение. Кажется, я должен быть в состоянии сделать спецификацию в файле проекта pom, но существующий pom довольно прост.
Итак, суть в том, есть ли способ указать JDK для одного вызова Maven?
16 ответов
Итак, суть в том, есть ли способ указать 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
, ваш пом будет независимым от платформы:
<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, ваша оболочка должна быть "export JAVA_HOME=/cygdrive/c/pathtothejdk". И никогда не повредит также экспортировать каталог java bin в PATH с помощью "export PATH". =${JAVA_HOME}/ бен:${PATH}"
а также добавьте maven-force-plugin, чтобы убедиться, что используется правильный jdk. Это хорошая практика для вашего пом.
<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
Если вы установили Java через brew
в Mac
тогда, скорее всего, вы найдете здесь свой домашний каталог Java:
/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home
Следующим шагом теперь будет поиск Java Home
каталог, на который указывает maven. Чтобы найти его, введите команду:
mvn -version
Здесь нас интересуют следующие поля:
Java version
а также runtime
.
Maven в настоящее время указывает на Java 13
. Кроме того, вы можете увидеть путь к домашней странице Java под ключевой средой выполнения, а именно:
/usr/local/Cellar/openjdk/13.0.2+8_2/libexec/openjdk.jdk/Contents/Home
Чтобы изменить Java-версию maven, нам нужно добавить Java 8
домашний путь к JAVA_HOME
переменная env.
Для этого нам нужно запустить команду:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home
в терминале.
Теперь, если мы проверим версию maven, мы увидим, что теперь она указывает на Java 8.
Проблема в том, что если вы снова проверите версию maven в новом терминале, вы обнаружите, что она указывает на Java 13. Чтобы избежать этого, я бы предложил добавить JAVA_HOME
переменная в ~/.profile
файл.
Таким образом, всякий раз, когда ваш терминал загружается, он по умолчанию принимает значение, которое вы определили в JAVA_HOME. Это строка, которую вам нужно добавить в~/.profile
файл:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home
Вы можете открыть новый терминал и проверить версию Maven, (mvn -version
), и на этот раз вы обнаружите, что он указывает на Java 8.
Я знаю, это старая нить. Но у меня были некоторые проблемы с чем-то похожим на это в исходном коде компилятора 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>
Вы также можете установить JDK для Maven в файле в своем домашнем каталоге. ~/.mavenrc
:
JAVA_HOME='/Library/Java/JavaVirtualMachines/jdk-11.0.5.jdk/Contents/Home'
Эта переменная среды будет проверяться сценарием mvn и использоваться при ее наличии:
if [ -f "$HOME/.mavenrc" ] ; then
. "$HOME/.mavenrc"
fi
https://github.com/CodeFX-org/mvn-java-9/tree/master/mavenrc
Maven использует переменную $JAVACMD в качестве заключительной команды java, установите ее в том месте, где исполняемый файл java переключит maven на другой JDK.
Hudson также позволяет вам определять несколько сред выполнения Java, и позволяет вам вызывать Maven с одним из них. Внимательно посмотрите на странице конфигурации.
Еще одна альтернатива для управления несколькими версиями jdk - jEnv
После установки вы можете просто изменить версию java "локально", то есть для конкретного каталога проекта:
jenv local 1.6
Это также заставит mvn использовать эту версию локально, когда вы включите плагин mvn:
jenv enable-plugin maven
Я обновляю свой ~/.m2/settings.xml
<settings>
<profiles>
<profile>
<id>j8</id>
<profile>
<id>j8</id>
<properties>
<maven.compiler.fork>true</maven.compiler.fork>
<maven.compiler.executable>${env.JAVA_HOME8}/bin/javac.exe</maven.compiler.executable>
</properties>
</profile>
<profile>
<id>j11</id>
<properties>
<maven.compiler.fork>true</maven.compiler.fork>
<maven.compiler.executable>${env.JAVA_HOME11}/bin/javac.exe</maven.compiler.executable>
</properties>
</profile>
</profiles>
<settings>
Для сборки с Java8 я запускаю mvn со свойствами:
mvn compile -Pj8
и для Явы 11
mvn compile -Pj11
Если ничего не работает и даже после того, как вы установили JAVA_HOME на правильный путь, проверьте, нет ли переопределения пути JAVA_HOME в
<user>/.mavenrc
!
В качестве дополнительной подсказки
mvn
файл представляет собой сценарий bash (в Linux) .. так что при необходимости вы можете проверить исходный код [и изменить его].
Для 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
Также, начиная с затмения, я использовал в разделе "Цели" следующий список:
-T 5 -B -e -X -U -P test clean install -Dmaven.surefire.debug --settings ..\..\infra-scripts\maven-conf\settings.xml
Ошибка компиляции была решена.
Использование этой команды ниже также сработало для меня, используя ее сразу после установки Java 8 отсюда https://www.oracle.com/java/technologies/javase-downloads.html
export JAVA_HOME=$(/usr/libexec/java_home)