Укажите JDK для использования Maven

148

Я пытаюсь создать модифицированный мной плагин Hudson, и для него требуется jdk1.6. Это нормально, но я не понимаю, как я могу сказать maven, где находится другой jdk. Я нашел несколько упоминаний в Интернете, но, похоже, они не относятся ко мне. Некоторые предлагают добавить конфигурацию, .m2/settings.xmlно у меня нет файла settings.xml. Кроме того, я не хочу использовать 1.6 для всех сборок maven.

Один изгиб - я использую mvnв cygwin, если это вообще имеет значение. Похоже, я смогу сделать спецификацию в файле pom проекта, но существующий pom довольно прост.

Итак, суть в том, есть ли способ указать jdk для одного вызова maven?

DanInDC
источник

Ответы:

148

Итак, суть в том, есть ли способ указать jdk для одного вызова maven?

Временно измените значение JAVA_HOMEпеременной среды.

Паскаль Тивент
источник
10
Пример в windows:set JAVA_HOME="C:\Java\jdk7"
acdcjunior 03
6
в lubuntu: JAVA_HOME = "/ home / desa / programas / jdks / jdk1.6.0_45 /" mvn -v
Энрике Сан-Мартин
8
И на случай, если кто-то забудет и потратит много времени на размышления, почему они не могут его изменить: JAVA_HOMEможно установить для Maven (по крайней мере, на Mac) в этом файле: /private/etc/mavenrc - И это может использовать что-то вроде (обратите внимание на обратные кавычки, а не одинарные кавычки!):export JAVA_HOME=`/usr/libexec/java_home -v 1.7.0_75`
RedYeti
3
Unix: export JAVA_HOME='D:/dev/java/jdk8/jre'(у меня работает)
Christophe Roussy
3
если я изменю JAVA_HOME, а затем сделаю это java -version, он все равно распечатает предыдущую версию.
ocramot
84

Кажется, что 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>
Cerber
источник
19
Проголосовал! Я обнаружил, что могу использовать -Dmaven.compiler.fork=trueи -Dmaven.compiler.executable=/path/to/target/javacв командной строке.
Джин Квон
даже используя эти java-опции, вы все равно должны добавить это в плагин компилятора <executable> $ {maven.compiler.executable} </executable>
Пол Грегуар
2
@JinKwon Параметры передачи с -D работают нормально, даже если они не определены в разделе плагинов компилятора. Это удобно для случайного использования или для написания сценариев. Вы должны поместить его в отдельный ответ, чтобы мы могли проголосовать за него!
Гаэтан Леманн
Это решение не удалось, когда я попытался запустить тесты на Java 8. Я получал * Unsupported major.minor version 52.0 *
edwin
41

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 .

Джин Квон
источник
Мне также нужно было перезаписать мою JAVA_HOMEпеременную. Например (в оболочке bash):JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/ mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable=/usr/lib/jvm/java-8-openjdk-amd64/bin/javac spring-boot:run
Enrique S. Filiage
24

Как вы сказали: «Кроме того, я не хочу использовать 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.

DevCoder
источник
6
Это только отправная точка, но не решение. Это требование для плагина компилятора maven для компиляции для версии 1.7. И тогда фокус в том, чтобы сделать maven действительно способным компилировать для 1.7, что не так тривиально, если ваша текущая версия java отличается ...
Сергей Ушаков
Это другой вопрос stackoverflow.com/questions/16723533/…
Пол Верест
14

Я говорю, что вы настраиваете JAVA_HOMEпеременную среды, как говорит Паскаль: в Cygwin, если вы используете bash в качестве оболочки, должна быть:

export JAVA_HOME=/cygdrive/c/pathtothejdk

Никогда не помешает также добавитьbin путь к каталогу java к PATHпеременной среды с помощью:

export PATH=${JAVA_HOME}/bin:${PATH}

Также добавьте, maven-enforce-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>

См. Плагин Maven Enforcer - Использование .

Feniix
источник
1
Это идеально подходило для указания точной версии JDK. Например, у меня есть проект, который не работает при использовании начального JDK 1.8, но при использовании JDK 1.8.0_77 он работает нормально. У меня были установлены оба JDK, и с этим решением maven сказал мне, что я использую неправильную версию 1.8, пока я не изменил свой путь JAVA_HOME на конкретную папку 1.8.0_77. Другие ответы не позволили вам быть настолько детальным в версии.
Bojingo
13

Я знаю, что это старая ветка. Но у меня были некоторые проблемы с чем-то похожим на это в исходном коде компилятора 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>
Парт Джоши
источник
1
После добавления этих строк может потребоваться обновление Maven (Eclipse: щелкните правой кнопкой мыши проект, Maven, проект обновления)
Романо,
Установка свойств maven.compiler не запрещает коду использовать методы, добавленные в java 11. Например, String.repeat (). Это при сборке с jdk 11. Итак, maven строит, но я бы хотел, чтобы он потерпел неудачу
Энрико Джурин
6

Maven использует переменную $ JAVACMD в качестве последней команды java, установите ее там, где исполняемый файл java переключит maven на другой JDK.

Линь Гао
источник
4

Если вы установили 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.

Рито
источник
3

Hudson также позволяет вам определять несколько сред выполнения Java и вызывать Maven с одной из них. Присмотритесь к странице конфигурации.

Торбьёрн Равн Андерсен
источник
OP создает плагин Hudson в командной строке, а не в Hudson (по крайней мере, я так понимаю).
Паскаль Тивент,
1

Еще одна альтернатива для управления несколькими версиями jdk - jEnv

После установки вы можете просто изменить версию java «локально», то есть для конкретного каталога проекта:

jenv local 1.6

Это также заставит mvn использовать эту версию локально, когда вы включите плагин mvn:

jenv enable-plugin maven
Ахмад Абдельгани
источник
Спасибо за рекомендацию jenv maven.
RSharma
0

У меня возникла проблема со сборкой maven в Eclipse в Windows 7.

Хотя я заметил, что сборка mvn отлично работает из командной строки.

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

Ошибка компиляции решена.

Апродан
источник
0

Для 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>
Джобанприт Сингх
источник
0

Вы также можете установить 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

Spindizzy
источник