大家对开源项目有兴趣、想成为committer,或者工作需要,会从github上获取最新的开源项目源码。本文做一个示例,怎样搭建本地的源码阅读、开发、构建环境。
首先,在github上找到项目的链接,clone到本地自己的目录中,这步略过。
下面一起看一个示例:使用idea导入kafka 2.4.1版本的源码。
一、idea打开项目后,切换到指定的分支
获取最新分支列表(如果卡很久,shell加一下自己的网络代理,翻墙一下):
git fetch –all –tags
获取2.4前缀分支列表: -n 加描述 -l <pattern> 加正则
allencheungdeMacBook-Pro:kafka allen$ git tag -n -l 2.4*
2.4.0 Apache Kafka 2.4.0 release
2.4.0-rc0 2.4.0-rc0
2.4.0-rc1 2.4.0-rc1
2.4.0-rc2 2.4.0-rc2
2.4.0-rc3 2.4.0-rc3
2.4.0-rc4 2.4.0-rc4
2.4.1 tag for 2.4.1 release
2.4.1-rc0 2.4.1-rc0
从git tag创建分支,切换为指定的版本:git checkout tags/<tag> -b <branch>
allencheungdeMacBook-Pro:kafka allen$ git checkout tags/2.4.1 -b 2.4.1-release
Updating files: 100% (3960/3960), done.
Switched to a new branch '2.4.1-release'
二、下载依赖
gradle build项目
报错1:本地默认gradle版本过高,没有MavenDeployment这个插件。
startup failed:
build file '/Users/allen/Documents/git/apache/kafka/build.gradle': 192: unable to resolve class MavenDeployment
@ line 192, column 32.
beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
为了解决gradle版本问题,项目使用gradle wrapper版本配置。调整idea使用项目的gradle,preference->Build,->Gradle->Use Gradle from,选择gradle/wrapper/gradle-wrapper.properties,重新reload。或者直接执行项目根目录的gradlew,会自动下载指定版本编译。
Deprecated Gradle features were used in this build, making it incompatible with Gradle 6.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/5.6.2/userguide/command_line_interface.html#sec:command_line_warnings
BUILD SUCCESSFUL in 3m 59s
三、本地开发
熟悉代码内容,方式推荐两种:
1、结合文档看
2、结合jira看,熟悉kafka的代码模块、开发、提交pr的流程
kafka2.8之前需要zk,所以先把本地zk起起来,入口类:core模块的kafka.Kafka
运行前读一下kafka-server-start.sh,知道它的log配置是通过命令参数的方式:
-Dlog4j.configuration=file:$base_dir/../config/log4j.properties
所以,运行时带上参数,如下图:

此外,依然报错:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
SLF4J: Failed to load class "org.slf4j.impl.StaticMDCBinder".
排查gradle脚本,compile阶段没有依赖slf4j实现库,而是在发布时从test compile拷贝这个依赖,所以可以加一下依赖到core项目的依赖配置中:
// added by allen, add slf4j logger for local dev
compile libs.slf4jlog4j
Tips: 本地一般会有各版本的kafka,这边是开发调试用的,改一下zk地址,添加一下chroot
zookeeper.connect=localhost:2181/kafka_dev
四、构建
使用命令行(README.md中有说明),或者直接在idea gradle窗口双击执行相关task。
./gradlew clean releaseTarGz -x signArchives
......
BUILD SUCCESSFUL in 1m 34s
查看输出的release包
allencheungdeMacBook-Pro:kafka allen$ ls core/build/distributions/
kafka_2.12-2.4.1-site-docs.tgz kafka_2.12-2.4.1.tgz
allencheungdeMacBook-Pro:kafka allen$ cd core/build/distributions/
allencheungdeMacBook-Pro:distributions allen$ tar tvf kafka_2.12-2.4.1.tgz
drwxr-xr-x 0 0 0 0 Feb 22 13:59 kafka_2.12-2.4.1/
-rw-r--r-- 0 0 0 32216 Feb 22 11:13 kafka_2.12-2.4.1/LICENSE
-rw-r--r-- 0 0 0 337 Feb 22 11:13 kafka_2.12-2.4.1/NOTICE
drwxr-xr-x 0 0 0 0 Feb 22 13:59 kafka_2.12-2.4.1/bin/
五、延伸
kafka code指引:https://kafka.apache.org/coding-guide.html
kafka bug jira:jira
kafka contribute:https://kafka.apache.org/contributing
apache ci: https://builds.apache.org/
kafka kip: 重大变更提议 , kafka的release note包含kip列表,举例:kafka3.0
kafka author blog: here
看看这些文章,很有趣的,例如coding guidelines

No Comments
Leave a comment Cancel