升级到Java7后构建失败,缺少Tools.jar并且类版本不匹配。

6

我最近在我的Macbook Pro上升级到了Java7。我下载了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");
        }

看起来这很无害,所以我怀疑我的命令行环境出了问题,于是写了一个简单的测试:

// 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个回答

9
我发现在 /Library/Java/Extensions 目录下有一个 tools.jar 文件。
我不确定这是否是标准配置。
然而,将 JDK7 中的 $JAVA_HOME/lib 下的 tools.jar 复制到 /Library/Java/Extensions 目录下解决了我的所有问题。
我还应该指出,在我最初的问题中,我更新了 Java 的 CurrentSDK 指向了 JDK7
CurrentJDK -> /Library/Java/JavaVirtualMachines/jdk1.7.0_17.jdk/Contents

正如在这里所指出的那样,这是一个坏主意。

我更新了指向1.6的指针。尽管这似乎违反直觉,但这是必要的,以使事情正常运作。

在使用1.7 JDK的情况下,/System/Library/Frameworks/JavaVM.framework/Versions当前的列表如下:

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 .

9
在MacOS X上设置JAVA_HOME的正确方法是使用以下命令:
[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_HOME/lib目录下不包含tools.jar文件,则说明您的Java安装已损坏。
提示:我在我的~/.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 目录下相当于将其放置在全局类路径中,这通常不是一个好主意。


顺便说一句:我不知怎么地意外地将它踩了而不是点赞,因为它对我有帮助!如果你在意的话,请编辑你的回答,这样我就可以点赞了 :) - Peter Souter

2

忘记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

2
是的,我想也许是$JAVA_HOMEwhich javac之间存在不一致性。 - Tim Bender
谢谢,我已经更新以回答你的问题。当前的JDK(由JAVA_HOME定义)包含/bin目录。然而,which javac正在从一些奇怪的Mac路径运行,这我真的不太理解。 - Marty Pitt

2

该环境中没有提供编译器。也许你正在运行JRE而不是JDK?

在Eclipse中,由于上述错误导致的Maven构建失败可以通过卸载旧版本的Java来解决。


1

如果您想返回基本的Java安装,则此方法可行。但是,如果您尝试使用不同版本的Java,则这种方法完全没有用处。 - WattsInABox

1
如果您发现 /Library/Java/Extensions 中的 tools.jar 不是来自正确版本的JDK,则将其移开,以便那里没有 tools.jar,并且在 $JAVA_HOME/lib(如前面的响应中设置)中有一个 tools.jar。
例如:
cd 
sudo mv /Library/Java/Extensions/tools.jar tools.jar.safe

1
我在一个maven项目中遇到了以下错误:在项目cobertura-maven-plugin上执行目标失败:无法解决org.codehaus.mojo:cobertura-maven-plugin:maven-plugin:2.6的依赖项:无法在指定路径/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/../lib/tools.jar中找到com.sun:tools:jar:0 -> [帮助 1] org.apache.maven.lifecycle.LifecycleExecutionException:在项目cobertura-maven-plugin上执行目标失败:无法解决org.codehaus.mojo:cobertura-maven-plugin:maven-plugin:2.6的依赖项:无法在指定路径/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/../lib/tools.jar中找到com.sun:tools:jar:0 我通过在/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents下创建一个lib目录并将tools.jar添加到其中来解决它。 在此特定情况下,tools.jar的完整路径如下:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/lib/tools.jar。

1
很可能javac是从JRE而不是JDK运行的。tools.jar仅在JDK中可用。通过使用which来确认javac / java的路径。
which javac

将正确的Java7版本拖到Java Preferences(Launchapad / Others)的顶部。这应该会将A指向JDK7。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接