Складання Java 7 коду через Maven


155

Мої списки файлів пом

<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 хтось із жорстким кодом! СПАСИБІ
James Raitsev

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
OSX 1.9.2 mavericks, з 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>

EDIT : Оскільки ця відповідь все ще привертає увагу, я просто хотів би зазначити, що останні значення (станом на останню редакцію) - 3,2 для плагіна компілятора Maven і 1,8 для Java, оскільки питання щодо компіляції коду java 8 через maven пов'язані з’являться незабаром :-)


Додавання "<version> 3.0 </version>" вирішило проблему.
Шрірам

@radai, його 3.2 зараз, але нерозумно продовжувати оновлюватись, оскільки це ніколи не перестане збільшуватися ...
Лукас

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

Чому ця відповідь має майже сотню результатів, коли це не є правильним рішенням поставленого питання? Я загублений ...
Zero3

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

EDIT: Зараз я використовую: jEnv + sdkman


3
Це працювало для мене. Я використовую mac, з maven з macports та сонце jdk. Мабуть, це комбо було хитро.
Quantum7

1
Чудова робота. Дякую за всі команди! Зараз працює над Maveriks
Максим

1
Це найпростіше і найелегантніше рішення. Дякую!
BK-

26

Будь ласка, перевірте, чи не розміщено теги нижче

<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 env внутрішньо, шукаючи 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-альтернативи (наприклад)

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

як детально описано на https://wiki.debian.org/JavaPackage , тому що це змінить всі альтернативи різним інструментам Java (є десяток або близько того).


Дякую, саме те, що я шукав
evandongen

Дякую, мене заплутали після встановлення версії java з: update-alternative --config javac
Leonard Saers

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 Застосувати Ок

Перезавантажте IDE.

Підтвердіть налаштування компілятора для проекту- Перейдіть: Властивості проекту-> Компілятор Java-> Зніміть прапорець (Використовуйте відповідність із середовища виконання «JavaSE-1.6» на шляху збірки Java.) Та виберіть 1,7 зі спадного меню. (Ігноруйте, якщо вже 1,7)

Перезавантажте IDE.

Якщо проблема все ще не виникає - запускайте окремі тестові випадки, використовуючи команду в терміналі

mvn -Dtest=<test class name> test

2

Не впевнений, яка ОС використовується тут, але ви можете усунути багато Java-версії, яка не використовується debian / ubuntu, використовуючи update-java-альтернативи, щоб встановити стандартну систему 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

клацніть правою кнопкою миші на ур-проект у затемненні та відкрийте "Запустити конфігурації". Перевірте версію jre там. іноді це не зміниться за замовчуванням у затемненні, навіть змінивши версію на конвеєрі.


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 / javacyou також можна спробувати ...

<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
Ви не повинні твердо кодувати шлях до будь-якого коду, який коли-небудь буде спільним.
Ян Сегре

@Jan Segre, ок, я міняю його :)
baybora.oren

0

Гаразд, я теж вирішив це питання самостійно. Важливо, що ваш JAVA_HOME, якщо у вас немає нижчої версії або немає версії порівняно з вихідними / цільовими властивостями з додатка Maven, ви отримаєте цю помилку.

Не забудьте мати хорошу версію у своєму JAVA_HOME та включити її у свій ПАТ.


0

Можливо, ви вказуєте неправильну версію Java. java -version (у своєму терміналі), щоб перевірити версію 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

Жодна з попередніх відповідей повністю не вирішила мого випадку використання.

Потрібно видалити каталог, який будувався. Чисто. А потім знову встановіть. Виглядає як беззвучна проблема дозволів.


0

У мене була ця проблема в IntelliJ IDEA 14, поки я не зайшов у меню Файл -> Структура проекту, змінивши SDK проекту на 1,7 та рівень мови проекту на 7.


0

У мене була ця проблема під час роботи з затемненням, мені довелося змінити шлях складання проекту так, щоб він посилався на jre 7

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