zoukankan      html  css  js  c++  java
  • [容器原因]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
    

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

  • 相关阅读:
    jquery 選擇器
    jquery 語法
    jQuery 簡介
    js cookies
    基本数据类型
    python----编程语言介绍
    Python---计算机基础
    复习os模块常用的一些操作
    模块的初识
    模块和包
  • 原文地址:https://www.cnblogs.com/slankka/p/13449897.html
Copyright © 2011-2022 走看看