1. kafka
  2. 工具

本地搭建源码阅读开发构建环境示例: kafka

大家对开源项目有兴趣、想成为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

Comments to: 本地搭建源码阅读开发构建环境示例: kafka

Your email address will not be published. Required fields are marked *