byzer-org/byzer-lang

【Bug】Byzer all in one 在无java环境下启动失败,没有使用到默认的 jdk

ZhengshuaiPENG opened this issue · 3 comments

如图
8DWCFVru5R

新安装的环境,没有java 依赖,byzer-all-in-one 无法自动获取到内置的 java

Bug RootCause

在执行 $BYZER_HOME/bin/byzer.sh start 时,会先通过 bin/header.sh 来进行系统中 java 的获取,在原有获取 java 逻辑中,会通过 /bin/get-properties.sh 来拿到 byzer.properites.override 中定义的 byzer.server.mode 来定义分支逻辑。但是 /bin/get-properties.sh 这个脚本就需要使用 java。 所以当系统中没有安装 java 的情况下,这里就陷入了一个互相依赖的状态,导致无法获取到 byzer-all-in-one 的内置 jdk。

另外在 /bin/get-properties.sh 以及 header.shisValidJavaVersion() 函数中调用 java 的时候,不是调用脚本自动寻找到的 java,而是直接调用了 java 命令,所以当 bash 里无法直接执行 java 时,这两个功能会break

Fix Design

  1. 将 java 的获取逻辑提前,然后export $JAVA_HOME & $JAVA 两个变量
  2. 在后续脚本逻辑中任意地方需要调用 java 命令的地方,使用 $JAVA 变量声明的 java 进行替代
  3. 获取 java 的逻辑根据 MAC 和 Linux 两个环境进行分支处理:
    • 优先尝试获取系统变量中的 $JAVA_HOME, 找到 $JAVA_HOME/bin/java, 将其赋值给 $JAVA 变量
    • 如果系统环境变量没有声明 $JAVA_HOME, 则尝试使用 java 命令,然后自动找出 $JAVA_HOME 以及$JAVA_HOME/bin/java, 并将$JAVA_HOME/bin/java赋值给 $JAVA 变量
    • 如果上述两条路径都无法找到 java, 则尝试寻找 ${BYZER_HOME}/jdk8, 使用内置的 jdk
    • 最后上述都无法找到 java,则报错退出

Test Evidence

环境准备

  • 新安装的 CentOS 7.9 minimal, 通过 yum 安装 net-tools (因为脚本中会使用到 ifconfig 命令),不安装 java
    image

  • 安装 Byzer 2.3.2, 下载 byzer 2.3.2 all in one, 解压至根目录
    image

至此环境准备完毕

测试流程

1. case 1: 直接启动 byzer 引擎
期待结果: 引擎顺利启动,由于系统没有安装 java, 所以使用的应该是内置 jdk8

image

**2. case 2: 将 jdk 安装至/opt/jdk8/ 目录,并 export JAVA_HOME=/opt/jdk8, 重启 byzer 引擎** 期待结果: 引擎顺利启动,由于系统声明了环境变量, 所以使用的应该是 /opt/jdk8`
image

3. export 一个错误的java home,重启 byzer 引擎
期待结果:启动失败,并报错 java home 不正确

image

4. 不设置 JAVA_HOME, 将 java 通过软连接的方式,将添加到环境可执行的位置 /usr/local/bin,重启 byzer 引擎
期待结果:启动成功,并能真实的找到 java home

image