当前位置: 首页 > 面试题库 >

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

相野
2023-03-14
问题内容

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

如果我正确理解该错误,则表明它是针对Java5运行的Java7编译器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是安装在中的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

问题答案:

我发现tools.jar坐在/Library/Java/Extensions

我不确定这是否是标准的。

但是,tools.jar从JDK7 复制$JAVA_HOME/lib可以/Library/Java/Extensions解决我所有的问题。

我还应该指出,在我最初的问题中,我已将Java更新CurrentSDKJDK7

CurrentJDK -> /Library/Java/JavaVirtualMachines/jdk1.7.0_17.jdk/Contents

正如这里指出的,这是一个坏主意。

我将其更新为指向1.6。尽管这似乎违反直觉,但仍需要使事情正常进行。

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

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 .


 类似资料:
  • 我最近在我的Macbook Pro上升级到了Java7。我下载了JDK(而不是JRE)。 但是,当尝试运行构建时,一个maven编译器插件失败了,它声称我安装了一个JRE: 我很困惑,因为我显然已经安装了JDK。我的不要做任何有趣的事情: 这似乎是无害的,所以我怀疑我的命令行env有问题,并编写了一个简单的测试: 如果我正确理解了这个错误,那么它建议使用Java7编译器运行Java5? 我不确定这

  • 我最近更新了我的项目的gradle版本,从2.14.1到3.0。从那以后,gradle构建每次都失败,出现以下错误: 错误:原因:org.gradle.api.internal.tasks.defaultTaskinputs$TaskinputUnionFileCollection无法强制转换为org.gradle.api.internal.file.Collections.defaultConf

  • 升级build.gradle文件中的以下行后 和gradle-wrapper.properties文件中的行以下 我的应用程序的签名发布apk根本不起作用。虽然当我在开发模式下运行应用程序时,一切都很好。 下面是我在android studio logcat中得到的错误- 2018-11-23 17:49:24.552 3506-3570/?E/AndroidRuntime:致命异常:Thread

  • 我最近将我项目的android studio版本从2.3Canary2更新到了2.3Canary3。从那以后,gradle构建每次都失败,错误是: Gradle的依赖项缓存可能已损坏(这有时发生在网络连接超时之后。)重新下载依赖项和同步项目(需要网络) 分级构建进程(守护进程)的状态可能已损坏。停止所有Gradle守护进程可能会解决这个问题。停止分级生成进程(需要重新启动) 您的项目使用的第三方插

  • 一旦我升级到Flutter2.5.1,我的项目就停止构建和运行,并出现以下错误: /users/admin/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/geolocator_android-2.0.0/android/src/main/java/com/baseflow/geolocator/location/locationmapper.

  • 我的grails应用程序在生产中使用h2嵌入式数据库,最近我决定将其从grails 2.3升级到2.4。在开发模式下运行良好,但在部署到tomcat后,我提到了一些问题,例如,用户计数有问题,ApplicationContext无法用getBean加载我的服务等。我检查了日志,发现了以下错误: org.springframework.beans.factory。BeanCreationExcept