升级到Java8后,javac仍然显示1.7版本。

37
我在OSX上升级JDK 1.7 -> 1.8时遇到了问题。升级已完成,但javac仍然返回版本1.7。
我从Oracle官网下载了JDK 8_u5并运行了安装程序。
安装后,我还执行了以下步骤:
> export JAVA_HOME=`/usr/libexec/java_home -v 1.8`  (Executed in my .bashrc file)

> echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home

> javac -version
javac 1.7.0_21

> $JAVA_HOME/bin/javac -version
javac 1.7.0_21

> $JAVA_HOME/bin/java -version    
java version "1.8.0_05"
Java(TM) SE Runtime Environment (build 1.8.0_05-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.5-b02, mixed mode)

我已经卸载了Java 1.7(以及所有其他JDK版本),然后重新运行了安装程序:

> ls /Library/Java/JavaVirtualMachines
jdk1.8.0_05.jdk

仍然无法使用,javac 报告版本为 1.7.0_21。

> which javac
/usr/bin/javac

> ls -ltra /usr/bin/javac 
[snipped] /usr/bin/javac -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/javac

在该路径中,Current 是指向 A 的符号链接。 A/Commands 的内容是一系列文件(而不是符号链接)。
> cd A/Commands
> ./javac -version
javac 1.7.0_21

> ./java -version
java version "1.8.0_05"
Java(TM) SE Runtime Environment (build 1.8.0_05-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.5-b02, mixed mode)

编辑

根据原帖,我使用了jenv进行了一些挖掘,正如这个回答中所建议的。

> jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home                 
> jenv global oracle64-1.8.0.05
> jenv version
oracle64-1.8.0.05 (set by /Users/martypitt/.jenv/version)

> jenv info java 
Jenv will exec : /Users/martypitt/.jenv/versions/oracle64-1.8.0.05/bin/java

> jenv info javac
Jenv will exec : /Users/martypitt/.jenv/versions/oracle64-1.8.0.05/bin/javac

> javac -version
javac 1.7.0_21

这让我怀疑这是一个随机的javac潜伏在我的路径中,并且以某种方式被调用。
为了确保,我已经彻底删除了Java,并重新尝试了一遍:
> cd /Library/Java/JavaVirtualMachines
> ls 
jdk1.7.0_55.jdk 
jdk1.8.0_05.jdk
> sudo rm -rf *  
> ls
<<empty>>
> java -version
java version "1.6.0_65"
> javac -version
javac 1.6.0_65
> which javac
/usr/bin/javac

我随后重新下载了新的安装程序并运行了它。
> java -version
java version "1.8.0_05"
> javac -version
javac 1.7.0_21

更新

我尝试移除所有JDK、XCode和开发者工具,然后重新安装。

但是,我仍然不知所措——接下来该怎么办?如何安装javac 1.8?


不确定这是否有帮助,但尝试卸载与JDK/JRE相关的所有内容,并尝试重新安装JDK/JRE,请参考http://askubuntu.com/questions/84483/how-to-completely-uninstall-java。 - dev2d
你可以尝试执行/usr/libexec/java_home -v 1.8.0_05 --exec javac -version吗? - Anthony Accioly
@AnthonyAccioly 已经重装系统,但问题仍然存在。(请查看更新) - Marty Pitt
我刚刚在我的OS X系统(10.9.2)上安装了JDK 1.8u5,它运行良好。我的/Library/Java/JavaVirtualMachines目录下只包含jdk1.8.0_05。 - nneonneo
@RainerSchwarze 当然可以:https://gist.github.com/martypitt/11316117。也许你可以做同样的事情,并进行比较? - Marty Pitt
显示剩余11条评论
6个回答

39
如果/usr/libexec/java_home -v 1.8.0_05 --exec javac -version 返回正确的版本,则您的问题出在:
/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK

使用特权用户执行:

cd /System/Library/Frameworks/JavaVM.framework/Versions/
rm CurrentJDK
ln -s /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/ CurrentJDK

解决方案找到于Mankeh Blog


还可以查看在Super User上这个答案,以便动态切换JDK版本。


更新:我想我已经找到了罪魁祸首!

试试这个:

rm -rf ~/Library/Java/Extensions
sudo rm -rf /Library/Java/Extensions

解决方案找到于: 在Mac OS X 10.9.2上作为1.5运行的Java 1.7?


