当前位置:首页 > 服务端 > [容器原因]No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK

[容器原因]No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK

问题描述

在 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

更加进一步证实了这个工具的设计思想:就要提供一个完全干净的运行时环境。

作者:一杯半盏
来源链接:https://www.cnblogs.com/slankka/p/13449897.html

版权声明:
1、Java侠(https://www.javaxia.com)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。





本文链接:https://www.javaxia.com/server/125426.html

标签: No compiler
分享给朋友:

“[容器原因]No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK” 的相关文章