前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Skywalking的编译打包

Skywalking的编译打包

原创
作者头像
smooth00
修改2020-07-13 10:18:37
3.2K0
修改2020-07-13 10:18:37
举报
文章被收录于专栏:smooth性能之光smooth性能之光

Skywalking作为一款优秀的开源APM监控系统,对于性能监控帮助挺大,去年开始我们自己就对这个开源的系统做了些改动和本地化的开发,改完后就会涉及到编译打包,现在我们从网上找到挺多这方面的文章,但是我那时候很少能搜到,所以当时摸索过程中踩了很多坑。现在我重新整理一下这方面的思路,并且做些简化,也参考了别人的方法:

基础环境:

jdk: 1.8 maven: maven 3 git: 版本随意

IDE: intelliJ IDEA (依个人习惯,我编译打包有时候根本没用到IDE,毕竟挺占内存的)

另外不要用VPN翻墙,很多人以为翻墙会下载很快,但可能会导致编译失败。

构建项目:

本次构建的是Skywalking的master分支,对于当前来说应该相当于是 Skywalking 8.1.0 版。

1. clone代码

git clone https://github.com/apache/skywalking.git (1) 问题:clone代码失败,github在国外,连接太慢了。

解决方法:

一是配置加速器,通过改hosts文件;

代码语言:javascript
复制
# 加速器配置hosts如下
219.76.4.4 github-cloud.s3.amazonaws.com
192.30.253.112 github.com
151.101.185.194 github.global.ssl.fastly.net

方法二是自己在码云https://gitee.com/ 开一个账号,也创建个skywalking项目,同时把上面skywalking源码链接同步到你的项目中(码云上也有官网的skywalking,不过不是最新的;为什么要用同步,而不用Fork,因为同步是强制更新最新的源码,简单粗暴)。然后git时换成gitee的链接去clone代码(国内的网站很快,如我的是https://gitee.com/smooth00/skywalking)。

2. 执行git命令

可以在IntelliJ IDEA打开Terminal命令窗口并输入命令,也可以直接在cmd下或是linux系统直接输命令。

代码语言:javascript
复制
git submodule init

git submodule update

submodule update这一步非常关键,大部分错误出在这一步。以上命令就是为了获取skywalking子模块的源码,子模块包括apm-network、query-graphql-plugin、skywalking-ui、e2e-ttl-es,具体的依赖信息可查看根目录的 .gitmodules文件:

代码语言:javascript
复制
[submodule "apm-protocol/apm-network/src/main/proto"]
	path = apm-protocol/apm-network/src/main/proto
	url = https://github.com/apache/skywalking-data-collect-protocol.git
[submodule "oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol"]
	path = oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol
	url = https://github.com/apache/skywalking-query-protocol.git
[submodule "skywalking-ui"]
	path = skywalking-ui
	url = https://github.com/apache/skywalking-rocketbot-ui.git
[submodule "test/e2e/e2e-protocol/src/main/proto"]
	path = test/e2e/e2e-protocol/src/main/proto
	url = https://github.com/apache/skywalking-data-collect-protocol.git

执行git submodule update报错,或是没有任何反应都是不行的。很多时候因为网络原因,update的文件不全,我们就需要重新执行update命令,执行前,需要删除上面.gitmodules对应的path目录,重新执行命令让它重新下载。比如编译到apm-network这一步报错,往往是因为apm-protocol/apm-network/src/main/proto下的文件缺失,所以重新执行命令下载。

(当然还有个诀窍,就是手动去url链接的地址下载skywalking-data-collect-protocol的包,解压到对应path下也是可以的,这种方式可以避免因为网络而导致下载的问题)

另外一个比较容易出问题的是前端ui代码的下载(skywalking-rocketbot-ui),网速不给力嘛,要么去手动下载,要么用clone代码的方式,用加速器或是直接同步到gitee再去下载(通过更改.gitmodules文件中的url也是一种方法)。

3. 执行mvn命令

可以用安装的mvn命令,也可以用skywalking源码中自带的mvnw命令(推荐用这个):

代码语言:javascript
复制
# IDEA打开Terminal执行,或是进入到skywalking目录下执行
# linux下执行
./mvnw clean package -DskipTests
# windows下执行
mvnw clean package -DskipTests

# 第二次为了避免重复构建全部源码,可以对某个模块编译并打完整包
# 编译 agent 包
./mvnw package -Pagent,dist
# 编译 backend 包并且打完整包
./mvnw package -Pbackend,dist
# 编译 UI 忽略Tests,并且打完整包
./mvnw package -Pui,dist -DskipTests

这一步执行时间长短和网速有关系,编译全量需要20min~1h,编译一个模块2min~20min,编译到后面看到一个个的SUCCESS就表示成功了。

最后会在dist目录下生成两个安装包:

把其中一个包解开,就能看到我们所需要的安装启动文件:

常见问题处理:

1. 报maven-wrapper.jar错

