问题描述
在 gocd中执行maven 打包,结果报错:
No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK。
100% 确定机器的 环境变量 100%正确,JAVA_HOME什么的PATH,这都大一就弄明白的,这还能有错?
分析
能遇到这个错误的,除了基本的环境变量问题以外,对于100%确保操作系统的环境变量没问题的情况下,仍然报这个错,那就只有一个问题:程序的执行容器的环境变量将它移除掉了。
特意在 /opt/apache-maven-3.6.3/bin/mvn
的代码中 加了以下两行:
if [ -z "$JAVA_HOME" ] ; then
JAVACMD=`which java`
else
JAVACMD="$JAVA_HOME/bin/java"
fi
echo "$JAVA_HOME" #这个打印出来JAVA_HOME
echo $JAVACMD #这里打印出来JAVACMD
执行 mvn -v
/usr/java/jdk1.8.0_121
/usr/java/jdk1.8.0_121/bin/java
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /opt/apache-maven-3.6.3
Java version: 1.8.0_121, vendor: Oracle Corporation, runtime: /usr/java/jdk1.8.0_121/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-862.el7.x86_64", arch: "amd64", family: "unix"
一切正常。别看某些博客说的 runtime: /usr/java/jdk1.8.0_121/jre
,这是完全正常的。
网上搜索一番,大部分是Eclipse环境下
因为Eclipse默认是使用JRE的,他本身发起调用,创建进程,可能不是依赖系统环境变量的,作为IDE,JDK是要支持自己配置的。反推也是这个道理。
gocd中 执行构建作业,发现报错如下
#这行JAVA_HOME没能打印出来
/usr/bin/java #这行打印的是非JAVA_HOME的路径,这个还真是操作系统默认的OPENJDK的JRE
....
No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK
结合这个表现,可以得出结论了
结论
一定是程序的运行时环境屏蔽了某些系统环境变量,可能是出于创建一个干净的执行环境的目的。
Eclipse自然不用说,他是IDE,集成开发环境,他创建的运行时当然要屏蔽JAVA_HOME,才能确保使用用户指定的JDK/JRE等,而操作系统的JRE是提供给IDE本身执行的运行环境
gocd是构建系统,他有环境变量的概念,因此完全有可能要屏蔽运行时中的JAVA_HOME
顺着这个思路,查询 得到 go-agent's environment leaks into jobs
这个问题没想到是反过来证明了上述推论,打包构建的环境泄露给了打包作业。这个意思就是:打包构建的运行时不应该包含 构建作业工具本身的环境变量。
下面给出 FredrikWendt
Author的评论
LGTM - it's going to fix the immediate problem.
Ideally, I'd make sure the environment is clean before adding things (ie https://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html#environment-- if you're driving things from Java), but we could split this story into two:
removing the JAVA_HOME leakage
providing a really clean run time environment for tasks
更加进一步证实了这个工具的设计思想:就要提供一个完全干净的运行时环境。