1
很高兴为您服务。我这个押韵的像素化版本说:“感谢美味的赏金”。真正的我说:“如果你来巴西,我们可以喝啤酒,聊聊在OS X中永久放弃Java开发的事情!”当苹果开始失误时,我就这么做了 - 当然是在Oracle能够接手之前 - 现在我是一个非常快乐的openSUSE用户,我一点也不抱怨!真的!它只是有效地工作! - Anthony Accioly
安东尼,你太棒了!删除 /Library/Java/Extensions 起作用了!谢谢! - stuff22
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Filip
@psun,您是否链接到了正确的JDK文件夹?(文件夹位置可能会根据Java版本而变化) - Anthony Accioly
我的命令是 ln -s /Library/Java/JavaVirtualMachines/jdk1.8.0_77.jdk/Contents/ Current - psun
显示剩余7条评论

9

对于Windows用户:

有可能需要更改您的PATH变量。尝试将"%JAVA_HOME%/bin"设置为PATH的第一个条目。

现在它应该是这样的:

 PATH    C:\Program Files\anyprogram;C:\Program Files\...;%JAVA_HOME%\bin

你可以像这样修改它:

然后你可以进行如下修改:

 PATH    %JAVA_HOME%\bin;C:\Program Files\anyprogram;C:\Program Files\...

原因:任何其他程序首先启动另一个Java版本。


0
首先,您需要下载并安装jdk8(http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)
其次,按照以下步骤进行检查: 您的系统是否已经使用Java 8而没有链接到Shell?在终端中尝试此操作(是的,撇号很重要):
$ '/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java' -version 

如果显示“java version"1.8.0_131"”,那么您可以进行下一步操作。 我的截图 第三步,编辑bash_profile:
$ vi ~/.bash_profile 

然后输入这个:

JAVA_HOME="/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home"
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib
export JAVA_HOME
export CLASSPATH 

保存并退出,然后

source ~/.bash_profile 

完成上述步骤后,检查Java版本

$ java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

0
也许您可以删除类路径中的标准 .jar 文件。当我在 /Library/Java/Extensions 中删除了该 jar 文件时,问题得到了解决。 更多信息: Java compilation error: Mac

这个问题包含在升级到Java8后,javac仍然显示1.7中。 - Danh

0

这很可能是在安装jre8过程中出现的错误。

当我导航到我的jre8文件夹时,我遇到了完全相同的行为,这是Windows(在我的情况下)默认显示的文件夹:

  • java版本:1.8.0,运行时环境1.8.0-b132,热点64位JVM 25.0-b70
  • javac版本:1.7.0_25

当导航到jdk8目录时,它显示如下内容:

  • java版本:1.8.0,运行时环境1.8.0-b132,热点64位JVM 25.0-b70
  • javac版本:1.8.0

不过我刚刚注意到jre从未提供javac,所以我想这是操作系统中参考设置的问题。

要解决此问题,您需要手动修复操作系统中的javac引用。


谢谢 - 我怀疑根本原因是相同的(某个地方有一个 javac)。OSX和Windows中的文件夹结构非常不同。OSX将其JDK文件(以及对这些文件的指针)分散到各个地方,因此没有“jdk8”目录。javac不在JRE文件夹中是有道理的,因为它是JDK的一部分,而不是JRE。 - Marty Pitt
进一步来说,我对javac正在解析的路径进行了更多的调查。根据问题中更新的信息,我有信心认为正在执行的javac是在jdk8路径内的那个。我不确定它是否与随jdk8一起提供的那个相同,但我没有做任何超出基本安装的操作。很奇怪。 - Marty Pitt

0

在这里分享我的经验,我从Oracle安装了jdk-8u131-macosx-x64。一切都完美地运行了,没有出现或需要JAVA_HOME环境变量。

mehboob$ javac -version
javac 1.8.0_131

mehboob$ java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

/System/Library 显示了这个:

mehboob$ ls -l /System/Library/Frameworks/JavaVM.framework/Versions/
total 64
lrwxr-xr-x  1 root  wheel   10 Oct 17  2013 1.4 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 Oct 17  2013 1.4.2 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 Oct 17  2013 1.5 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 Oct 17  2013 1.5.0 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 Oct 17  2013 1.6 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 Oct 17  2013 1.6.0 -> CurrentJDK
drwxr-xr-x  8 root  wheel  272 Sep  9  2014 A
lrwxr-xr-x  1 root  wheel    1 Oct 17  2013 Current -> A
lrwxr-xr-x  1 root  wheel   59 Oct 17  2013 CurrentJDK -> /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents

当/Library/Java有这个:

mehboob$ ls -l /Library/Java/
total 8
drwxrwxr-x  2 root  admin   68 Oct 17  2013 Extensions
lrwxr-xr-x  1 root  wheel   48 Oct 17  2013 Home -> /System/Library/Frameworks/JavaVM.framework/Home
drwxr-xr-x  3 root  wheel  102 Jun  9 11:43 JavaVirtualMachines

在扩展中没有任何内容,而JavaVirtualMachines只有jdk1.8.0_131.jdk文件夹。

这表明默认安装的JDK可以正常工作,无需额外配置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接