第一次执行mvnw clean package -DskipTests 一般会报以下错误:

这是因为maven-wrapper.jar下载并拷贝到.mvn/wrapper下失败,把链接复制出来,手动去下载吧,下载后把maven-wrapper-x.x.x.jar文件,改名成maven-wrapper.jar,并拷贝到.mvn/wrapper目录下。

2. 提示缺少部分类

执行mvnw clean package -DskipTests失败,提示缺少部分类,例如缺少类KeyStringValuePair.java

代码语言:javascript
复制
[ERROR] /Users/terry/Gits/agent/skywalking/skywalking-github/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/command/TraceIgnoreCommand.java:[39,48] 找不到符号
[ERROR]   符号:   变量 KeyStringValuePair
[ERROR]   位置: 类 org.apache.skywalking.apm.network.trace.component.command.TraceIgnoreCommand
[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 <goals> -rf :apm-network

缺类的情况很常见,原因是因为前面提到的git submodule update没有更新到submodule,解决方法就是看报的哪个模块,比如这是报的apm-protocol/apm-network,到.gitmodules中找到对应模块源码的路径:

删除对应的目录,重新 git submodule update,或者按前面说的方法,手动去下载源码吧。

3. npm install报错:

代码语言:javascript
复制
[ERROR] Failed to execute goal com.github.eirslett:frontend-maven-plugin:1.6:
npm (npm install) on project apm-webapp: Failed to run task: 'npm install --
registry=https://registry.npmjs.org/' failed. org.apache.commons.exec.ExecuteException:
 Process exited with an error: -4048 (Exit value: -4048) -> [Help 1]

碰到这个错,很多人会想到是不是https://registry.npmjs.org/ 的问题,就想改成国内的https://registry.npm.taobao.org ,结果还是报错,其实只要这个网址是通的,就无所谓改成什么。之所以报错,就是前面提到git submodule update,这一步是UI的构建,不成功无非就是UI源码没下载好,或是node.exe没下载好,node的版本是由apm-webapp\pom.xml决定的:

代码语言:javascript
复制
                <configuration>
                    <workingDirectory>${ui.path}</workingDirectory>
                    <nodeVersion>v8.17.0</nodeVersion>
                </configuration>

最重要的一点,还不是下载的问题,而是在npm install过程中下载node_modules的插件就出错了,所以UI的构建如果总是不成功,我们也可以独立出来,通过cnpm install也是可以的,关键是要能将vue.js编译生成dist文件:

独立编译成的UI dist文件,也是可以放到apm-webapp中打包的,可以将上图dist中的文件拷贝到apm-webapp\target\classes\public下,然后修改apm-webapp\pom.xml,将npm install和build过程都注释了:

这样就实现了独立构建的skywalking-ui结果文件放到整体包中一起打包(这样就忽略了skywalking-ui在构建时,因为网络原因导致整体打包被中断)。当然你也可以什么也不改,把skywalking-ui目录删除,多构建几次,可能也会成功。或都将上面的pom.xml文件进行修改,不用npm命令,改成用cnpm命令,可能也会成功。

4. protoc调用错误

新版本好像没有这个问题,老版本在初次执行mvnw clean package -DskipTests时会报错如下:

这个错误一般在老版本,如6.6.0,第一次使用时会出现,现在我没发现有(应该已经集成了),如果出现可以按以下方式处理:

protoc-3.3.0-win32.zip protobuf-java-3.3.0.zip

  • 将protoc-3.3.0-win32中的protoc.exe拷贝到c:\windows\system32和SysWOW64中
  • 将protoc.exe文件拷贝到解压后的protobuf-3.3.0\src目录中
  • protobuf-3.3.0\java 目录下执行mvn package命令编辑该包生成protobuf-java-3.3.0.jar文件(这一步相当于安装了)

差不多就是这些了,如果遇到新的问题,应该也是可以归到以上几类(至少问题的原理是一样的)。一般我们是不推荐自己构建skywalking,毕竟官网一直在更新安装包,已经能满足大部分人的使用。

欢饮光临smooth的博客:https://smooth.blog.csdn.net/

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基础环境:
  • 构建项目:
    • 1. clone代码
      • 2. 执行git命令
        • 3. 执行mvn命令
        • 常见问题处理:
          • 1. 报maven-wrapper.jar错
            • 2. 提示缺少部分类
              • 3. npm install报错:
                • 4. protoc调用错误
                相关产品与服务
                前端性能监控
                前端性能监控(Real User Monitoring,RUM)是一站式前端监控解决方案,专注于 Web、小程序等场景监控。前端性能监控聚焦用户页面性能(页面测速,接口测速,CDN 测速等)和质量(JS 错误,Ajax 错误等),并且联动腾讯云应用性能监控实现前后端一体化监控。用户只需要安装 SDK 到自己的项目中,通过简单配置化,即可实现对用户页面质量的全方位守护,真正做到低成本使用和无侵入监控。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档