CentOS 6机器已装Java 8却识别为Java 6,构建失败如何解决?
遇到这种情况挺常见的——明明装了Java 8,但构建工具偏要揪着旧的Java 6不放,还查不到rpm包,大概率是Java 6是手动解压安装的,或者系统里的软链接、环境变量没更新到位。咱们一步步来搞定:
1. 先揪出所有Java版本的藏身之处
首先得找到系统里所有Java可执行文件的位置,用这两个命令:
which -a java which -a javac
这会列出所有存在的java和javac路径,比如可能会出现/usr/local/bin/java或者/opt/jdk1.6.0_21/bin/java这类没被rpm记录的路径,先把这些路径记下来。
接着可以用ls -l查看这些路径是不是软链接,追查到实际安装目录:
ls -l $(which java)
另外CentOS常用alternatives管理默认程序,也查一下这里的配置:
alternatives --display java alternatives --display javac
哪怕rpm没记录,这里可能还留着Java 6的条目。
2. 检查环境变量是否拖后腿
构建工具(比如Ant)会优先看JAVA_HOME和PATH的设置,先确认这两个变量指向的是不是Java 8:
echo $JAVA_HOME echo $PATH
如果JAVA_HOME指向的是Java 6的目录,或者PATH里Java 6的bin目录排在Java 8前面,就会导致构建时调用旧版本。
你可以先临时设置环境变量测试:
export JAVA_HOME=/path/to/your/java8/directory # 替换成你实际的Java8路径,比如/usr/java/jdk1.8.0_xxx export PATH=$JAVA_HOME/bin:$PATH
然后再运行构建命令,如果不报错了,就把这两行写到全局配置文件(比如/etc/profile)或者你的用户配置文件(~/.bashrc)里,执行source /etc/profile让配置立即生效。
3. 清理手动安装的Java 6
如果前面找到了Java 6是手动解压安装的(比如直接把tar包解压到某个目录),直接删除对应的目录就行:
sudo rm -rf /path/to/java6/directory # 替换成你找到的Java6实际路径
然后还要确保系统默认的Java软链接指向Java 8,用alternatives工具设置:
如果Java 8还没加入alternatives,先添加:
sudo alternatives --install /usr/bin/java java /path/to/java8/bin/java 100 sudo alternatives --install /usr/bin/javac javac /path/to/java8/bin/javac 100
数字100是优先级,越高越优先。
然后设置默认:
sudo alternatives --set java /path/to/java8/bin/java sudo alternatives --set javac /path/to/java8/bin/javac
4. 检查构建工具的硬编码配置
有时候build.xml或者构建工具(比如Ant)本身的配置会硬指定Java路径,你可以:
- 查看
build.xml里有没有类似<property name="java.home" value="xxx"/>的配置,改成Java 8的路径; - 检查Ant的配置文件,比如
~/.ant/ant.conf或者/etc/ant.conf,看有没有设置错误的JAVA_HOME; - 也可以直接强制Ant使用Java 8测试:
ant -Djava.home=/path/to/java8 -f build.xml
5. 最后验证
处理完后,重新打开终端(或者执行source /etc/profile),运行:
java -version javac -version
确认输出都是Java 8的版本,再执行构建命令就应该正常了。
内容的提问来源于stack exchange,提问作者danglingPointer

