gradle-build
Gradle Build System in Apache Beam
Overview
Apache Beam is a mono-repo using Gradle as its build system. The entire project (Java, Python, Go, website) is managed as a single Gradle project.
Key Files
build.gradle.kts- Root build configurationsettings.gradle.kts- Project structure and module definitionsgradle.properties- Global properties and versionsbuildSrc/- Custom Gradle plugins including BeamModulePlugin
BeamModulePlugin
Located at buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy
Purpose
- Manages Java dependencies centrally
- Configures project types (Java, Python, Go, Proto, Docker, etc.)
- Defines common custom tasks
Java Project Configuration
apply plugin: 'org.apache.beam.module'
applyJavaNature(
automaticModuleName: 'org.apache.beam.sdk.io.kafka'
)
Common Commands
Build
# Build entire project
./gradlew build
# Build specific project
./gradlew :sdks:java:core:build
./gradlew -p sdks/java/core build
# Compile only (no tests)
./gradlew :sdks:java:core:compileJava
Test
# Run tests
./gradlew :sdks:java:core:test
# Run specific test
./gradlew :sdks:java:core:test --tests *MyTest
# Skip tests
./gradlew build -x test
Clean
# Clean specific project
./gradlew :sdks:java:core:clean
# Clean everything
./gradlew clean
Formatting
# Java formatting (Spotless)
./gradlew spotlessApply
# Check formatting
./gradlew spotlessCheck
# Format CHANGES.md
./gradlew formatChanges
Publishing
# Publish to Maven Local
./gradlew -Ppublishing :sdks:java:core:publishToMavenLocal
# Publish all Java artifacts
./gradlew -Ppublishing publishToMavenLocal
Pre-commit Tasks
Java
./gradlew javaPreCommit
Python
./gradlew pythonPreCommit
Combined
./gradlew :checkSetup # Validates Go, Java, Python environments
Useful Flags
| Flag | Description |
|---|---|
-p <path> |
Run task in specific project directory |
-x <task> |
Exclude task |
--tests <pattern> |
Filter tests |
-Ppublishing |
Enable publishing tasks |
-PdisableSpotlessCheck=true |
Disable formatting check |
-PdisableCheckStyle=true |
Disable checkstyle |
-PskipCheckerFramework |
Skip Checker Framework |
--continue |
Continue after failures |
--info |
Verbose output |
--debug |
Debug output |
--scan |
Generate build scan |
--parallel |
Parallel execution |
GCP-related Properties
-PgcpProject=my-project
-PgcpRegion=us-central1
-PgcpTempRoot=gs://bucket/temp
-PgcsTempRoot=gs://bucket/temp
Docker Tasks
# Build Java SDK container
./gradlew :sdks:java:container:java11:docker
# Build Python SDK container
./gradlew :sdks:python:container:py312:docker
# Build and push a container into a custom repository
./gradlew :sdks:java:container:java11:docker \
-Pdocker-repository-root=gcr.io/project \
-Pdocker-tag=custom \
-Ppush-containers
If a :docker task produces logs that contain the following:
WARNING: No output specified with docker-container driver.
Build result will only remain in the build cache.
then you must use -PuseDockerBuildx when running :docker tasks
in this environment. For example:
# Build and push a go container into a custom repository
./gradlew :sdks:go:container:docker \
-Pdocker-repository-root=gcr.io/project \
-Pdocker-tag=custom \
-Ppush-containers \
-PuseDockerBuildx
Dependency Management
View Dependencies
./gradlew :sdks:java:core:dependencies
./gradlew :sdks:java:core:dependencies --configuration runtimeClasspath
Force Dependency Version
In build.gradle:
configurations.all {
resolutionStrategy.force 'com.google.guava:guava:32.0.0-jre'
}
Troubleshooting
Clean Gradle Cache
rm -rf ~/.gradle/caches
rm -rf .gradle
rm -rf build
Common Errors
NoClassDefFoundError
- Run
./gradlew clean - Delete gradle cache
Proto-related Errors
- Regenerate protos:
./gradlew generateProtos
Dependency Conflicts
- Check dependencies:
./gradlew dependencies - Use
--scanfor detailed analysis
Useful Tasks
# List all tasks
./gradlew tasks
# List tasks for a project
./gradlew :sdks:java:core:tasks
# Show project structure
./gradlew projects
IDE Integration
IntelliJ
- Open repository root as Gradle project
- Wait for indexing
- Gradle tool window shows all tasks
VS Code
Install Gradle extension for task discovery
More from apache/beam
java-development
Guides Java SDK development in Apache Beam, including building, testing, running examples, and understanding the project structure. Use when working with Java code in sdks/java/, runners/, or examples/java/.
27python-development
Guides Python SDK development in Apache Beam, including environment setup, testing, building, and running pipelines. Use when working with Python code in sdks/python/.
25license-compliance
Ensures all new files include proper Apache 2.0 license headers. Use when creating any new file in the Apache Beam repository.
24ci-cd
Guides understanding and working with Apache Beam's CI/CD system using GitHub Actions. Use when debugging CI failures, understanding test workflows, or modifying CI configuration.
23contributing
Guides the contribution workflow for Apache Beam, including creating PRs, issue management, code review process, and release cycles. Use when contributing code, creating PRs, or understanding the contribution process.
23beam-concepts
Explains core Apache Beam programming model concepts including PCollections, PTransforms, Pipelines, and Runners. Use when learning Beam fundamentals or explaining pipeline concepts.
23