Вкажіть JDK для Maven для використання


141

Я намагаюся створити плагін Хадсон, який я змінив, і він вимагає jdk1.6. Це добре, але я не бачу, як я можу сказати Maven, де різний jdk. В Інтернеті я знайшов кілька згадок, але вони, схоже, не стосуються мене. Деякі пропонують додати деяку конфігурацію, .m2/settings.xmlале у мене немає settings.xml. Крім того, я не хочу використовувати 1.6 для всіх складових Maven.

Одним звідним є використання я mvnв Cygwin, якщо це взагалі має значення. Здається, я мав би змогу внести специфікацію у файл проекту pom, але існуючий пом досить голий.

Отже, суть полягає в тому, чи є спосіб вказати jdk для одного виклику maven?

Відповіді:


142

Отже, суть полягає в тому, чи є спосіб вказати jdk для одного виклику maven?

Тимчасово змінити значення JAVA_HOMEзмінної середовища.


10
Приклад у windows:set JAVA_HOME="C:\Java\jdk7"
acdcjunior

6
in 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'(працює для мене)
Крістоф Руссі

2
якщо я змінити JAVA_HOME, а потім зробити java -version, він все ще надрукує попередню версію.
окламот

82

Здається, що 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>

18
Проголосували! Я виявив, що можу використовувати -Dmaven.compiler.fork=trueі -Dmaven.compiler.executable=/path/to/target/javacв командному рядку.
Джин Квон

навіть використовуючи ці Java-опти, ви все одно повинні додати це до плагіну компілятора <executable> $ {maven.compiler.executable} </executable>
Пол Грегуар

2
@JinKwon Передавання параметрів з -D працює чудово, навіть не визначаючи його в розділі плагіну компілятора. Це приємно для випадкового використання або для написання сценаріїв. Ви повинні окремо відповісти, щоб ми могли проголосувати за нього!
Гаетан Леманн

Це рішення не вдалося, коли я намагався запустити тести на Java 8, я отримував * Непідтримуваний major.minor версія 52.0 *
edwin

39

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змінну. Наприклад (у баш-корпусі):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
Енріке С. Філіаж

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.


6
Це лише вихідна точка, але не рішення. Це вимога для плагіну компілятора Maven для компіляції для 1.7. І тоді хитрість полягає в тому, щоб зробити Maven справді здатним скласти для 1.7, що не так банально, якщо ваша поточна версія java відрізняється ...
Сергій Ушаков


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 - Використання .


1
Це було ідеально для уточнення точної версії JDK. Наприклад, у мене є проект, який не працює при використанні початкового JDK 1.8, але якщо використовується JDK 1.8.0_77, він працює чудово. У мене були встановлені обидва JDK, і з цим рішенням maven сказав мені, що я використовую неправильну версію 1.8, поки я не змінив свій шлях JAVA_HOME, щоб орієнтуватися на конкретну папку 1.8.0_77. Інші відповіді не дозволили вам бути настільки детальним у версії.
боїнго

13

Я знаю, що це стара нитка. Але у мене виникли проблеми з чимось подібним до цього у джерелі компілятора Maven for 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, Update project)
Романо

Встановлення властивостей maven.compiler не заважає коду використовувати методи, додані в java 11. Для примірників String.repeat (). Це під час будівництва з jdk 11. Отже, Maven будує, але я б хотів, що це не вдасться
Енріко Джурін

6

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


Дякую приятелю, витративши 10 годин, ми зафіксували за допомогою вашої відповіді.
Mukul_3062

3

Хадсон також дозволяє вам визначити кілька режимів виконання Java, і дозволити вам попросити Maven з одним із них. Детальніше ознайомтеся на сторінці конфігурації.


OP будує плагін Hudson в командному рядку, а не під Гудзоном (принаймні, це моє розуміння).
Паскаль Thivent

3

Якщо ви встановили Java через brewв Macтой швидше за все , ви знайдете Java Домашній каталог тут:

/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

Наступним кроком було б знайти, на який Java Homeкаталог вказується Maven. Щоб знайти його, введіть команду:
mvn -version

введіть тут опис зображення

Поля, які нас тут цікавлять, це: Java versionі runtime.

На даний момент Мейвен вказує 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.


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 - jEnv

Після установки ви можете просто змінити версію Java на "локально", тобто для конкретного каталогу проекту:

jenv local 1.6

Це також змусить mvn використовувати цю версію локально, коли ви ввімкнете плагін mvn:

jenv enable-plugin maven

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.