Компиляция кода Java 7 через Maven


155

Мои списки файлов pom

<project>
  <build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.0</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.12.4</version>
            </plugin>
        </plugins>
    </pluginManagement>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
    </plugins>
  ...

Тем не менее mvn clean install, я получаю

[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] Failure executing javac, but could not parse the error:
javac: invalid target release: 1.7
Usage: javac <options> <source files>

/usr/bin/java -versionесть ( which javaуказывает здесь)

java version "1.7.0_10"
Java(TM) SE Runtime Environment (build 1.7.0_10-b18)
Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)

javac также указывает на правильную версию Java

/usr/bin/javac -> /Library/Java/JavaVirtualMachines/jdk1.7.0_10.jdk/Contents/Home/bin/javac

На этой машине я пользуюсь zsh( echo $0возвращается -zsh)

По моему .zshrc, я определил:

 33 # HOME
 34 JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_10.jdk/Contents/Home
 35 SCALA_HOME=/Library/Scala/current
 36 FORGE_HOME=~/tools/forge/
 37 
 38 # PATH
 39 PATH="/Library/Frameworks/Python.framework/Versions/3.2/bin:${PATH}"
 40 PATH=${PATH}:${JAVA_HOME}/bin
 41 PATH=${PATH}:/bin/
 42 PATH=${PATH}:/sbin/
 43 PATH=${PATH}:/usr/bin/
 44 PATH=${PATH}:/usr/sbin/
 45 PATH=${PATH}:/opt/local/bin/
 46 PATH=${PATH}:/opt/local/sbin/
 47 PATH=${PATH}:/usr/local/git/bin
 48 PATH=${PATH}:/usr/local/git/sbin
 49 PATH=${PATH}:/Applications/Xcode.app/Contents/Developer/usr/bin
 50 PATH=${PATH}:${SCALA_HOME}/bin
 51 PATH=${PATH}:${FORGE_HOME}/bin
 52 
 53 export PATH

Когда я бегу, mvn clean install --debugя вижу, что на самом деле я использую Java 6

  1 Apache Maven 3.0.3 (r1075438; 2011-02-28 11:31:09-0600)
  2 Maven home: /usr/share/maven
  3 Java version: 1.6.0_35, vendor: Apple Inc.
  4 Java home: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

Где это можно определить? У меня есть источник (d) мой .zshrc несколько раз.


2
Ваш PATH не имеет /usr/binпервого в списке каталогов. Попробуйте javac -versionбез указания каталога.
Питер Лори

@PeterLawrey, я получаюjavac 1.7.0_10
Джеймс Райцев

2
Что echo $JAVA_HOMEтебе сказать?
Андрей Логвинов

2
Как насчет вашей переменной JAVA_HOME? mvn будет использовать JAVA_HOME. Кроме того, вы строите из командной строки или внутри IDE?
Лукас

8
Если вы запускаете Maven с --debug, он должен сообщить вам точную командную строку, которую он использует для запуска javac(наряду с множеством других вещей). О чем это говорит?
Эмиль Сит

Ответы:


153

Проверьте mvnскрипт в вашей установке maven, чтобы увидеть, как он собирает команду. Возможно, вы или кто-то другой жестко запрограммировали JAVA_HOMEтам и забыли об этом.


8
Вы, сэр, победитель. Действительно, кто-то жестко закодировал JAVA_HOME внутри скрипта! СПАСИБО
Джеймс Райцев

21
Хех, не то, чтобы я когда-либо делал это с собой раньше или что-нибудь еще ... :)
Райан Стюарт

4
mvnСценарий не был совместим с моей установкой OSX от компании Oracle JDK 7, и я не делал настройки его (внешний скрипт для папки что - нибудь фантазии , Library/Java/JavaVirtualMachines/CurrentJDKкоторой не существовало для меня (то , что действительно существует это jdk1.7.0_25.jdkвместо CurrentJDK). Не элегантное исправление, но я только что жестко запрограммировал экспорт, и теперь он работает (PS: maven на OSX находится в /usr/share/maven/bin/mvn)
Raekye

6
Mavericks OSX 1.9.2, с maven, установленным через homebrew, сценарий mvn был расположен по адресу/usr/local/bin/mvn
StackExchange What The Heck

1
У меня был набор JAVA_HOME, и это дало ключ к разгадке. СПАСИБО!! : D
Альфонсо Нишикава

109

попробуйте использовать более новую версию плагина компилятора maven:

    <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.2</version>
        <configuration>
            <source>1.7</source>
            <target>1.7</target>
        </configuration>
    </plugin>

Кроме того, указание кодировки исходного файла в maven лучше делать глобально:

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

РЕДАКТИРОВАТЬ : так как этот ответ все еще привлекает внимание, я просто хотел бы отметить, что последние значения (на момент последнего редактирования) - 3,2 для плагина компилятора maven и 1,8 для java, поскольку вопросы о компиляции кода java 8 через maven связаны с скоро появится :-)


