本源码来自于skywalking 8.9.1版本
本节主要讲解skywalking后端编译过程中遇到的坑,如果你不幸也遇到了,希望对你有所帮助。
注:本篇文章主要是作为自己看书后的总结,内容有可能会存在一些个人理解上的偏差,如果有网友找出问题欢迎提出,感谢!!!如果我理解上的错误误导了您,在此表示抱歉!!!
文章目录
环境:MacBook Pro (13-inch, 2017, Two Thunderbolt 3 ports)
编译步骤
这里直接抄官网的步骤 https://skywalking.apache.org/docs/main/v9.2.0/en/guides/how-to-build/
1、环境准备
准备jdk8+,maven3.6.0+版本、nodejs、vue、npm(前端版本我直接下载网上最新的可能你操作时前端版本太高也会引起问题,您可以自行查找下 skywalking9.2 版本对应的这些前端环境按照他们的版本大致不会有问题)
2、下载源码
这里提供两种方式的下载源码
方式1:
git clone --recurse-submodules https://github.com/apache/skywalking.git
cd skywalking/
方式2:
git clone https://github.com/apache/skywalking.git
cd skywalking/
git submodule init
git submodule update
3、进入根目录,执行编译脚本
./mvnw clean package -Dmaven.test.skip
4、启动
编译成功后在根目录下有个dist目录,进去可以看到一个压缩文件,解压后进入 /apache-skywalking-apm-bin/bin 目录,执行 ./startup.sh 就可以启动前后端
踩坑记录
mvnw文件存在windows换行符
问题描述
下载完skywalking后,在根目录执行 ./mvnw clean package -Dmaven.test.skip 命令出现 zsh: ./mvnw: bad interpreter: /bin/sh^M: no such file or directory 报错
处理方式
分别执行以下两条命令
sed -i ‘s/\r//’ mvnw
sed -i -e ‘s/\r$//’ mvnw
再次执行 ./mvnw clean package -Dmaven.test.skip 就可以通过了
maven-wrapper.jar 问题
问题描述
在根目录执行 ./mvnw clean package -Dmaven.test.skip 命令,出现 错误:找不到或无法加载主类 org.apache.maven.wrapper.MavenWrapperMain
处理方式
根据 maven-wrapper.properties 文件内的 maven-wrapper地址去下载对应的版本,并将jar的名字改为 maven-wrapper,也就是去除jar的版本号,放到 .mvn/wrapper 目录中
再次执行 ./mvnw clean package -Dmaven.test.skip 就可以通过了
注意:不要按照其他网上说的执行 mvn -N io.takari:maven:wrapper 下载 maven-wrapper的jar包。
未进行全部编译,直接执行后端编译导致报错
问题描述
下载完skywalking项目,未进行过全部编译,直接执行后端编译,导致出现 webapp.jar找不到的报错
处理方式
下载完skywalking源码后,必须先执行一次 ./mvnw clean package -Dmaven.test.skip 才能继续执行其他高级编译的命令。因为高级编译只是编译某个某块,但是模块内依然会依赖其他的模块,如果直接执行高级编译,那么找不到依赖模块就会报错。
npm相关错误
问题描述
执行 ./mvnw clean package -Dmaven.test.skip 时出现 npm******相关的错误,这是由于skywalking中使用到了vue。
处理方式
下载、安装node.js、vue相关的环境。我是直接下载、安装最新的版本。
skywalking-ui 获取版本问题
问题描述
如果执行(git submodule update)遇到显示 skywalking-ui 获取版本问题(fatal: Fetched in submodule path ‘skywalking-ui’, but it did not contain 0e2541e3f1c0c5bacd7da4d13a32bd2b99402b8f. Direct fetching of that commit failed.),则 可以执行如下命令可以恢复
处理方式
(1)删除子模块:
git submodule deinit -f skywalking-ui
rm -rf .git/modules/skywalking-ui
(2)重新初始化子模块:
git submodule init
git submodule update
npm 权限问题
问题描述
执行 ./mvnw clean package -Dmaven.test.skip 出现如下报错:
Running ‘npm install --registry=https://registry.npmjs.org/’ in /Users/xxx/Documents/xxx/skywalking/skywalking-ui
[INFO] npm ERR! code EACCES
[INFO] npm ERR! syscall mkdir
[INFO] npm ERR! path /Users/xxx/.npm/_cacache/content-v2/sha512/c5/80
[INFO] npm ERR! errno -13
处理方式
根据提供的错误信息 npm ERR! code EACCES 和 npm ERR! syscall mkdir,这表明在尝试创建目录时发生了权限访问错误。
这个问题通常是由以下几个原因导致的:
(1)权限不足: 您可能没有足够的权限在指定的目录下创建文件或目录。请检查您是否具有足够的权限执行该操作。
(2)缓存目录权限问题: npm 使用了缓存目录来存储下载的包和依赖项。如果缓存目录的权限设置不正确,可能会导致无法在其中创建文件或目录。
为了解决这个问题,您可以尝试以下步骤:
确认您具有在该目录下创建文件和目录的权限。您可以尝试使用管理员或超级用户权限运行命令,或者联系系统管理员以获取适当的权限。
检查缓存目录的权限设置。您可以尝试更改缓存目录的权限,使其可写入。缓存目录的默认路径可能因操作系统和 npm 版本而异,常见的路径包括:
macOS/Linux: /Users/xuenan/.npm 或 /home/xuenan/.npm
Windows: C:\Users\xuenan.npm
您可以尝试在终端或命令提示符中运行以下命令,更改缓存目录的权限(以 macOS/Linux 为例):
sudo chown -R $(whoami) /Users/xuenan/.npm
这将将缓存目录的所有权更改为当前用户,使其具有读写权限。请注意,根据实际情况修改路径和命令。
如果您使用了代理服务器,请确保代理服务器的配置正确,并且没有阻止对 https://registry.npmjs.org/ 的访问。
如果问题仍然存在,请提供更多的错误日志和相关配置信息,以便我们能够更好地帮助您解决问题。
最终确认 其实是 缓存目录权限问题 。按照上面 gpt 的回复进行处理成功通过
maven-compiler-plugin编译失败
问题描述
执行 ./mvnw clean package -Dmaven.test.skip 时出现 一些编译上的问题
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.0:compile (default-compile) on project agent-analyzer: Compilation failure: Compilation failure:
[ERROR] /Users/zxn/Documents/meitu/skywalking/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/jvm/JVMSourceDispatcher.java:[104,23] 找不到符号
[ERROR] 符号: 方法 getPhrase()
[ERROR] 位置: 类型为org.apache.skywalking.apm.network.language.agent.v3.GC的变量 gc
[ERROR] /Users/zxn/Documents/meitu/skywalking/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/jvm/JVMSourceDispatcher.java:[105,22] 找不到符号
[ERROR] 符号: 变量 NEW
[ERROR] 位置: 类 org.apache.skywalking.oap.server.analyzer.provider.jvm.JVMSourceDispatcher
[ERROR] /Users/zxn/Documents/meitu/skywalking/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/jvm/JVMSourceDispatcher.java:[108,22] 找不到符号
[ERROR] 符号: 变量 OLD
[ERROR] 位置: 类 org.apache.skywalking.oap.server.analyzer.provider.jvm.JVMSourceDispatcher
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR] mvn -rf :agent-analyzer
处理方式
未执行初始化模块和更新模块,先执行这两个命令
git submodule init
git submodule update
./startup.sh执行失败
问题描述
-
进入到 skywalking/dist/apache-skywalking-apm-bin/bin 目录,执行 ./startup.sh 命令,出现命令找不到、目录、文件找不到的问题
- command not found16:
- command not found18:
- command not found23:
- No such file or directory
- command not found25:
- No such file or directory
处理方式
比较 startup.sh 与官方的 startup.sh 大小发现不一样。使用编译器查看 startup.sh 文件的 发现它的换行符是windows格式,而官方的是Unix格式。所以将 startup.sh、oapService.sh、webappService.sh 更改为 Unix格式就可以了。
这里提供另一种更改换行符格式的方法,采用dos2unix命令(如果没安装这个命令的通过 brew install dos2unix 安装)。