Сбой сборки после обновления до версии 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.

Ответ 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