sandbox启动未加载repeater的问题
创始人
2024-04-30 00:58:23
0

背景

通过官方提供的 repeater 的下载链接,并不能够在sandbox启动时,加载进行,我们可以看下sandbox的日志截图

在这里插入图片描述

但是如果通过源码的repeater进行安装后,就能够成功加载到repeater。

在这里插入图片描述

分析

这是个很奇怪的问题,想要分析这个,我们就要确认下通过官方的脚本安装跟源码安装的差异在哪了。

官方的shell脚本

#!/usr/bin/env bashtypeset SANDBOX_HOME=${HOME}/sandboxtypeset MODULE_HOME=${HOME}/.sandbox-module# exit shell with err_code
# $1 : err_code
# $2 : err_msg
exit_on_err()
{[[ ! -z "${2}" ]] && echo "${2}" 1>&2exit ${1}
}main(){echo "======  begin to install sandbox and repeater module       ======";echo "======  step 0 begin to download sandbox package           ======";curl -s https://github.com/alibaba/jvm-sandbox-repeater/releases/download/v1.0.0/sandbox-1.3.3-bin.tar | tar xz -C ${HOME} || exit_on_err 1 "extract sandbox failed"echo "======  step 1 begin to download repeater module package   ======";if [ ! -d ${MODULE_HOME} ]; thenmkdir -p ${MODULE_HOME} || exit_on_err 1 "permission denied mkdir ${MODULE_HOME}"ficurl -s https://github.com/alibaba/jvm-sandbox-repeater/releases/download/v1.0.0/repeater-stable-bin.tar | tar xz -C ${MODULE_HOME} || exit_on_err 1 "extract repeater failed"echo "======                 install finished                    ======";
}main

从上面可以看出来,其实就是下载两个文件,分别解压到对应的目录下就好了。

那我们再看下通过repeater源码进行执行 install-local.sh的逻辑

#!/usr/bin/env bash# repeater's target dir
REPEATER_TARGET_DIR=../target/repeater# exit shell with err_code
# $1 : err_code
# $2 : err_msg
exit_on_err()
{[[ ! -z "${2}" ]] && echo "${2}" 1>&2exit ${1}
}# package
sh ./package.sh || exit_on_err 1 "install failed cause package failed"# extract sandbox to ${HOME}
curl -s https://github.com/alibaba/jvm-sandbox-repeater/releases/download/v1.0.0/sandbox-1.3.3-bin.tar | tar x -C ${HOME} || exit_on_err 1 "extract sandbox failed"# copy module to ~/.sandbox-module
mkdir -p ${HOME}/.sandbox-module || exit_on_err 1 "permission denied, can not mkdir ~/.sandbox-module"
cp -r ${REPEATER_TARGET_DIR}/* ${HOME}/.sandbox-module  || exit_on_err 1 "permission denied, can not copy module to ~/.sandbox-module"

我们可以看到这里的过程其实就是先进行打包repeater, 然后在下载sandbox, 再将打包后的repeater的内容,复制一份到 sandbox-module目录下。这里其实是有差异的,一个是解压压缩包,一个是直接复制目录的情况。

这里如果细致的话,就会发现一个明显不一样的地方了。

通过官方的shell脚本安装以后,得到的 .sandbox-module目录下是一个repeater的目录

在这里插入图片描述

而 通过源码安装得到的其实是不一样的

在这里插入图片描述

但是官方的得到的目录进行的一个层级一个 得到的就是相同的目录了.

在这里插入图片描述

这就是问题的根因了,但是为什么多一个目录,就导致没有办法被加载呢,其实这个我们可以尝试去看下sandbox的逻辑。

ModuleLibLoader.java

private File[] listModuleJarFileInLib() {final File[] moduleJarFileArray = toModuleJarFileArray();Arrays.sort(moduleJarFileArray);logger.info("loading module-lib={}, found {} module-jar files : {}",moduleLibDir,moduleJarFileArray.length,join(moduleJarFileArray, ","));return moduleJarFileArray;
}

我们可以知道,加载module-lib成功就会有这样子的内容打印,所以其实关键就是

private File[] toModuleJarFileArray() {if (moduleLibDir.exists()&& moduleLibDir.isFile()&& moduleLibDir.canRead()&& StringUtils.endsWith(moduleLibDir.getName(), ".jar")) {return new File[]{moduleLibDir};} else {return convertFileCollectionToFileArray(listFiles(moduleLibDir, new String[]{"jar"}, false));}
}

listFiles(moduleLibDir, new String[]{"jar"}, false) 是列出对应目录下所有jar包的问题,但是关键是第三个参数是false,其实就是不递归遍历,所以它只会获取到第一层级的目录,所以这就导致了如果目录多一个repeater以后,就没有办法,加载repeater了。

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...