升级到Java7,Missing Tools.jar和错误的类版本后构建失败

时间:2013-06-14 00:32:42

标签: java

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

如果我正确理解了这个错误,那么它建议针对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,其中包含以下内容:

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 个答案:

答案 0 :(得分:9)

我在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。虽然这看似违反直觉,但要求让事情顺利进行。

/System/Library/Frameworks/JavaVM.framework/Versions1.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 .

答案 1 :(得分: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中等同于将它们放在全局类路径中并且很少是个好主意。

答案 2 :(得分: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

答案 3 :(得分:2)

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

通过卸载旧版本的java修复了上面出现错误的eclipse中的Maven构建失败。

答案 4 :(得分:1)

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

确认javac / java的路径
which javac

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

答案 5 :(得分:1)

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

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

我按如下方式设置JAVA_HOME:

export JAVA_HOME=/Library/Java/Home

它现在正在运作。

答案 6 :(得分:1)

如果您发现tools.jar中的/Library/Java/Extensions不是来自JDK的正确版本,请将其移开,以便没有tools.jar,并且有一个$JAVA_HOME/lib中的tools.jar(在上一个响应中设置)。

例如

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

答案 7 :(得分:1)

我在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

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