+1 great initiative.
> On May 5, 2026, at 4:39 PM, Jeremiah Jordan <[email protected]> wrote: > > This looks like a great start at having parallel build tools. > > On May 4, 2026 at 2:26:54 PM, Štefan Miklošovič <[email protected] > <mailto:[email protected]>> wrote: >> A lot to chew on! I think this is a good initiative, the hardest part >> is often to actually start and I am glad that David took the lead >> here. >> >> It would be wonderful if we succeeded to release 7.0 "the new way". >> Not everything has to be converted in order to have the most critical >> Ant targets on Gradle without any delegation. Then the rest is just a >> matter of time. >> >> I understand this delegation to Ant as a step towards full Gradle >> builds without Ant under it which might hypothetically happen in few >> years, if we agree on it, it is just that this way of doing it is the >> least disruptive and brings the most functionality from Ant to Gradle >> virtually for free. >> >> On Wed, Apr 29, 2026 at 1:23 AM David Capwell <[email protected] >> <mailto:[email protected]>> wrote: >>> >>> I'd like to propose adding Gradle build support to the project. This is not >>> a proposal to remove ant -- ant remains the primary build system. The patch >>> (PR #4778) adds gradle as an opt-in developer tool that sources its >>> configuration from ant's build.xml, layering gradle's task graph and >>> caching on top of what we already have. >>> >>> **What the patch does** >>> >>> Gradle wraps ant's existing configuration. You maintain ant as before; >>> gradle reads from it. The result is a developer experience layer on top of >>> our current build: >>> >>> ``` >>> $ ./gradlew test --tests org.apache.cassandra.utils.UUIDTest --rerun >>> BUILD SUCCESSFUL in 2s >>> 27 actionable tasks: 1 executed, 26 up-to-date >>> ``` >>> >>> Compare this to the correct way to run a single test via ant that matches >>> what CI actually executes and doesn't rebuild unneeded work: >>> >>> ``` >>> $ # human validates that the cache is still valid... did you change the >>> JDK? Did any file change? Human must maintain this in their head >>> $ ant -Dant.gen-doc.skip=true \ >>> -Dno-checkstyle=true \ >>> -Dant.gen-doc.skip=true \ >>> -Drat.skip=true \ >>> -Dno-build-test=true \ >>> testclasslist \ >>> -Dtest.timeout=480000 \ >>> -Dtest.classlistprefix=unit \ >>> -Dtest.classlistfile=<(echo org/apache/cassandra/utils/UUIDTest.java) >>> ``` >>> >>> Most developers use `ant test-some` instead because of this complexity, but >>> `test-some` uses different JVM arguments than `testclasslist` (which is >>> what CI runs). This means test failures in CI may not reproduce locally >>> because the developer ran the test differently. With gradle there is one >>> way to run a test; local and CI do not have different behaviors. >>> >>> **Why Gradle and not Maven** >>> >>> This question has come up in every prior discussion, so let me address it >>> directly. >>> >>> 1. **The ecosystem already chose Gradle.** Accord, Sidecar, and Analytics >>> are all Gradle projects. Choosing Maven for the server would mean three >>> subprojects on Gradle and one on Maven. Accord integration is the clearest >>> example of the problem: today, ant works around Accord being a Gradle >>> project by having Accord *publish* artifacts to the user's local Maven >>> repository, then ant resolves them from there. Maven would have the same >>> problem -- it would also need Accord to publish locally before the server >>> build can proceed. With Gradle, there's no publish step at all. Gradle >>> understands how to build Accord directly via composite builds: >>> >>> ```groovy >>> includeBuild('modules/accord') { >>> dependencySubstitution { >>> substitute module('org.apache.cassandra:cassandra-accord') >>> using project(':accord-core') >>> } >>> } >>> ``` >>> >>> Gradle builds Accord from source as part of the server build. No >>> intermediate publish, no stale local artifacts, no coordination. >>> >>> 2. **Maven forces us into its model; Gradle lets us keep ours.** Over the >>> years with ant we've grown a number of custom solutions to problems -- >>> custom test execution, custom artifact assembly, custom dependency >>> handling. These work for us. Maven's opinionated structure (one artifact >>> per POM, standard lifecycle phases, rigid directory layout) would require >>> us to restructure the project to fit Maven's expectations. We'd be fighting >>> the tool. Gradle lets us express our existing custom workflows naturally >>> while still benefiting from a modern build system's caching, dependency >>> resolution, and task graph. >>> >>> 3. **Maven can't wrap ant.** The approach in this patch -- gradle sourcing >>> ant's config so we incrementally adopt without a big-bang rewrite -- isn't >>> possible with Maven. A Maven migration would require rewriting build >>> configuration from scratch, which is exactly the kind of disruption that >>> has killed every prior proposal on this mailing list. >>> >>> 4. **Incremental builds are first-class in Gradle.** Maven's incremental >>> story requires plugins and is unreliable in practice. Gradle's task >>> avoidance and build cache are core features. >>> >>> 5. **Gradle version stability -- an honest assessment.** The concern about >>> Gradle version churn is legitimate. We pin a specific version via the >>> wrapper (Gradle 9 in this patch), so day-to-day there is no drift. However, >>> when we do need to upgrade -- for example, to pick up JDK support for a new >>> Java version -- there is real risk of breaking changes requiring work. If >>> we release annually, we may need to update Gradle annually, and that could >>> require effort. >>> >>> Two things that mitigate this: First, Gradle has improved its >>> deprecation cycle -- they warn for a full major version before removing >>> APIs, giving upgrade windows. This patch already addressed Accord's Gradle >>> 8 to 9 migration, which involved deprecation warnings (not breakage) that >>> will become errors in 10.x. Second, AI tooling dramatically lowers the >>> migration cost. This patch itself was written by Claude opus and it had no >>> issues understanding Gradle's conventions and generating the correct >>> configuration. Future version upgrades are well-suited to the same approach >>> -- the tool reads the migration guide, reads our config, and produces the >>> update. >>> >>> **Maintenance cost** >>> >>> I want to be clear-eyed about this: "gradle sources ant" means there is >>> minimal maintenance overhead *for the current project structure*. If we had >>> this patch 5 years ago, there would have been zero drift in that time. But >>> it's not zero-maintenance in all scenarios -- if we want to do larger >>> structural changes (splitting into multiple modules, reorganizing source >>> sets), both systems would need updates. For the day-to-day reality of how >>> the project evolves, though, the cost is very low. >>> >>> **The long-term path** >>> >>> If gradle proves itself I foresee that we eventual rely on gradle as the >>> source of truth for builds and we update ant to delegate to gradle. If the >>> community eventually feels that gradle is getting in our way its isolated >>> and able to revert; so very low risk. >>> >>> **What's in this patch and what isn't** >>> >>> The patch covers the core developer loop: >>> >>> - Main source compilation with correct JDK flags and `--add-exports` >>> - Dependency resolution from existing POM files >>> - ANTLR 3 and JFlex code generation >>> - Unit, long, burn, distributed, and simulator test suites with correct >>> JDK-specific JVM args >>> - All 5 test variants (compression, cdc, latest, oa, >>> system-keyspace-directory) >>> - Checkstyle (main + test) >>> - Main JAR and simulator JARs >>> - Accord composite build (no local publish step) >>> >>> What's not covered yet: >>> >>> | Category | What's Missing | >>> |---|---| >>> | Packaging | stress.jar, fqltool.jar, sstableloader.jar, dtest-jar, >>> sources-jar, javadoc-jar | >>> | Release | bin/src tarballs, checksums, dist directory assembly | >>> | Publishing | Maven local install and remote deploy with signing | >>> | Test suites | upgrade dtests, memory tests, stress/fqltool/sstableloader >>> tests, CQL-specific tests | >>> | Code coverage | JaCoCo integration | >>> | Documentation | Javadoc, Asciidoc/Antora | >>> | Benchmarks | JMH microbench | >>> | Static analysis | Apache RAT license check | >>> | Security scanning | OWASP, SonarQube | >>> >>> This is roughly 52% of ant's total logical outcomes. The intentional >>> scoping choice was: cover what developers actually use daily, get buy-in on >>> the approach, then fill in the rest. I'm happy to add any of the above -- >>> particularly release/publishing support -- once the direction is agreed. >>> None of these are architecturally difficult; they're just additional tasks >>> to wire up. >>> >>> **Patch details** >>> >>> - JIRA: https://issues.apache.org/jira/browse/CASSANDRA-21344 >>> - PR: https://github.com/apache/cassandra/pull/4778 >>> >>> Looking forward to feedback. >>> >>> --- >>> >>> **Prior mailing list discussions referenced:** >>> >>> - "[DISCUSS] Build tool" (Feb 2022) -- Aleksei Zotov's proposal to migrate >>> from ant >>> - "RFC try for s/ant/gradle/" (Sep 2014) -- Robert Stupp's original Gradle >>> proposal and prototype >>> - "[discuss] Modernization of Cassandra build system" (Jun 2015) >>> - "[DISCUSS] CASSANDRA-17750: Security migration away from Maven Ant Tasks" >>> (Aug 2022) >>> - "Any plan to migrate from Ant to Maven?" (May 2020) >>>
