升级到Java7后生成失败,缺少Tools.jar和错误的类版本

升级到Java7后生成失败,缺少Tools.jar和错误的类版本,java,Java,我最近在MacBookPro上升级到了Java7。我下载了JDK(不是JRE) 但是,当尝试运行构建时,一个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 duri

我最近在MacBookPro上升级到了Java7。我下载了JDK(不是JRE)

但是,当尝试运行构建时,一个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_选项
不要做任何有趣的事:

» 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");
        }
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
这似乎是无害的,所以我怀疑我的命令行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
如果我正确理解了这个错误,它建议使用一个针对Java5
rt.jar运行的Java7编译器

我不知道这里发生了什么

我显然安装了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
中的javac。我不确定这是否正确。在我的windows时代,这似乎是错误的,但我对Mac如何处理Java安装的问题还不够熟悉

我的
$JAVA_HOME
指向
/Library/JAVA/JavaVirtualMachines/jdk1.7.0_17.jdk/Contents/HOME
,它具有以下内容:

    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");
        }
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
忘了Maven吧

JDK
/bin
目录在哪个目录中?那是
JAVA\u HOME

我怀疑您设置的环境变量不正确

/bin
应该拥有JDK工具的所有可执行文件:javac、java、jar、javap等等

如果不是这样,那么你没有JDK,你有JRE

我有一台Windows电脑。下面是我安装JDK的地方:

C:\Program Files\Java\jdk1.7.0_17
这里是JAVA_主页:

JAVA_HOME=C:/Program Files/Java/jdk1.7.0_02

很可能javac是从JRE而不是JDK运行的。jar仅在JDK中可用。使用
which

which javac

将正确的Java7版本拖动到Java首选项的顶部(Launchapad/Others)。这应该指向JDK7。

我在
/Library/Java/Extensions
中找到了一个
tools.jar

我不确定这是否是标准的

但是,将
tools.jar
从JDK7
$JAVA_HOME/lib
复制到
/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 .
export JAVA_HOME=/Library/Java/Home

在MacOS X上设置JAVA_主页的正确方法是使用:

[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_配置文件中指定了这两个别名:

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

我遇到了类似的问题,并在另一个线程中找到了答案:

我将JAVA_HOME设置如下:

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 .
export JAVA_HOME=/Library/Java/Home

如果您发现
/Library/Java/Extensions
中的
tools.jar
不是来自正确版本的JDK,那么请将其移到一边,这样那里就没有tools.jar,而
$Java_HOME/lib
中有一个tools.jar(如前面的响应中所设置的)

乙二醇


我在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插件执行目标:无法解析项目org.codehaus.mojo:cobertura maven插件:maven插件: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下创建一个libdir并向其中添加tools.jar来修复它


在此特定实例中,tools.jar的完整路径为:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/lib/tools.jar

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


eclipse中出现上述错误的Maven build failure(Maven build failure in eclipse中的Maven build failure)是通过取消安装旧版本的java来修复的。

是的,我想可能是
$java\u HOME
哪个javac
之间存在不一致。谢谢,我已经更新以回答您的问题。当前的JDK(根据
JAVA\u HOME
的定义,它包含
/bin
目录。但是,
哪个javac
是从某个看起来像wierd mac的路径运行的,我真的不明白。顺便说一句:我无意中否决了它,而不是向上投票,因为它为我修正了它!如果你介意,编辑你的答案,它将允许我向上投票:)如果你想回到基本的Java安装,这是可行的。如果你想使用不同版本的Java,这对你没有任何好处。