6

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

如果我正确理解该错误,它表明 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
4

8 回答 8

9

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

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

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

我还应该指出,在我原来的问题中,我已经更新了 JavaCurrentSDK以指向JDK7

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 .
于 2013-06-14T03:18:44.703 回答
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 中相当于将它们放在全局类路径中,这很少是一个好主意。

于 2013-07-05T04:30:22.373 回答
2

忘记马文。

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
于 2013-06-14T00:35:13.713 回答
2

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

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

于 2015-02-12T21:23:46.483 回答
1

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

which javac

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

于 2013-06-14T00:53:39.933 回答
1

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

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

我将 JAVA_HOME 设置如下:

export JAVA_HOME=/Library/Java/Home

它现在正在工作。

于 2013-07-25T16:11:10.567 回答
1

如果发现tools.jarin/Library/Java/Extensions不是来自正确版本的 JDK,则将其移开,这样那里就没有 tools.jar 并且有一个 tools.jar $JAVA_HOME/lib(如上一个响应中设置的)。

例如

cd 
sudo mv /Library/Java/Extensions/tools.jar tools.jar.safe
于 2014-01-24T09:56:47.527 回答
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 -> [Help 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

于 2014-11-05T02:25:09.960 回答