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

我最近在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"); } 

这似乎无害,所以我在命令行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插件为编译器返回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 

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

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

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

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

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

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

 which javac 

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

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

尝试更改Java版本时,OSX上的符号链接搞砸了

我按如下方式设置JAVA_HOME:

 export JAVA_HOME=/Library/Java/Home 

它现在正在运作。

如果您发现/Library/Java/Extensions中的tools.jar不是来自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 – > [Help 1] org.apache.maven .lifecycle.LifecycleExecutionException:无法在项目上执行目标cobertura-maven-plugin:无法解析项目的依赖关系org.codehaus.mojo:cobertura-maven-plugin:maven-plugin:2.6:找不到工件com.sun:工具: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