【问题标题】:Builds failing after upgrading to Java7, Missing Tools.jar and bad class versions升级到 Java7 后构建失败,缺少 Tools.jar 和错误的类版本
【发布时间】:2013-06-10 13:34:01
【问题描述】:

我最近在我的 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

尝试调试,我检查了有问题的插件的source,它正在执行以下操作:

    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 插件会为编译器返回 null?
  • 为什么会出现类版本错误?

更新

答案表明 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

【问题讨论】:

    标签: java


    【解决方案1】:

    我发现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
    

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

    我将其更新为指向 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 .
    

    【讨论】:

      【解决方案2】:

      在 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 中相当于将它们放在全局类路径中,这不是一个好主意。

      【讨论】:

      • 顺便说一句:我不知何故不小心投了反对票而不是赞成,因为它为我解决了这个问题!如果你在乎,请编辑你的答案,它会让我投票赞成:)
      【解决方案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
      

      【讨论】:

      • 是的,我在想$JAVA_HOMEwhich javac 之间可能也存在不一致。
      • 谢谢,我已更新以回答您的问题。当前的 JDK(由JAVA_HOME 定义包含/bin 目录。但是,which javac 是从一些看起来很奇怪的 mac 路径运行的,我不太明白。
      【解决方案4】:

      此环境中未提供编译器。也许您在 JRE 而不是 JDK 上运行?

      通过卸载旧版本的 java 修复了 Eclipse 中的 Maven 构建失败和上述错误。

      【讨论】:

        【解决方案5】:

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

        which javac
        

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

        【讨论】:

          【解决方案6】:

          我遇到了类似的问题,在另一个帖子中找到了答案:

          Symbolic link messed up on OSX while trying to change the Java version

          我将 JAVA_HOME 设置如下:

          export JAVA_HOME=/Library/Java/Home
          

          它现在正在工作。

          【讨论】:

          • 如果您想回到基本的 Java 安装,这很有效。如果您尝试使用不同版本的 Java,这对您没有任何好处。
          【解决方案7】:

          如果你发现/Library/Java/Extensions中的tools.jar不是来自正确的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 的依赖项:可以在指定路径 /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/../lib/tools.jar -> [帮助 1] 找不到工件 com.sun:tools:jar:0 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

            我通过在 /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

            【讨论】:

              猜你喜欢
              • 2018-10-10
              • 1970-01-01
              • 2018-01-19
              • 1970-01-01
              • 1970-01-01
              • 2020-04-20
              • 1970-01-01
              • 1970-01-01
              • 2020-11-03
              相关资源
              最近更新 更多