Apache Iceberg主要使用gradlew来做依赖管理,大部分的Java开发人员可能更擅长使用maven一点。对gradlew不是特别熟悉。为了相关开发人员能够快速入门Apache Iceberg内核代码,这里简单介绍一下开发iceberg的常用gradlew命令。

1. 带测试编译

  1. git clone git@github.com:apache/iceberg.git
  2. cd iceberg
  3. ./gradlew build

采用./gradlew build命令会自动下载对应版本的gradlew运行包,下载iceberg依赖的所有相关jar包,然后编译整个iceberg项目,最后还会把iceberg的所有单元测试和集成测试都运行一遍。

由于gradlew命令默认采用多线程运行,所以即使这部分运行的工作量非常大,但是速度还是相对较快的。

2. 不带测试编译

一般我们在做开发的时候,并不会跑所有的测试集,更多的是通过编译来验证代码的编译问题等。所以,我们需要设置命令行来跳过所有耗时的测试工作,这时可以采用如下命令:

  1. git clone git@github.com:apache/iceberg.git
  2. cd iceberg
  3. ./gradlew build -x test \
  4. -x integrationTest \
  5. -x testSpark31 \
  6. -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 ?

例如下图:
image.png

这是因为iceberg有一个专门的模块叫做iceberg-bundled-guava,用来把guava相关的class做了一个全面的shaded,避免跟下游的guava依赖版本冲突。

解决这个问题的正确思路如下:

  • 在intellij中选择gradle -> iceberg-bundled-guava -> Tasks -> build ,点击这个build按钮。构建完成之后,intellij就会重新生成iceberg shaded的guava依赖包等。

image.png

如果仍然无法正确导入guava相关的依赖包,那么点击Gradle的刷新按钮,刷新整个项目。就OK了。

image.png

也可以运行如下命令来更新guava相关的shaded包:

  1. ./gradlew :iceberg-bundled-guava:build -x test

4. 只运行单各模块的单元测试

例如我只想跑flink模块的单元测试,那么应该使用如下命令:

  1. ./gradlew :iceberg-flink:test

5. 查看某个模块的依赖树

  1. ./gradlew iceberg-flink:dependencies --configuration testCompile
  2. > Task :iceberg-flink:dependencies

定位某个依赖的具体依赖tree

  1. ./gradlew :iceberg-aliyun:dependencyInsight \
  2. --configuration compileClasspath \
  3. --dependency commons-codec

6.出于测试目的把iceberg包发布到本地maven仓库

  1. ./gradlew publishToMavenLocal