Сбой сборки после обновления до версии Java7, Missing Tools.jar и плохих классов
Недавно я обновил Java7 на своем Macbook Pro. Я загрузил JDK (не JRE).
» javac version
javac 1.7.0_17
» echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.7.0_17.jdk/Contents/Home
Однако при попытке запустить сборку один из плагинов компилятора maven не работает, утверждая, что у меня установлен JRE:
» mvn install
[ERROR] execute error
org.apache.maven.plugin.MojoExecutionException: You need to run build with JDK
or have tools.jar on the classpath.
If this occures during eclipse build make sure you run eclipse under JDK as well
at com.mysema.maven.apt.AbstractProcessorMojo.execute(AbstractProcessorMojo.java:263)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)
Я смущен, так как у меня явно установлен JDK. Мой MAVEN_OPTS
не делает ничего смешного:
» echo $MAVEN_OPTS
-Xmx512m
Попытка отладки, я проверил источник рассматриваемого плагина, который делает следующее:
try {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
if (compiler == null) {
throw new MojoExecutionException("You need to run build with JDK or have tools.jar on the classpath."
+ "If this occures during eclipse build make sure you run eclipse under JDK as well");
}
Это кажется безобидным, поэтому я подозревал что-то не так в моей командной строке env и написал простой тест:
// Main.java
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
public class Main {
public static void main(String[] args) {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
if (compiler == null)
{
System.out.print("Compiler is null");
} else {
System.out.print("Compiler is not null");
}
}
}
» javac Main.java
Main.java:1: cannot access javax.tools.JavaCompiler
bad class file: /Library/Java/JavaVirtualMachines/jdk1.7.0_17.jdk/Contents/Home/jre/lib/rt.jar(javax/tools/JavaCompiler.class)
class file has wrong version 51.0, should be 49.0
Please remove or make sure it appears in the correct subdirectory of the classpath.
import javax.tools.JavaCompiler;
^
1 error
Если я правильно понимаю эту ошибку, она предлагает компилятор Java7, работающий против Java5 rt.jar
?
Я не уверен, что происходит здесь.
У меня явно установлен Java7 JDK, но не понимаю:
- Почему плагин maven возвращает null для компилятора?
- Почему возникают ошибки версии класса?
Update
Ответы говорят о запутанной установке JRE/JDK. Я согласен, что это кажется вероятным, но у него проблемы с поиском, где лежит преступник.
Дополнительная информация:
» which javac
/usr/bin/javac
ls -ltra /usr/bin/javac
/usr/bin/javac -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/javac
cd /System/Library/Frameworks/JavaVM.framework/Versions
ls -ltra
lrwxr-xr-x 1 root wheel 10 18 Feb 08:36 1.6.0 -> CurrentJDK
lrwxr-xr-x 1 root wheel 10 18 Feb 08:36 1.6 -> CurrentJDK
lrwxr-xr-x 1 root wheel 10 18 Feb 08:36 1.5.0 -> CurrentJDK
lrwxr-xr-x 1 root wheel 10 18 Feb 08:36 1.5 -> CurrentJDK
lrwxr-xr-x 1 root wheel 10 18 Feb 08:36 1.4.2 -> CurrentJDK
lrwxr-xr-x 1 root wheel 10 18 Feb 08:36 1.4 -> CurrentJDK
drwxr-xr-x 8 root wheel 272 18 Feb 08:39 A
drwxr-xr-x 11 root wheel 374 18 Feb 08:39 ..
lrwxr-xr-x 1 root wheel 1 14 Jun 11:14 Current -> A
lrwxr-xr-x 1 root wheel 58 14 Jun 11:15 CurrentJDK -> /Library/Java/JavaVirtualMachines/jdk1.7.0_17.jdk/Contents
drwxr-xr-x 11 root wheel 374 14 Jun 11:15 .
Итак, запущенный javac - тот, который установлен в A/Commands
. Я не уверен, правильно это или нет. Это кажется неправильным из моих оконных дней, но я недостаточно разбираюсь в том, как Mac относится к Java-установке, чтобы поработать.
My $JAVA_HOME
указывает на /Library/Java/JavaVirtualMachines/jdk1.7.0_17.jdk/Contents/Home
, который имеет следующее:
drwxrwxr-x 10 root wheel 340 5 Feb 08:10 jre
-rw-rw-r-- 1 root wheel 123324 5 Feb 08:10 THIRDPARTYLICENSEREADME-JAVAFX.txt
drwxrwxr-x 5 root wheel 170 5 Feb 08:10 man
drwxrwxr-x 9 root wheel 306 2 Mar 02:10 db
-rw-rw-r-- 1 root wheel 3339 2 Mar 02:10 COPYRIGHT
drwxrwxr-x 9 root wheel 306 2 Mar 02:10 include
-rw-rw-r-- 1 root wheel 19997030 2 Mar 02:10 src.zip
-rw-rw-r-- 1 root wheel 447 2 Mar 02:10 release
-rw-rw-r-- 1 root wheel 172252 2 Mar 02:10 THIRDPARTYLICENSEREADME.txt
-rw-rw-r-- 1 root wheel 114 2 Mar 02:10 README.html
-rw-rw-r-- 1 root wheel 40 2 Mar 02:10 LICENSE
drwxrwxr-x 5 root wheel 170 2 Mar 02:10 ..
drwxrwxr-x 15 root wheel 510 2 Mar 02:13 .
drwxrwxr-x 13 root wheel 442 2 Mar 02:13 lib
drwxrwxr-x 43 root wheel 1462 2 Mar 02:13 bin
Ответы
Ответ 1
Я нашел a tools.jar
, сидящего в /Library/Java/Extensions
Я не уверен, стандартно это или нет.
Однако копирование tools.jar
из JDK7 $JAVA_HOME/lib
в /Library/Java/Extensions
решило все мои проблемы.
Я также должен указать, что в моем первоначальном вопросе я обновил Java CurrentSDK
, чтобы указать на JDK7
:
CurrentJDK -> /Library/Java/JavaVirtualMachines/jdk1.7.0_17.jdk/Contents
Это была плохая идея, как указано здесь.
Я обновил это, чтобы вернуться к 1.6. Хотя это кажется контр-интуитивным, требуется, чтобы все работало.
Текущий список /System/Library/Frameworks/JavaVM.framework/Versions
с 1.7
JDK выглядит следующим образом:
lrwxr-xr-x 1 root wheel 10 18 Feb 08:36 1.6.0 -> CurrentJDK
lrwxr-xr-x 1 root wheel 10 18 Feb 08:36 1.6 -> CurrentJDK
lrwxr-xr-x 1 root wheel 10 18 Feb 08:36 1.5.0 -> CurrentJDK
lrwxr-xr-x 1 root wheel 10 18 Feb 08:36 1.5 -> CurrentJDK
lrwxr-xr-x 1 root wheel 10 18 Feb 08:36 1.4.2 -> CurrentJDK
lrwxr-xr-x 1 root wheel 10 18 Feb 08:36 1.4 -> CurrentJDK
drwxr-xr-x 8 root wheel 272 18 Feb 08:39 A
drwxr-xr-x 11 root wheel 374 18 Feb 08:39 ..
lrwxr-xr-x 1 root wheel 1 14 Jun 11:35 Current -> A
lrwxr-xr-x 1 root wheel 59 14 Jun 12:31 CurrentJDK -> /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents
drwxr-xr-x 11 root wheel 374 14 Jun 12:31 .
Ответ 2
Правильный способ установки JAVA_HOME на MacOS X состоит в том, чтобы использовать:
[[email protected] ~]$ export JAVA_HOME=$(/usr/libexec/java_home -v1.7)
[[email protected] ~]$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home
Ваша установка Java нарушена, если после этого $JAVA_HOME/lib не содержит tools.jar.
Совет. У меня есть эти два псевдонима, указанные в моем ~/.bash_profile:
alias java6="export JAVA_HOME=$(/usr/libexec/java_home -v1.6)"
alias java7="export JAVA_HOME=$(/usr/libexec/java_home -v1.7)"
Размещение баннеров в /Library/Java/Extensions эквивалентно помещению их в глобальный путь к классам и редко является хорошей идеей.
Ответ 3
Забыть Maven.
В каком каталоге находится каталог JDK /bin
? Это JAVA_HOME
.
Я подозреваю, что вы неправильно установили переменную среды.
И что /bin
должен иметь все исполняемые файлы для инструментов JDK: javac, java, jar, javap и т.д.
Если это не так, тогда у вас нет JDK, у вас есть JRE.
У меня есть компьютер с Windows. Здесь, где я установлен JDK:
C:\Program Files\Java\jdk1.7.0_17
И здесь JAVA_HOME:
JAVA_HOME=C:/Program Files/Java/jdk1.7.0_02
Ответ 4
В этой среде компилятор не предоставляется. Возможно, вы работаете на JRE, а не на JDK?
Ошибка сборки Maven в eclipse с вышеуказанной ошибкой была устранена путем установки старой версии java.
Ответ 5
Скорее всего, javac работает от JRE, а не JDK. tools.jar доступен только в JDK. Подтвердите путь javac/java, используя which
which javac
Перетащите правильную версию Java7 в начало в настройках Java (Launchapad/Others). Это должно указывать A на JDK7.
Ответ 6
У меня была аналогичная проблема и нашла ответ в другом потоке:
Символическая ссылка перепутана с OSX при попытке изменить версию Java
Я установил JAVA_HOME следующим образом:
export JAVA_HOME=/Library/Java/Home
и теперь он работает.
Ответ 7
Если вы обнаружите, что tools.jar
в /Library/Java/Extensions
не принадлежит к правильной версии JDK, то отложите его в сторону, так что там нет tools.jar, и есть tools.jar в $JAVA_HOME/lib
(как указано в предыдущем ответе).
например,
cd
sudo mv /Library/Java/Extensions/tools.jar tools.jar.safe
Ответ 8
У меня возникла следующая ошибка в проекте maven: Не удалось выполнить цель на проекте cobertura-maven-plugin: не удалось разрешить зависимости для проекта org.codehaus.mojo: cobertura-maven-plugin: maven-plugin: 2.6: Could не найти артефакт com.sun: tools: jar: 0 по указанному пути /System/Library/Java/JavaVirtualMachines/ 1.6.0.jdk/Contents/Home/../lib/tools.jar → [Помощь 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Не удалось выполнить цель на проекте cobertura-maven-plugin: не удалось разрешить зависимости для проекта org.codehaus.mojo: cobertura-maven-plugin: maven-plugin: 2.6: Не удалось найти артефакт com.sun: tools: jar: 0 по указанному пути /System/Library/Java/JavaVirtualMachines/ 1.6.0.jdk/Contents/Home/../lib/tools.jar
Я исправил это, создав каталог lib в /System/Library/Java/JavaVirtualMachines/ 1.6.0.jdk/Contents и добавив в него tools.jar.
Полный путь должен быть указан для tools.jar в этом конкретном экземпляре:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/lib/tools.jar