Добавление «<версия> 3.0 </ версия>» решило проблему.
Шрирам

@radai, его 3.2 сейчас, но глупо продолжать обновлять, поскольку он никогда не перестанет расти ...
Лукас

@ Лукас - просто не хочу отвечать за людей, придерживающихся устаревших версий, вот и все. не мог жить с собой :-)
Радай

Почему у этого ответа почти сто голосов, когда он не является правильным решением поставленного вопроса? Я потерян ...
Ноль3

48

У меня была та же проблема, и для ее решения я следую за этой статьей в блоге: http://www.mkyong.com/java/how-to-set-java_home-environment-variable-on-mac-os-x/

$ vim .bash_profile 

export JAVA_HOME=$(/usr/libexec/java_home)

$ source .bash_profile

$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home

специальные ткс @mkyong

РЕДАКТИРОВАТЬ: Теперь я использую: jEnv + sdkman


3
Это сработало для меня. Я использую Mac, с Maven из Macports и Sun JDK. Видимо, это комбо было сложно.
Quantum7

1
Отличная работа. Спасибо за все команды! Сейчас работает на Маверикс
Максим

1
Это самое простое и элегантное решение. Спасибо!
BK-

26

Пожалуйста, проверьте ваш pom.xml для тегов ниже

<properties>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
</properties>

он должен указать требуемую версию JDK


19

Вы должны проверить версию Maven:

mvn -version

Вы найдете версию Java, которую Maven использует для компиляции. Вам может понадобиться сбросить JAVA_HOME, если это необходимо.


19

У меня такая же проблема. Я обнаружил, что это потому, что скрипт Maven просматривает ссылку CurrentJDK ниже и находит 1.6 JDK. Даже если вы установите последнюю версию JDK, это не решается. Хотя вы можете просто установить JAVA_HOME в вашем скрипте $ HOME / .bash_profile, я решил вместо этого исправить символическую ссылку следующим образом:

ls -l /System/Library/Frameworks/JavaVM.framework/Versions/
total 64
lrwxr-xr-x  1 root  wheel   10 30 Oct 16:18 1.4 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 30 Oct 16:18 1.4.2 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 30 Oct 16:18 1.5 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 30 Oct 16:18 1.5.0 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 30 Oct 16:18 1.6 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 30 Oct 16:18 1.6.0 -> CurrentJDK
drwxr-xr-x  9 root  wheel  306 11 Nov 21:20 A
lrwxr-xr-x  1 root  wheel    1 30 Oct 16:18 Current -> A
lrwxr-xr-x  1 root  wheel   59 30 Oct 16:18 CurrentJDK -> /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents

Обратите внимание, что CurrentJDK указывает на 1.6.0.jdk

Чтобы исправить это, я выполнил следующие команды (вы должны проверить установленную версию и соответственно адаптироваться).

sudo rm /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK
sudo ln -s /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/ /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK

Если mvn clean install -debug показывает Java 1.6, это правильный ответ
cetnar

4

Диагностика:

Вы можете увидеть, какую версию Java Maven использует, запустив "mvn --version"

Решение для Debian:

Сценарий mvn устанавливает внутреннюю переменную JAVA_HOME путем поиска javac (то есть javac). Поэтому, если у вас одновременно установлено несколько версий java, например, JDK 6 и JDK 7, и вы используете систему альтернатив Debian для выбора между ними, даже если вы изменили альтернативу для «java» на JDK 7, mvn все равно будет использовать JDK 6. Вы Я должен изменить альтернативу для "Javac" тоже. Например:

# update-alternatives --set javac /usr/lib/jvm/java-7-openjdk-amd64/bin/javac

РЕДАКТИРОВАТЬ:

На самом деле, еще лучшим решением является использование update-java-alternatives (например)

# update-java-alternatives -s java-1.7.0-openjdk-amd64

как подробно описано в https://wiki.debian.org/JavaPackage , потому что это изменит все альтернативы различным инструментам Java (их около десятка).


Спасибо, именно то, что я искал
evandongen

Спасибо, я был сбит с толку после установки java-версии с помощью: update-alternatives --config javac
Леонард Саерс

2

Не могли бы вы попробовать более новый плагин; на сайте maven:

<version>3.0</version>

Я тоже видел следующее:

<compilerVersion>1.7</compilerVersion>

