Укажите 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)
Другие вопросы по тегам