Apache Iceberg主要使用gradlew来做依赖管理,大部分的Java开发人员可能更擅长使用maven一点。对gradlew不是特别熟悉。为了相关开发人员能够快速入门Apache Iceberg内核代码,这里简单介绍一下开发iceberg的常用gradlew命令。
1. 带测试编译
git clone git@github.com:apache/iceberg.git
cd iceberg
./gradlew build
采用./gradlew build命令会自动下载对应版本的gradlew运行包,下载iceberg依赖的所有相关jar包,然后编译整个iceberg项目,最后还会把iceberg的所有单元测试和集成测试都运行一遍。
由于gradlew命令默认采用多线程运行,所以即使这部分运行的工作量非常大,但是速度还是相对较快的。
2. 不带测试编译
一般我们在做开发的时候,并不会跑所有的测试集,更多的是通过编译来验证代码的编译问题等。所以,我们需要设置命令行来跳过所有耗时的测试工作,这时可以采用如下命令:
git clone git@github.com:apache/iceberg.git
cd iceberg
./gradlew build -x test \
-x integrationTest \
-x testSpark31 \
-x spark31IntegrationTest
我来解释一下gradlew命令里面的几个选项:
- -x test :
- 表示跳过所有的单元测试;
- -x integrationTest:
- 表示跳过所有的相关集成测试;
- -x testSpark31:
- 目前iceberg对spark3的集成,同时兼容了spark3.0.1和spark3.1.1版本。默认情况下我们会同时跑spark3.0.1和spark3.1.1版本的测试。-x test排除了运行spark3.0.1的测试集,但是spark3.1.1的测试集依然会运行,且耗时比较长(可以参考社区issue: https://github.com/apache/iceberg/issues/3084)。所以,我们需要专门指定这个选项来跳过spark3.1.1版本的测试集。
- -x spark31IntegrationTest:
- 跳过对应spark3.1.1版本的集成测试,解释同上。
3. 在intellij中经常碰到relocated的guava包无法正常import ?
例如下图:
这是因为iceberg有一个专门的模块叫做iceberg-bundled-guava,用来把guava相关的class做了一个全面的shaded,避免跟下游的guava依赖版本冲突。
解决这个问题的正确思路如下:
- 在intellij中选择gradle -> iceberg-bundled-guava -> Tasks -> build ,点击这个build按钮。构建完成之后,intellij就会重新生成iceberg shaded的guava依赖包等。
如果仍然无法正确导入guava相关的依赖包,那么点击Gradle的刷新按钮,刷新整个项目。就OK了。
也可以运行如下命令来更新guava相关的shaded包:
./gradlew :iceberg-bundled-guava:build -x test
4. 只运行单各模块的单元测试
例如我只想跑flink模块的单元测试,那么应该使用如下命令:
./gradlew :iceberg-flink:test
5. 查看某个模块的依赖树
./gradlew iceberg-flink:dependencies --configuration testCompile
> Task :iceberg-flink:dependencies
定位某个依赖的具体依赖tree
./gradlew :iceberg-aliyun:dependencyInsight \
--configuration compileClasspath \
--dependency commons-codec
6.出于测试目的把iceberg包发布到本地maven仓库
./gradlew publishToMavenLocal