Не работает. [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.0:compile (default-compile) on project divs: Fatal error compiling: invalid target release: 1.7 -
Джеймс Райцев

Я успешно использовал 2.3.2 для компиляции 1.7 раньше ... Но всегда хорошо, если возможно, использовать последнюю версию.
Лукас

Искал дальше. Проверьте ваше управление плагином зависимостей, если вы используете это.
Joop Eggen

Добавлен <pluginDependency>, та же проблема
Джеймс Райцев

Если это модульный проект, возможно, стоит изучить родительский проект. Это не может иметь место здесь. Maven работает с Java 1.7?
Joop Eggen

2

Попробуйте изменить настройки компилятора Java в свойствах Eclipse-

Перейти: Настройки-> Java-> Компилятор-> Уровень соответствия компилятора-> 1.7 Применить Ok

Перезапустите IDE.

Подтвердите настройку компилятора для проекта: Перейти к: Свойства проекта-> Компилятор Java-> Снять отметку (Использовать соответствие из среды выполнения 'JavaSE-1.6' в пути сборки Java). И выберите 1.7 в раскрывающемся списке. (Игнорировать, если уже 1.7)

Перезапустите IDE.

Если проблема не устранена, запустите отдельные тестовые примеры, используя команду в терминале.

mvn -Dtest=<test class name> test

2

Не уверен, какая ОС используется здесь, но вы можете исключить множество java-версий, futzing un debian / ubuntu с помощью update-java-alternatives, чтобы установить jvm по умолчанию для всей системы.

#> update-java-alternatives -l
java-1.6.0-openjdk-amd64 1061 /usr/lib/jvm/java-1.6.0-openjdk-amd64
java-1.7.0-openjdk-amd64 1071 /usr/lib/jvm/java-1.7.0-openjdk-amd64
java-6-sun 63 /usr/lib/jvm/java-6-sun
java-7-oracle 1073 /usr/lib/jvm/java-7-oracle

Чтобы установить новый, используйте:

#> update-java-alternatives -s java-7-oracle

Нет необходимости устанавливать JAVA_HOME для большинства приложений.


2

щелкните правой кнопкой мыши на вашем проекте в eclipse и откройте «Run Configurations» .. проверьте версию jre там. иногда это не изменится по умолчанию в eclipse, даже после изменения версии в buildpath.


2

Для конкретной компиляции, которая требует (не по умолчанию /etc/alternatives/java) JVM, рассмотрите префиксmvn командеJAVA_HOME следующим образом:

JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/ mvn package

Здесь мы предполагаем, что по умолчанию используется Java 8, тогда как для конкретного конкретного проекта нам требуется Java 7.


Это сработало лучше всего для меня, так как тогда не нужно вносить изменения в источник проекта6, загруженный из GIT (или SCM)
jwilleke

Этот ответ заслуживает большего количества голосов. Это помогло мне скомпилировать код, требующий Java 7, на моем компьютере, где по умолчанию была Java 8 - без необходимости устанавливать и переустанавливать Java7 и Java 8.
R11G

1

{JAVA_1_4_HOME} / bin / javacy, вы также можете попробовать ...

<plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
                <source>1.7</source>
                <target>1.7</target>
                <showDeprecation>true</showDeprecation>
                <showWarnings>true</showWarnings>
                <executable>{JAVA_HOME_1_7}/bin/javac</executable>
                <fork>true</fork>
        </configuration>
    </plugin>

4
Вы не должны жестко задавать путь к любому коду, который когда-либо будет передан.
Ян Сегре

@ Ян Сегре, хорошо, я изменяю это :)
baybora.oren

0

Хорошо, я тоже решил эту проблему самостоятельно. Ваш JAVA_HOME важнее, если у вас нет более низкой версии или ее нет по сравнению с исходными / целевыми свойствами из плагина Maven, вы получите эту ошибку.

Убедитесь, что в вашем JAVA_HOME есть хорошая версия и она включена в ваш PATH.


0

Возможно, вы указали неправильную версию Java. Java-версия (в вашем терминале), чтобы проверить версию Java, которую вы используете. Перейдите в maven-compile-plugin для последней версии компилятора maven. Ваш плагин может выглядеть так, если вы используете java 6, а последняя версия плагина компилятора maven - 3.1.

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>

0

Ни один из предыдущих ответов полностью не решил мой вариант использования.

Необходимо удалить каталог, который был построен. Clean. А затем переустановите. Похоже, молчаливая проблема с разрешениями.


0

У меня была эта проблема в IntelliJ IDEA 14, пока я не зашел в меню «Файл» -> «Структура проекта», изменив SDK проекта до 1.7 и уровень языка проекта до 7.


0

У меня была эта проблема при работе с Eclipse, мне пришлось изменить путь сборки проекта, чтобы он ссылался на JRE 7

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.