我最近在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,但不明白:
答案表明混乱的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
答案 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/Versions
与1.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
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