Сбои сборки после обновления до 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 возвращает ноль для компилятора?
  • Почему я получаю ошибки версии класса?

Обновить

Ответы предполагают испорченную установку 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, Я не уверен, правильно это или нет. Это кажется неправильным в мои дни Windows, но я не достаточно знаком с тем, как Mac рассматривает установку Java, чтобы пойти возиться.

мой $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

8 ответов

Решение

Я нашел 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 .

Правильный способ установить JAVA_HOME на MacOS X - это использовать:

[user@ip ~]$ export JAVA_HOME=$(/usr/libexec/java_home -v1.7)
[user@ip ~]$ 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)"

Размещение jar-файлов в /Library/Java/Extensions эквивалентно размещению их в глобальном пути к классам и редко является хорошей идеей.

В этой среде не предусмотрен компилятор. Возможно, вы работаете на JRE, а не на JDK?

Ошибка сборки Maven в eclipse с вышеуказанной ошибкой была исправлена ​​удалением более старой версии Java.

Забудь о мавене.

В каком каталоге находится 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

Скорее всего, Javac работает из JRE, а не JDK. tools.jar доступен только в JDK. Подтвердите путь javac/java с помощью which

which javac

Перетащите правильную версию Java7 наверх в настройках Java (Launchapad/Others). Это должно указывать на JDK7.

У меня была похожая проблема, и я нашел ответ в другой ветке:

Символьная ссылка испортилась на OSX при попытке изменить версию Java

Я установил JAVA_HOME следующим образом:

export JAVA_HOME=/Library/Java/Home

и сейчас работает.

Если вы обнаружите, что tools.jar в /Library/Java/Extensions не из правильной версии JDK, затем уберите его с пути, чтобы там не было tools.jar и там был tools.jar $JAVA_HOME/lib (как установлено в предыдущем ответе).

например

cd 
sudo mv /Library/Java/Extensions/tools.jar tools.jar.safe

Я получил следующую ошибку в проекте maven: Не удалось выполнить цель для проекта 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 -> [Справка 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

Другие вопросы по тегам