From c90fd42de141dfd975d855cfc3553d4d7e0f6d98 Mon Sep 17 00:00:00 2001 From: Lari Hotari Date: Wed, 1 Apr 2026 21:19:09 +0300 Subject: [PATCH 1/5] [improve][build] Add Maven publishing conventions for ASF release Add `pulsar.publish-conventions` Gradle convention plugin that configures maven-publish and GPG signing for all publishable modules, matching the artifact coordinates previously produced by the Maven build. The convention plugin handles: - java-library modules: JAR + sources + javadoc + POM + Gradle metadata - java-platform modules (BOM/dependencies): POM + Gradle metadata only - Shadow/shaded modules: shadow JAR as primary artifact - NAR modules: .nar as primary artifact with packaging=nar - ASF-compliant POM metadata (license, SCM, issue management, mailing lists) - GPG signing (configurable, disabled by default for local dev) - Local deploy repository for testing (build/local-deploy-repo) - Configuration cache compatible --- bouncy-castle/bc/build.gradle.kts | 1 + bouncy-castle/bcfips/build.gradle.kts | 1 + .../pulsar.publish-conventions.gradle.kts | 219 ++++++++++++++++++ gradle.properties | 3 + gradle/setup-test-gpg.sh | 64 +++++ jclouds-shaded/build.gradle.kts | 1 + .../build.gradle.kts | 1 + .../build.gradle.kts | 1 + .../build.gradle.kts | 1 + managed-ledger/build.gradle.kts | 1 + pulsar-bom/build.gradle.kts | 1 + pulsar-broker-auth-athenz/build.gradle.kts | 1 + pulsar-broker-auth-oidc/build.gradle.kts | 1 + pulsar-broker-auth-sasl/build.gradle.kts | 1 + pulsar-broker-common/build.gradle.kts | 1 + pulsar-broker/build.gradle.kts | 1 + pulsar-cli-utils/build.gradle.kts | 1 + pulsar-client-admin-api/build.gradle.kts | 1 + pulsar-client-admin-shaded/build.gradle.kts | 1 + pulsar-client-admin/build.gradle.kts | 1 + pulsar-client-all/build.gradle.kts | 1 + pulsar-client-api/build.gradle.kts | 1 + pulsar-client-auth-athenz/build.gradle.kts | 1 + pulsar-client-auth-sasl/build.gradle.kts | 1 + .../build.gradle.kts | 1 + pulsar-client-shaded/build.gradle.kts | 1 + pulsar-client-tools-api/build.gradle.kts | 1 + pulsar-client-tools/build.gradle.kts | 1 + pulsar-client/build.gradle.kts | 1 + pulsar-common/build.gradle.kts | 1 + pulsar-config-validation/build.gradle.kts | 1 + pulsar-dependencies/build.gradle.kts | 1 + pulsar-docs-tools/build.gradle.kts | 1 + pulsar-functions/api-java/build.gradle.kts | 1 + pulsar-functions/instance/build.gradle.kts | 1 + .../localrun-shaded/build.gradle.kts | 1 + pulsar-functions/localrun/build.gradle.kts | 1 + pulsar-functions/proto/build.gradle.kts | 1 + pulsar-functions/runtime/build.gradle.kts | 1 + pulsar-functions/secrets/build.gradle.kts | 1 + pulsar-functions/utils/build.gradle.kts | 1 + pulsar-functions/worker/build.gradle.kts | 1 + .../batch-data-generator/build.gradle.kts | 1 + .../build.gradle.kts | 1 + pulsar-io/common/build.gradle.kts | 1 + pulsar-io/core/build.gradle.kts | 1 + pulsar-io/data-generator/build.gradle.kts | 1 + pulsar-metadata/build.gradle.kts | 1 + pulsar-opentelemetry/build.gradle.kts | 1 + .../bookkeeper-storage/build.gradle.kts | 1 + .../core/build.gradle.kts | 1 + .../filesystem-storage/build.gradle.kts | 1 + pulsar-proxy/build.gradle.kts | 1 + pulsar-testclient/build.gradle.kts | 1 + pulsar-transaction/common/build.gradle.kts | 1 + .../coordinator/build.gradle.kts | 1 + pulsar-websocket/build.gradle.kts | 1 + structured-event-log/build.gradle.kts | 1 + testmocks/build.gradle.kts | 1 + tiered-storage/file-system/build.gradle.kts | 1 + tiered-storage/jcloud/build.gradle.kts | 1 + 61 files changed, 344 insertions(+) create mode 100644 build-logic/conventions/src/main/kotlin/pulsar.publish-conventions.gradle.kts create mode 100755 gradle/setup-test-gpg.sh diff --git a/bouncy-castle/bc/build.gradle.kts b/bouncy-castle/bc/build.gradle.kts index 973167d36af49..7f8069a4b5e9c 100644 --- a/bouncy-castle/bc/build.gradle.kts +++ b/bouncy-castle/bc/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/bouncy-castle/bcfips/build.gradle.kts b/bouncy-castle/bcfips/build.gradle.kts index ba662f2696668..7eddc6e4864e8 100644 --- a/bouncy-castle/bcfips/build.gradle.kts +++ b/bouncy-castle/bcfips/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/build-logic/conventions/src/main/kotlin/pulsar.publish-conventions.gradle.kts b/build-logic/conventions/src/main/kotlin/pulsar.publish-conventions.gradle.kts new file mode 100644 index 0000000000000..4aef297b9e8b6 --- /dev/null +++ b/build-logic/conventions/src/main/kotlin/pulsar.publish-conventions.gradle.kts @@ -0,0 +1,219 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +// Convention plugin for publishing Pulsar modules to Maven repositories. +// Configures maven-publish, GPG signing, POM metadata, sources/javadoc JARs, +// and a local deploy repository for testing. + +plugins { + `maven-publish` + signing +} + +// --- java-library projects: JAR + sources + javadoc --- +pluginManager.withPlugin("java-library") { + val sourceSets = the() + + // Match Maven's javadoc configuration: no doclint, don't fail on errors + tasks.withType().configureEach { + (options as StandardJavadocDocletOptions).apply { + addStringOption("Xdoclint:none", "-quiet") + } + isFailOnError = false + } + + val sourcesJar by tasks.registering(Jar::class) { + archiveClassifier.set("sources") + from(sourceSets["main"].allJava) + } + + val javadocJar by tasks.registering(Jar::class) { + archiveClassifier.set("javadoc") + from(tasks.named(JavaPlugin.JAVADOC_TASK_NAME)) + } + + // NAR modules disable the jar task and produce .nar files instead. + // Detect the NAR plugin and configure the publication accordingly. + val isNarModule = plugins.hasPlugin("io.github.merlimat.nar") + + if (isNarModule) { + // NAR modules: publish the .nar artifact with packaging=nar + publishing { + publications { + create("maven") { + artifact(tasks.named("nar")) + artifact(sourcesJar) + artifact(javadocJar) + // Set packaging to "nar" in POM + pom.packaging = "nar" + } + } + } + } else { + // Standard java-library modules: publish from components["java"] + publishing { + publications { + create("maven") { + from(components["java"]) + artifact(sourcesJar) + artifact(javadocJar) + + versionMapping { + usage(Usage.JAVA_RUNTIME) { + fromResolutionResult() + } + usage(Usage.JAVA_API) { + fromResolutionOf("runtimeClasspath") + } + } + } + } + } + } +} + +// --- java-platform projects (BOM, dependencies): POM-only, no JAR --- +pluginManager.withPlugin("java-platform") { + publishing { + publications { + create("maven") { + from(components["javaPlatform"]) + } + } + } +} + +// --- Common POM metadata for all publications --- +run { + // Capture values in a local scope so withXml closures don't capture the script object + // (which would break configuration cache serialization) + val projectName = project.name + val projectDescription = project.description + val archivesNameValue = the().archivesName.get() + val isPlatformProject = plugins.hasPlugin("java-platform") + val localDeployRepoDir = rootProject.layout.buildDirectory.dir("local-deploy-repo") + + publishing { + publications { + withType().configureEach { + artifactId = archivesNameValue + + pom { + name.set("Apache Pulsar :: $projectName") + description.set(projectDescription ?: "Apache Pulsar :: $projectName") + url.set("https://pulsar.apache.org") + inceptionYear.set("2017") + + licenses { + license { + name.set("The Apache License, Version 2.0") + url.set("https://www.apache.org/licenses/LICENSE-2.0.txt") + distribution.set("repo") + } + } + + organization { + name.set("Apache Software Foundation") + url.set("https://www.apache.org/") + } + + issueManagement { + system.set("GitHub Issues") + url.set("https://github.com/apache/pulsar/issues") + } + + scm { + connection.set("scm:git:https://github.com/apache/pulsar.git") + developerConnection.set("scm:git:https://github.com/apache/pulsar.git") + url.set("https://github.com/apache/pulsar") + tag.set("HEAD") + } + + mailingLists { + mailingList { + name.set("Apache Pulsar developers list") + subscribe.set("dev-subscribe@pulsar.apache.org") + unsubscribe.set("dev-unsubscribe@pulsar.apache.org") + post.set("dev@pulsar.apache.org") + archive.set("https://lists.apache.org/list.html?dev@pulsar.apache.org") + } + } + + // Clean up POM XML: remove Maven defaults and dependencyManagement + // (resolved versions are inlined via versionMapping) + withXml { + val sb = asString() + var s = sb.toString() + // compile is the Maven default — remove for cleaner POM + s = s.replace("compile", "") + // Remove dependencyManagement from non-platform POMs + // (platform POMs need it — their dependencies ARE the management section) + if (!isPlatformProject) { + s = s.replace( + Regex( + ".*?", + RegexOption.DOT_MATCHES_ALL + ), + "" + ) + } + sb.setLength(0) + sb.append(s) + // Re-format the XML + asNode() + } + } + } + } + + // Local Maven repository for testing/comparison + repositories { + maven { + name = "localDeploy" + url = uri(localDeployRepoDir) + } + } + } +} + +// --- GPG signing --- +signing { + isRequired = !version.toString().endsWith("-SNAPSHOT") + + val useGpgCmd = providers.gradleProperty("useGpgCmd").orNull?.toBoolean() ?: false + if (useGpgCmd) { + useGpgCmd() + } + + sign(publishing.publications) +} + +// Disable signing tasks when no key is configured (local dev without signing) +tasks.withType().configureEach { + enabled = providers.gradleProperty("signing.keyId").isPresent || + providers.gradleProperty("signing.gnupg.keyName").isPresent +} + +// Suppress enforced-platform validation: all java-library modules use +// enforcedPlatform(":pulsar-dependencies") for internal version alignment, +// but this should not leak to consumers. The dependencyManagement section +// is stripped from published POMs via withXml above. +tasks.withType().configureEach { + suppressedValidationErrors.add("enforced-platform") +} diff --git a/gradle.properties b/gradle.properties index 657c24b120dd5..517fbc27f408c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -22,3 +22,6 @@ org.gradle.configureondemand=true org.gradle.parallel=true org.gradle.caching=true org.gradle.jvmargs=-Xmx4g -Xss2m -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError + +# repository.apache.org does not support SHA-256/SHA-512 checksums yet +systemProp.org.gradle.internal.publish.checksums.insecure=true diff --git a/gradle/setup-test-gpg.sh b/gradle/setup-test-gpg.sh new file mode 100755 index 0000000000000..239e94b296580 --- /dev/null +++ b/gradle/setup-test-gpg.sh @@ -0,0 +1,64 @@ +#!/bin/bash +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +# Creates a temporary GPG keyring for testing artifact signing. +# Does NOT touch ~/.gnupg — uses an isolated keyring in build/tmp-gpg-home. +# +# Usage: +# source gradle/setup-test-gpg.sh +# ./gradlew publishAllPublicationsToLocalDeployRepository \ +# -PuseGpgCmd=true \ +# -Psigning.gnupg.keyName=$TEST_GPG_KEY_ID \ +# -Psigning.gnupg.homeDir=$GNUPGHOME + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")" && pwd)" +PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" + +export GNUPGHOME="$PROJECT_DIR/build/tmp-gpg-home" +mkdir -p "$GNUPGHOME" +chmod 700 "$GNUPGHOME" + +echo "Generating temporary GPG key in $GNUPGHOME ..." +gpg --homedir "$GNUPGHOME" --batch --gen-key </dev/null \ + | grep -E '^\s+[0-9A-F]+' | head -1 | awk '{print $1}') + +export TEST_GPG_KEY_ID + +echo "" +echo "GPG key created: $TEST_GPG_KEY_ID" +echo "GNUPGHOME=$GNUPGHOME" +echo "" +echo "To publish with signing:" +echo " ./gradlew publishAllPublicationsToLocalDeployRepository \\" +echo " -PuseGpgCmd=true \\" +echo " -Psigning.gnupg.keyName=$TEST_GPG_KEY_ID \\" +echo " -Psigning.gnupg.homeDir=$GNUPGHOME" diff --git a/jclouds-shaded/build.gradle.kts b/jclouds-shaded/build.gradle.kts index 597e32e6e3b0c..dd15402374824 100644 --- a/jclouds-shaded/build.gradle.kts +++ b/jclouds-shaded/build.gradle.kts @@ -20,6 +20,7 @@ plugins { id("pulsar.java-conventions") id("pulsar.shadow-conventions") + id("pulsar.publish-conventions") } // Pin guava to 32.x for jclouds compatibility — jclouds uses TypeToken from diff --git a/jetty-upgrade/bookkeeper-prometheus-metrics-provider/build.gradle.kts b/jetty-upgrade/bookkeeper-prometheus-metrics-provider/build.gradle.kts index d4cdc61638f18..761c5eab54271 100644 --- a/jetty-upgrade/bookkeeper-prometheus-metrics-provider/build.gradle.kts +++ b/jetty-upgrade/bookkeeper-prometheus-metrics-provider/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/jetty-upgrade/zookeeper-prometheus-metrics/build.gradle.kts b/jetty-upgrade/zookeeper-prometheus-metrics/build.gradle.kts index 7a3104fd20a2e..00d578b9ac929 100644 --- a/jetty-upgrade/zookeeper-prometheus-metrics/build.gradle.kts +++ b/jetty-upgrade/zookeeper-prometheus-metrics/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/jetty-upgrade/zookeeper-with-patched-admin/build.gradle.kts b/jetty-upgrade/zookeeper-with-patched-admin/build.gradle.kts index e0543e6117eae..4ab0b60e24a6e 100644 --- a/jetty-upgrade/zookeeper-with-patched-admin/build.gradle.kts +++ b/jetty-upgrade/zookeeper-with-patched-admin/build.gradle.kts @@ -20,6 +20,7 @@ plugins { id("pulsar.java-conventions") id("pulsar.shadow-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/managed-ledger/build.gradle.kts b/managed-ledger/build.gradle.kts index 83f7cef06f668..58492f40d1e7b 100644 --- a/managed-ledger/build.gradle.kts +++ b/managed-ledger/build.gradle.kts @@ -20,6 +20,7 @@ plugins { id("pulsar.java-conventions") alias(libs.plugins.lightproto) + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-bom/build.gradle.kts b/pulsar-bom/build.gradle.kts index 12ee01d6b341a..e9eacf644f4b9 100644 --- a/pulsar-bom/build.gradle.kts +++ b/pulsar-bom/build.gradle.kts @@ -23,6 +23,7 @@ plugins { `java-platform` + id("pulsar.publish-conventions") } group = "org.apache.pulsar" diff --git a/pulsar-broker-auth-athenz/build.gradle.kts b/pulsar-broker-auth-athenz/build.gradle.kts index 7438ce5202549..035994f907603 100644 --- a/pulsar-broker-auth-athenz/build.gradle.kts +++ b/pulsar-broker-auth-athenz/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-broker-auth-oidc/build.gradle.kts b/pulsar-broker-auth-oidc/build.gradle.kts index 9c324d9628fef..0d6c2c6646de7 100644 --- a/pulsar-broker-auth-oidc/build.gradle.kts +++ b/pulsar-broker-auth-oidc/build.gradle.kts @@ -20,6 +20,7 @@ plugins { id("pulsar.java-conventions") id("pulsar.test-certs-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-broker-auth-sasl/build.gradle.kts b/pulsar-broker-auth-sasl/build.gradle.kts index 794851b2a97ba..04d38312d20e7 100644 --- a/pulsar-broker-auth-sasl/build.gradle.kts +++ b/pulsar-broker-auth-sasl/build.gradle.kts @@ -20,6 +20,7 @@ plugins { id("pulsar.java-conventions") id("pulsar.test-certs-conventions") + id("pulsar.publish-conventions") } // Each test class gets its own JVM fork because AuthenticationSasl has static JAAS state diff --git a/pulsar-broker-common/build.gradle.kts b/pulsar-broker-common/build.gradle.kts index 9fee76bc0f0d0..5e1f07549139a 100644 --- a/pulsar-broker-common/build.gradle.kts +++ b/pulsar-broker-common/build.gradle.kts @@ -20,6 +20,7 @@ plugins { id("pulsar.java-conventions") id("pulsar.test-certs-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-broker/build.gradle.kts b/pulsar-broker/build.gradle.kts index 94d0f9697f162..b351074f32d4e 100644 --- a/pulsar-broker/build.gradle.kts +++ b/pulsar-broker/build.gradle.kts @@ -22,6 +22,7 @@ plugins { id("pulsar.test-certs-conventions") alias(libs.plugins.protobuf) alias(libs.plugins.lightproto) + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-cli-utils/build.gradle.kts b/pulsar-cli-utils/build.gradle.kts index 74d5aa1babb1c..7a2cd0a6396e7 100644 --- a/pulsar-cli-utils/build.gradle.kts +++ b/pulsar-cli-utils/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-client-admin-api/build.gradle.kts b/pulsar-client-admin-api/build.gradle.kts index bb17ceff64086..ce7924ff9c8ca 100644 --- a/pulsar-client-admin-api/build.gradle.kts +++ b/pulsar-client-admin-api/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-client-admin-shaded/build.gradle.kts b/pulsar-client-admin-shaded/build.gradle.kts index c4d8b9edbc8dd..1beaa44b6a162 100644 --- a/pulsar-client-admin-shaded/build.gradle.kts +++ b/pulsar-client-admin-shaded/build.gradle.kts @@ -20,6 +20,7 @@ plugins { id("pulsar.java-conventions") id("pulsar.client-shade-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-client-admin/build.gradle.kts b/pulsar-client-admin/build.gradle.kts index 89a71c9a26d68..7ff0a72a50b35 100644 --- a/pulsar-client-admin/build.gradle.kts +++ b/pulsar-client-admin/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-client-all/build.gradle.kts b/pulsar-client-all/build.gradle.kts index f661d5f3b6ac7..aec5625d5503a 100644 --- a/pulsar-client-all/build.gradle.kts +++ b/pulsar-client-all/build.gradle.kts @@ -20,6 +20,7 @@ plugins { id("pulsar.java-conventions") id("pulsar.client-shade-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-client-api/build.gradle.kts b/pulsar-client-api/build.gradle.kts index fa77751849180..97648488e8e21 100644 --- a/pulsar-client-api/build.gradle.kts +++ b/pulsar-client-api/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-client-auth-athenz/build.gradle.kts b/pulsar-client-auth-athenz/build.gradle.kts index 7f8b24b3e2567..cd0266102532a 100644 --- a/pulsar-client-auth-athenz/build.gradle.kts +++ b/pulsar-client-auth-athenz/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-client-auth-sasl/build.gradle.kts b/pulsar-client-auth-sasl/build.gradle.kts index a70a9bec66eb0..09676984cf8be 100644 --- a/pulsar-client-auth-sasl/build.gradle.kts +++ b/pulsar-client-auth-sasl/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-client-messagecrypto-bc/build.gradle.kts b/pulsar-client-messagecrypto-bc/build.gradle.kts index 2cc7efd4005fb..d901c7c295210 100644 --- a/pulsar-client-messagecrypto-bc/build.gradle.kts +++ b/pulsar-client-messagecrypto-bc/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-client-shaded/build.gradle.kts b/pulsar-client-shaded/build.gradle.kts index afb04c0aab4d4..a0e41be7467b2 100644 --- a/pulsar-client-shaded/build.gradle.kts +++ b/pulsar-client-shaded/build.gradle.kts @@ -20,6 +20,7 @@ plugins { id("pulsar.java-conventions") id("pulsar.client-shade-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-client-tools-api/build.gradle.kts b/pulsar-client-tools-api/build.gradle.kts index acb84f991a85c..0548aaf5fcc57 100644 --- a/pulsar-client-tools-api/build.gradle.kts +++ b/pulsar-client-tools-api/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-client-tools/build.gradle.kts b/pulsar-client-tools/build.gradle.kts index d22156476a14d..3011b3d384e16 100644 --- a/pulsar-client-tools/build.gradle.kts +++ b/pulsar-client-tools/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-client/build.gradle.kts b/pulsar-client/build.gradle.kts index 6dd1566ad8bb3..973106bd0a1b0 100644 --- a/pulsar-client/build.gradle.kts +++ b/pulsar-client/build.gradle.kts @@ -20,6 +20,7 @@ plugins { id("pulsar.java-conventions") alias(libs.plugins.protobuf) + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-common/build.gradle.kts b/pulsar-common/build.gradle.kts index 706814968f4d4..4d5bddca1ab6e 100644 --- a/pulsar-common/build.gradle.kts +++ b/pulsar-common/build.gradle.kts @@ -26,6 +26,7 @@ plugins { id("pulsar.java-conventions") id("pulsar.test-certs-conventions") alias(libs.plugins.lightproto) + id("pulsar.publish-conventions") } val generatePulsarVersion by tasks.registering { diff --git a/pulsar-config-validation/build.gradle.kts b/pulsar-config-validation/build.gradle.kts index 75c8c25913f87..469134496c753 100644 --- a/pulsar-config-validation/build.gradle.kts +++ b/pulsar-config-validation/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-dependencies/build.gradle.kts b/pulsar-dependencies/build.gradle.kts index f6af10303f481..218dd10d2ba47 100644 --- a/pulsar-dependencies/build.gradle.kts +++ b/pulsar-dependencies/build.gradle.kts @@ -22,6 +22,7 @@ // All subprojects consume this via: implementation(enforcedPlatform(project(":pulsar-dependencies"))) plugins { `java-platform` + id("pulsar.publish-conventions") } group = "org.apache.pulsar" diff --git a/pulsar-docs-tools/build.gradle.kts b/pulsar-docs-tools/build.gradle.kts index 85195ae40cf18..1ec528a1cae89 100644 --- a/pulsar-docs-tools/build.gradle.kts +++ b/pulsar-docs-tools/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-functions/api-java/build.gradle.kts b/pulsar-functions/api-java/build.gradle.kts index 03f70ca6749b6..b32db3d6d66b0 100644 --- a/pulsar-functions/api-java/build.gradle.kts +++ b/pulsar-functions/api-java/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-functions/instance/build.gradle.kts b/pulsar-functions/instance/build.gradle.kts index 18e150a702bb4..82537cf27ad51 100644 --- a/pulsar-functions/instance/build.gradle.kts +++ b/pulsar-functions/instance/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-functions/localrun-shaded/build.gradle.kts b/pulsar-functions/localrun-shaded/build.gradle.kts index 963da1354566d..407a00ee7b695 100644 --- a/pulsar-functions/localrun-shaded/build.gradle.kts +++ b/pulsar-functions/localrun-shaded/build.gradle.kts @@ -20,6 +20,7 @@ plugins { id("pulsar.java-conventions") id("pulsar.shadow-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-functions/localrun/build.gradle.kts b/pulsar-functions/localrun/build.gradle.kts index 79657ce50c1d7..38357fa670543 100644 --- a/pulsar-functions/localrun/build.gradle.kts +++ b/pulsar-functions/localrun/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-functions/proto/build.gradle.kts b/pulsar-functions/proto/build.gradle.kts index c1a8a0a5d01d4..7694494c62eb9 100644 --- a/pulsar-functions/proto/build.gradle.kts +++ b/pulsar-functions/proto/build.gradle.kts @@ -20,6 +20,7 @@ plugins { id("pulsar.java-conventions") alias(libs.plugins.lightproto) + id("pulsar.publish-conventions") } // Suppress warnings in LightProto generated code diff --git a/pulsar-functions/runtime/build.gradle.kts b/pulsar-functions/runtime/build.gradle.kts index 81d303fe3f838..ad6e11c65d196 100644 --- a/pulsar-functions/runtime/build.gradle.kts +++ b/pulsar-functions/runtime/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } // Include parent module's test resources (YAML config files used by WorkerApiV2ResourceConfigTest) diff --git a/pulsar-functions/secrets/build.gradle.kts b/pulsar-functions/secrets/build.gradle.kts index 41c15e9d968de..fc55125967a48 100644 --- a/pulsar-functions/secrets/build.gradle.kts +++ b/pulsar-functions/secrets/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-functions/utils/build.gradle.kts b/pulsar-functions/utils/build.gradle.kts index 878d474b8c8c1..ccbd6fefe32d5 100644 --- a/pulsar-functions/utils/build.gradle.kts +++ b/pulsar-functions/utils/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-functions/worker/build.gradle.kts b/pulsar-functions/worker/build.gradle.kts index 2a387fa3ccdb3..96fc8d0d4c60a 100644 --- a/pulsar-functions/worker/build.gradle.kts +++ b/pulsar-functions/worker/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } // Include parent module's test resources (YAML config files) diff --git a/pulsar-io/batch-data-generator/build.gradle.kts b/pulsar-io/batch-data-generator/build.gradle.kts index 86d22762fb381..e1167297c55f7 100644 --- a/pulsar-io/batch-data-generator/build.gradle.kts +++ b/pulsar-io/batch-data-generator/build.gradle.kts @@ -20,6 +20,7 @@ plugins { id("pulsar.java-conventions") id("pulsar.nar-conventions") + id("pulsar.publish-conventions") } dependencies { implementation(project(":pulsar-io:pulsar-io-core")) diff --git a/pulsar-io/batch-discovery-triggerers/build.gradle.kts b/pulsar-io/batch-discovery-triggerers/build.gradle.kts index 9db6850d4109a..744a2bfe0b607 100644 --- a/pulsar-io/batch-discovery-triggerers/build.gradle.kts +++ b/pulsar-io/batch-discovery-triggerers/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-io/common/build.gradle.kts b/pulsar-io/common/build.gradle.kts index eb7d0298ae139..69de4e6f9f839 100644 --- a/pulsar-io/common/build.gradle.kts +++ b/pulsar-io/common/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-io/core/build.gradle.kts b/pulsar-io/core/build.gradle.kts index ef3d69c68c72e..6531bf3d09202 100644 --- a/pulsar-io/core/build.gradle.kts +++ b/pulsar-io/core/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-io/data-generator/build.gradle.kts b/pulsar-io/data-generator/build.gradle.kts index ad629d02c12ce..585ac3926e327 100644 --- a/pulsar-io/data-generator/build.gradle.kts +++ b/pulsar-io/data-generator/build.gradle.kts @@ -20,6 +20,7 @@ plugins { id("pulsar.java-conventions") id("pulsar.nar-conventions") + id("pulsar.publish-conventions") } dependencies { implementation(project(":pulsar-io:pulsar-io-core")) diff --git a/pulsar-metadata/build.gradle.kts b/pulsar-metadata/build.gradle.kts index 5e5ec2bada4c5..9714aee69e8a6 100644 --- a/pulsar-metadata/build.gradle.kts +++ b/pulsar-metadata/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-opentelemetry/build.gradle.kts b/pulsar-opentelemetry/build.gradle.kts index d5f1484db1bdb..50eada3af6453 100644 --- a/pulsar-opentelemetry/build.gradle.kts +++ b/pulsar-opentelemetry/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-package-management/bookkeeper-storage/build.gradle.kts b/pulsar-package-management/bookkeeper-storage/build.gradle.kts index 7259549bb66ca..4c306a2f1d653 100644 --- a/pulsar-package-management/bookkeeper-storage/build.gradle.kts +++ b/pulsar-package-management/bookkeeper-storage/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-package-management/core/build.gradle.kts b/pulsar-package-management/core/build.gradle.kts index f6ef9d6783ceb..0fd16e379726b 100644 --- a/pulsar-package-management/core/build.gradle.kts +++ b/pulsar-package-management/core/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-package-management/filesystem-storage/build.gradle.kts b/pulsar-package-management/filesystem-storage/build.gradle.kts index 426b69e5cf8d6..316808c88a7e1 100644 --- a/pulsar-package-management/filesystem-storage/build.gradle.kts +++ b/pulsar-package-management/filesystem-storage/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-proxy/build.gradle.kts b/pulsar-proxy/build.gradle.kts index 0d15fdff6bffe..d2f01c0ea02a2 100644 --- a/pulsar-proxy/build.gradle.kts +++ b/pulsar-proxy/build.gradle.kts @@ -20,6 +20,7 @@ plugins { id("pulsar.java-conventions") id("pulsar.test-certs-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-testclient/build.gradle.kts b/pulsar-testclient/build.gradle.kts index 4ccf89f03004f..3aabb3f10c48a 100644 --- a/pulsar-testclient/build.gradle.kts +++ b/pulsar-testclient/build.gradle.kts @@ -20,6 +20,7 @@ plugins { id("pulsar.java-conventions") id("pulsar.test-certs-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-transaction/common/build.gradle.kts b/pulsar-transaction/common/build.gradle.kts index 6b804f410972d..a08672cc07e0c 100644 --- a/pulsar-transaction/common/build.gradle.kts +++ b/pulsar-transaction/common/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } // pulsar-transaction-common has no internal Pulsar dependencies diff --git a/pulsar-transaction/coordinator/build.gradle.kts b/pulsar-transaction/coordinator/build.gradle.kts index 90c1e41505f6e..61792608d2a40 100644 --- a/pulsar-transaction/coordinator/build.gradle.kts +++ b/pulsar-transaction/coordinator/build.gradle.kts @@ -20,6 +20,7 @@ plugins { id("pulsar.java-conventions") alias(libs.plugins.lightproto) + id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-websocket/build.gradle.kts b/pulsar-websocket/build.gradle.kts index f926f6548ae7b..d0b455df9a7ad 100644 --- a/pulsar-websocket/build.gradle.kts +++ b/pulsar-websocket/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/structured-event-log/build.gradle.kts b/structured-event-log/build.gradle.kts index d5646e34e2bb5..d27bf07027081 100644 --- a/structured-event-log/build.gradle.kts +++ b/structured-event-log/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/testmocks/build.gradle.kts b/testmocks/build.gradle.kts index 74d8027753e40..d2a1990453b16 100644 --- a/testmocks/build.gradle.kts +++ b/testmocks/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("pulsar.java-conventions") + id("pulsar.publish-conventions") } dependencies { diff --git a/tiered-storage/file-system/build.gradle.kts b/tiered-storage/file-system/build.gradle.kts index 83558e1ae4d35..b33e26d2efed8 100644 --- a/tiered-storage/file-system/build.gradle.kts +++ b/tiered-storage/file-system/build.gradle.kts @@ -20,6 +20,7 @@ plugins { id("pulsar.java-conventions") id("pulsar.nar-conventions") + id("pulsar.publish-conventions") } // Force Jetty 9 for this module. Hadoop MiniDFSCluster requires Jetty 9 classes diff --git a/tiered-storage/jcloud/build.gradle.kts b/tiered-storage/jcloud/build.gradle.kts index 40eef5d5cddeb..b4ff41f546e68 100644 --- a/tiered-storage/jcloud/build.gradle.kts +++ b/tiered-storage/jcloud/build.gradle.kts @@ -20,6 +20,7 @@ plugins { id("pulsar.java-conventions") id("pulsar.nar-conventions") + id("pulsar.publish-conventions") } dependencies { compileOnly(project(":managed-ledger")) From a7b0b342bd8081dc44332def40e16856c43fdac9 Mon Sep 17 00:00:00 2001 From: Lari Hotari Date: Thu, 2 Apr 2026 20:17:26 +0300 Subject: [PATCH 2/5] [improve][build] Publish parent POM and move group/version to gradle.properties - Publish root project as parent POM (org.apache.pulsar:pulsar) with all shared ASF metadata (license, SCM, organization, mailing lists, developers, issue management) - Child module POMs now reference the parent via element, inheriting metadata instead of embedding it in every POM - Move group and version from version catalog / java-conventions to gradle.properties (standard Gradle pattern for project coordinates) - Remove pulsar version from libs.versions.toml --- .../kotlin/pulsar.java-conventions.gradle.kts | 3 - .../pulsar.publish-conventions.gradle.kts | 61 +++++-------- build.gradle.kts | 89 ++++++++++++++++++- docker/pulsar/build.gradle.kts | 4 - gradle.properties | 3 + gradle/libs.versions.toml | 2 - pulsar-bom/build.gradle.kts | 3 - pulsar-dependencies/build.gradle.kts | 3 - .../java-test-image/build.gradle.kts | 4 - .../latest-version-image/build.gradle.kts | 4 - 10 files changed, 110 insertions(+), 66 deletions(-) diff --git a/build-logic/conventions/src/main/kotlin/pulsar.java-conventions.gradle.kts b/build-logic/conventions/src/main/kotlin/pulsar.java-conventions.gradle.kts index daf10c9009858..54f81a983fb25 100644 --- a/build-logic/conventions/src/main/kotlin/pulsar.java-conventions.gradle.kts +++ b/build-logic/conventions/src/main/kotlin/pulsar.java-conventions.gradle.kts @@ -24,9 +24,6 @@ plugins { val catalog = the().named("libs") -group = "org.apache.pulsar" -version = catalog.findVersion("pulsar").get().requiredVersion - tasks.withType().configureEach { options.encoding = "UTF-8" options.release.set(17) diff --git a/build-logic/conventions/src/main/kotlin/pulsar.publish-conventions.gradle.kts b/build-logic/conventions/src/main/kotlin/pulsar.publish-conventions.gradle.kts index 4aef297b9e8b6..97756316b7383 100644 --- a/build-logic/conventions/src/main/kotlin/pulsar.publish-conventions.gradle.kts +++ b/build-logic/conventions/src/main/kotlin/pulsar.publish-conventions.gradle.kts @@ -99,7 +99,7 @@ pluginManager.withPlugin("java-platform") { } } -// --- Common POM metadata for all publications --- +// --- Common POM configuration for all publications --- run { // Capture values in a local scope so withXml closures don't capture the script object // (which would break configuration cache serialization) @@ -107,6 +107,8 @@ run { val projectDescription = project.description val archivesNameValue = the().archivesName.get() val isPlatformProject = plugins.hasPlugin("java-platform") + val isRootProject = project == rootProject + val pulsarVersion = version.toString() val localDeployRepoDir = rootProject.layout.buildDirectory.dir("local-deploy-repo") publishing { @@ -115,48 +117,13 @@ run { artifactId = archivesNameValue pom { - name.set("Apache Pulsar :: $projectName") - description.set(projectDescription ?: "Apache Pulsar :: $projectName") - url.set("https://pulsar.apache.org") - inceptionYear.set("2017") - - licenses { - license { - name.set("The Apache License, Version 2.0") - url.set("https://www.apache.org/licenses/LICENSE-2.0.txt") - distribution.set("repo") - } - } - - organization { - name.set("Apache Software Foundation") - url.set("https://www.apache.org/") - } - - issueManagement { - system.set("GitHub Issues") - url.set("https://github.com/apache/pulsar/issues") - } - - scm { - connection.set("scm:git:https://github.com/apache/pulsar.git") - developerConnection.set("scm:git:https://github.com/apache/pulsar.git") - url.set("https://github.com/apache/pulsar") - tag.set("HEAD") + // Per-module name and description + if (!isRootProject) { + name.set("Apache Pulsar :: $projectName") + description.set(projectDescription ?: "Apache Pulsar :: $projectName") } - mailingLists { - mailingList { - name.set("Apache Pulsar developers list") - subscribe.set("dev-subscribe@pulsar.apache.org") - unsubscribe.set("dev-unsubscribe@pulsar.apache.org") - post.set("dev@pulsar.apache.org") - archive.set("https://lists.apache.org/list.html?dev@pulsar.apache.org") - } - } - - // Clean up POM XML: remove Maven defaults and dependencyManagement - // (resolved versions are inlined via versionMapping) + // Clean up POM XML and inject reference withXml { val sb = asString() var s = sb.toString() @@ -173,6 +140,18 @@ run { "" ) } + // Inject reference for child modules (not the root/parent POM itself). + // Metadata (license, SCM, etc.) is inherited from the parent POM. + if (!isRootProject) { + s = s.replace( + "4.0.0", + "4.0.0\n \n" + + " org.apache.pulsar\n" + + " pulsar\n" + + " $pulsarVersion\n" + + " " + ) + } sb.setLength(0) sb.append(s) // Re-format the XML diff --git a/build.gradle.kts b/build.gradle.kts index 8b4e2cc1f4451..7b353a69d96d0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -27,6 +27,8 @@ plugins { alias(libs.plugins.crlf) apply false alias(libs.plugins.idea.ext) alias(libs.plugins.spotless) apply false // workaround for https://github.com/diffplug/spotless/issues/2877 + `maven-publish` + signing } versionCatalogUpdate { @@ -46,8 +48,7 @@ tasks.named(" } } -val catalog = the().named("libs") -val pulsarVersion = catalog.findVersion("pulsar").get().requiredVersion +val pulsarVersion = version.toString() // ── Apache RAT (Release Audit Tool) ───────────────────────────────────────── tasks.named("rat").configure { @@ -97,4 +98,88 @@ tasks.register("docker") { description = "Build the Pulsar Docker image" group = "docker" dependsOn(":docker:pulsar-docker-image:dockerBuild") +} + +// ── Parent POM publication ────────────────────────────────────────────────── +// Publishes org.apache.pulsar:pulsar as a POM-only parent artifact. +// Child modules reference this via in their POMs, inheriting +// shared ASF metadata (license, SCM, organization, etc.). +publishing { + publications { + create("maven") { + pom { + packaging = "pom" + name.set("Apache Pulsar") + description.set( + "Pulsar is a distributed pub-sub messaging platform with a very " + + "flexible messaging model and an intuitive client API." + ) + url.set("https://pulsar.apache.org") + inceptionYear.set("2017") + + licenses { + license { + name.set("The Apache License, Version 2.0") + url.set("https://www.apache.org/licenses/LICENSE-2.0.txt") + distribution.set("repo") + } + } + + organization { + name.set("Apache Software Foundation") + url.set("https://www.apache.org/") + } + + issueManagement { + system.set("GitHub Issues") + url.set("https://github.com/apache/pulsar/issues") + } + + scm { + connection.set("scm:git:https://github.com/apache/pulsar.git") + developerConnection.set("scm:git:https://github.com/apache/pulsar.git") + url.set("https://github.com/apache/pulsar") + tag.set("HEAD") + } + + mailingLists { + mailingList { + name.set("Apache Pulsar developers list") + subscribe.set("dev-subscribe@pulsar.apache.org") + unsubscribe.set("dev-unsubscribe@pulsar.apache.org") + post.set("dev@pulsar.apache.org") + archive.set("https://lists.apache.org/list.html?dev@pulsar.apache.org") + } + } + + developers { + developer { + organization.set("Apache Pulsar developers") + organizationUrl.set("https://pulsar.apache.org/") + } + } + } + } + } + + repositories { + maven { + name = "localDeploy" + url = uri(layout.buildDirectory.dir("local-deploy-repo")) + } + } +} + +signing { + isRequired = !pulsarVersion.endsWith("-SNAPSHOT") + val useGpgCmd = providers.gradleProperty("useGpgCmd").orNull?.toBoolean() ?: false + if (useGpgCmd) { + useGpgCmd() + } + sign(publishing.publications) +} + +tasks.withType().configureEach { + enabled = providers.gradleProperty("signing.keyId").isPresent || + providers.gradleProperty("signing.gnupg.keyName").isPresent } \ No newline at end of file diff --git a/docker/pulsar/build.gradle.kts b/docker/pulsar/build.gradle.kts index a43eea374a707..7aa16772cd59c 100644 --- a/docker/pulsar/build.gradle.kts +++ b/docker/pulsar/build.gradle.kts @@ -17,10 +17,6 @@ * under the License. */ -group = "org.apache.pulsar" -version = the().named("libs").findVersion("pulsar").get().requiredVersion - - val pulsarVersion = project.version.toString() val dockerOrganization = providers.gradleProperty("docker.organization").getOrElse("apachepulsar") val dockerImage = providers.gradleProperty("docker.image").getOrElse("pulsar") diff --git a/gradle.properties b/gradle.properties index 517fbc27f408c..e4b25fe9b5dfb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,6 +17,9 @@ # under the License. # +group=org.apache.pulsar +version=4.3.0-SNAPSHOT + org.gradle.configuration-cache=true org.gradle.configureondemand=true org.gradle.parallel=true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d75fa3a73b76a..2244e3896bd1d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -17,8 +17,6 @@ # under the License. # [versions] -# Core -pulsar = "4.3.0-SNAPSHOT" # Docker docker-jdk = "21" pulsar-client-python = "3.10.0" diff --git a/pulsar-bom/build.gradle.kts b/pulsar-bom/build.gradle.kts index e9eacf644f4b9..317ddfa451289 100644 --- a/pulsar-bom/build.gradle.kts +++ b/pulsar-bom/build.gradle.kts @@ -26,9 +26,6 @@ plugins { id("pulsar.publish-conventions") } -group = "org.apache.pulsar" -version = the().named("libs").findVersion("pulsar").get().requiredVersion - // Allow the platform to depend on other projects javaPlatform { allowDependencies() diff --git a/pulsar-dependencies/build.gradle.kts b/pulsar-dependencies/build.gradle.kts index 218dd10d2ba47..8e82c7773103a 100644 --- a/pulsar-dependencies/build.gradle.kts +++ b/pulsar-dependencies/build.gradle.kts @@ -25,9 +25,6 @@ plugins { id("pulsar.publish-conventions") } -group = "org.apache.pulsar" -version = the().named("libs").findVersion("pulsar").get().requiredVersion - // Allow declaring constraints on dependencies that also appear as direct dependencies javaPlatform { allowDependencies() diff --git a/tests/docker-images/java-test-image/build.gradle.kts b/tests/docker-images/java-test-image/build.gradle.kts index 744878667ca63..5b2108a0db253 100644 --- a/tests/docker-images/java-test-image/build.gradle.kts +++ b/tests/docker-images/java-test-image/build.gradle.kts @@ -17,10 +17,6 @@ * under the License. */ -group = "org.apache.pulsar" -version = the().named("libs").findVersion("pulsar").get().requiredVersion - - val pulsarVersion = project.version.toString() val dockerOrganization = providers.gradleProperty("docker.organization").getOrElse("apachepulsar") val dockerTag = providers.gradleProperty("docker.tag").getOrElse("latest") diff --git a/tests/docker-images/latest-version-image/build.gradle.kts b/tests/docker-images/latest-version-image/build.gradle.kts index 4d7c14cc2124b..2a22bbcc47544 100644 --- a/tests/docker-images/latest-version-image/build.gradle.kts +++ b/tests/docker-images/latest-version-image/build.gradle.kts @@ -17,10 +17,6 @@ * under the License. */ -group = "org.apache.pulsar" -version = the().named("libs").findVersion("pulsar").get().requiredVersion - - val pulsarVersion = project.version.toString() val dockerOrganization = providers.gradleProperty("docker.organization").getOrElse("apachepulsar") val dockerTag = providers.gradleProperty("docker.tag").getOrElse("latest") From a0b10983e61db9cdd28d9858e27108160473e363 Mon Sep 17 00:00:00 2001 From: Lari Hotari Date: Wed, 8 Apr 2026 18:00:07 +0300 Subject: [PATCH 3/5] [improve][build] Add public-java-library-conventions combining java + publish Add `pulsar.public-java-library-conventions` plugin that combines `pulsar.java-conventions` and `pulsar.publish-conventions` into a single plugin for published Java library modules. This establishes a clear convention boundary: modules using this plugin are public libraries published to Maven repositories, while internal-only modules use just `pulsar.java-conventions`. Also fix NAR module detection to use deferred `pluginManager.withPlugin` instead of eager `plugins.hasPlugin`, ensuring correct behavior regardless of plugin application order. --- bouncy-castle/bc/build.gradle.kts | 3 +- bouncy-castle/bcfips/build.gradle.kts | 3 +- ...public-java-library-conventions.gradle.kts | 27 ++++++++++ .../pulsar.publish-conventions.gradle.kts | 51 +++++++++---------- jclouds-shaded/build.gradle.kts | 3 +- .../build.gradle.kts | 3 +- .../build.gradle.kts | 3 +- .../build.gradle.kts | 3 +- managed-ledger/build.gradle.kts | 3 +- pulsar-broker-auth-athenz/build.gradle.kts | 3 +- pulsar-broker-auth-oidc/build.gradle.kts | 3 +- pulsar-broker-auth-sasl/build.gradle.kts | 3 +- pulsar-broker-common/build.gradle.kts | 3 +- pulsar-broker/build.gradle.kts | 3 +- pulsar-cli-utils/build.gradle.kts | 3 +- pulsar-client-admin-api/build.gradle.kts | 3 +- pulsar-client-admin-shaded/build.gradle.kts | 3 +- pulsar-client-admin/build.gradle.kts | 3 +- pulsar-client-all/build.gradle.kts | 3 +- pulsar-client-api/build.gradle.kts | 3 +- pulsar-client-auth-athenz/build.gradle.kts | 3 +- pulsar-client-auth-sasl/build.gradle.kts | 3 +- .../build.gradle.kts | 3 +- pulsar-client-shaded/build.gradle.kts | 3 +- pulsar-client-tools-api/build.gradle.kts | 3 +- pulsar-client-tools/build.gradle.kts | 3 +- pulsar-client/build.gradle.kts | 3 +- pulsar-common/build.gradle.kts | 3 +- pulsar-config-validation/build.gradle.kts | 3 +- pulsar-docs-tools/build.gradle.kts | 3 +- pulsar-functions/api-java/build.gradle.kts | 3 +- pulsar-functions/instance/build.gradle.kts | 3 +- .../localrun-shaded/build.gradle.kts | 3 +- pulsar-functions/localrun/build.gradle.kts | 3 +- pulsar-functions/proto/build.gradle.kts | 3 +- pulsar-functions/runtime/build.gradle.kts | 3 +- pulsar-functions/secrets/build.gradle.kts | 3 +- pulsar-functions/utils/build.gradle.kts | 3 +- pulsar-functions/worker/build.gradle.kts | 3 +- .../batch-data-generator/build.gradle.kts | 3 +- .../build.gradle.kts | 3 +- pulsar-io/common/build.gradle.kts | 3 +- pulsar-io/core/build.gradle.kts | 3 +- pulsar-io/data-generator/build.gradle.kts | 3 +- pulsar-metadata/build.gradle.kts | 3 +- pulsar-opentelemetry/build.gradle.kts | 3 +- .../bookkeeper-storage/build.gradle.kts | 3 +- .../core/build.gradle.kts | 3 +- .../filesystem-storage/build.gradle.kts | 3 +- pulsar-proxy/build.gradle.kts | 3 +- pulsar-testclient/build.gradle.kts | 3 +- pulsar-transaction/common/build.gradle.kts | 3 +- .../coordinator/build.gradle.kts | 3 +- pulsar-websocket/build.gradle.kts | 3 +- structured-event-log/build.gradle.kts | 3 +- testmocks/build.gradle.kts | 3 +- tiered-storage/file-system/build.gradle.kts | 3 +- tiered-storage/jcloud/build.gradle.kts | 3 +- 58 files changed, 108 insertions(+), 138 deletions(-) create mode 100644 build-logic/conventions/src/main/kotlin/pulsar.public-java-library-conventions.gradle.kts diff --git a/bouncy-castle/bc/build.gradle.kts b/bouncy-castle/bc/build.gradle.kts index 7f8069a4b5e9c..517da4a5c54a8 100644 --- a/bouncy-castle/bc/build.gradle.kts +++ b/bouncy-castle/bc/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/bouncy-castle/bcfips/build.gradle.kts b/bouncy-castle/bcfips/build.gradle.kts index 7eddc6e4864e8..3a2566d1c8a44 100644 --- a/bouncy-castle/bcfips/build.gradle.kts +++ b/bouncy-castle/bcfips/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/build-logic/conventions/src/main/kotlin/pulsar.public-java-library-conventions.gradle.kts b/build-logic/conventions/src/main/kotlin/pulsar.public-java-library-conventions.gradle.kts new file mode 100644 index 0000000000000..1b7f1dca5a543 --- /dev/null +++ b/build-logic/conventions/src/main/kotlin/pulsar.public-java-library-conventions.gradle.kts @@ -0,0 +1,27 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +// Convention plugin for public Pulsar Java libraries that are published to Maven repositories. +// Combines java-conventions (compilation, testing) with publish-conventions (Maven publishing, +// signing, POM metadata). Internal-only modules should use pulsar.java-conventions directly. + +plugins { + id("pulsar.java-conventions") + id("pulsar.publish-conventions") +} diff --git a/build-logic/conventions/src/main/kotlin/pulsar.publish-conventions.gradle.kts b/build-logic/conventions/src/main/kotlin/pulsar.publish-conventions.gradle.kts index 97756316b7383..d3abdd99bb212 100644 --- a/build-logic/conventions/src/main/kotlin/pulsar.publish-conventions.gradle.kts +++ b/build-logic/conventions/src/main/kotlin/pulsar.publish-conventions.gradle.kts @@ -48,40 +48,39 @@ pluginManager.withPlugin("java-library") { from(tasks.named(JavaPlugin.JAVADOC_TASK_NAME)) } - // NAR modules disable the jar task and produce .nar files instead. - // Detect the NAR plugin and configure the publication accordingly. - val isNarModule = plugins.hasPlugin("io.github.merlimat.nar") + // Standard java-library modules: publish from components["java"] + publishing { + publications { + create("maven") { + from(components["java"]) + artifact(sourcesJar) + artifact(javadocJar) - if (isNarModule) { - // NAR modules: publish the .nar artifact with packaging=nar - publishing { - publications { - create("maven") { - artifact(tasks.named("nar")) - artifact(sourcesJar) - artifact(javadocJar) - // Set packaging to "nar" in POM - pom.packaging = "nar" + versionMapping { + usage(Usage.JAVA_RUNTIME) { + fromResolutionResult() + } + usage(Usage.JAVA_API) { + fromResolutionOf("runtimeClasspath") + } } } } - } else { - // Standard java-library modules: publish from components["java"] + } + + // NAR modules disable the jar task and produce .nar files instead. + // When the NAR plugin is applied (possibly after this plugin), reconfigure + // the publication to use the .nar artifact instead of the jar. + pluginManager.withPlugin("io.github.merlimat.nar") { publishing { publications { - create("maven") { - from(components["java"]) + named("maven") { + // Clear the component-based artifacts and use NAR instead + artifacts.clear() + artifact(tasks.named("nar")) artifact(sourcesJar) artifact(javadocJar) - - versionMapping { - usage(Usage.JAVA_RUNTIME) { - fromResolutionResult() - } - usage(Usage.JAVA_API) { - fromResolutionOf("runtimeClasspath") - } - } + pom.packaging = "nar" } } } diff --git a/jclouds-shaded/build.gradle.kts b/jclouds-shaded/build.gradle.kts index dd15402374824..2fa72b7cb1f7f 100644 --- a/jclouds-shaded/build.gradle.kts +++ b/jclouds-shaded/build.gradle.kts @@ -18,9 +18,8 @@ */ plugins { - id("pulsar.java-conventions") + id("pulsar.public-java-library-conventions") id("pulsar.shadow-conventions") - id("pulsar.publish-conventions") } // Pin guava to 32.x for jclouds compatibility — jclouds uses TypeToken from diff --git a/jetty-upgrade/bookkeeper-prometheus-metrics-provider/build.gradle.kts b/jetty-upgrade/bookkeeper-prometheus-metrics-provider/build.gradle.kts index 761c5eab54271..14d178ae94e85 100644 --- a/jetty-upgrade/bookkeeper-prometheus-metrics-provider/build.gradle.kts +++ b/jetty-upgrade/bookkeeper-prometheus-metrics-provider/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/jetty-upgrade/zookeeper-prometheus-metrics/build.gradle.kts b/jetty-upgrade/zookeeper-prometheus-metrics/build.gradle.kts index 00d578b9ac929..092dd458b5553 100644 --- a/jetty-upgrade/zookeeper-prometheus-metrics/build.gradle.kts +++ b/jetty-upgrade/zookeeper-prometheus-metrics/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/jetty-upgrade/zookeeper-with-patched-admin/build.gradle.kts b/jetty-upgrade/zookeeper-with-patched-admin/build.gradle.kts index 4ab0b60e24a6e..ceed47555446d 100644 --- a/jetty-upgrade/zookeeper-with-patched-admin/build.gradle.kts +++ b/jetty-upgrade/zookeeper-with-patched-admin/build.gradle.kts @@ -18,9 +18,8 @@ */ plugins { - id("pulsar.java-conventions") + id("pulsar.public-java-library-conventions") id("pulsar.shadow-conventions") - id("pulsar.publish-conventions") } dependencies { diff --git a/managed-ledger/build.gradle.kts b/managed-ledger/build.gradle.kts index 58492f40d1e7b..c959662c3fc69 100644 --- a/managed-ledger/build.gradle.kts +++ b/managed-ledger/build.gradle.kts @@ -18,9 +18,8 @@ */ plugins { - id("pulsar.java-conventions") + id("pulsar.public-java-library-conventions") alias(libs.plugins.lightproto) - id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-broker-auth-athenz/build.gradle.kts b/pulsar-broker-auth-athenz/build.gradle.kts index 035994f907603..6ea851f77ff1f 100644 --- a/pulsar-broker-auth-athenz/build.gradle.kts +++ b/pulsar-broker-auth-athenz/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/pulsar-broker-auth-oidc/build.gradle.kts b/pulsar-broker-auth-oidc/build.gradle.kts index 0d6c2c6646de7..f9db7cd2b39cd 100644 --- a/pulsar-broker-auth-oidc/build.gradle.kts +++ b/pulsar-broker-auth-oidc/build.gradle.kts @@ -18,9 +18,8 @@ */ plugins { - id("pulsar.java-conventions") + id("pulsar.public-java-library-conventions") id("pulsar.test-certs-conventions") - id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-broker-auth-sasl/build.gradle.kts b/pulsar-broker-auth-sasl/build.gradle.kts index 04d38312d20e7..74c0041303e69 100644 --- a/pulsar-broker-auth-sasl/build.gradle.kts +++ b/pulsar-broker-auth-sasl/build.gradle.kts @@ -18,9 +18,8 @@ */ plugins { - id("pulsar.java-conventions") + id("pulsar.public-java-library-conventions") id("pulsar.test-certs-conventions") - id("pulsar.publish-conventions") } // Each test class gets its own JVM fork because AuthenticationSasl has static JAAS state diff --git a/pulsar-broker-common/build.gradle.kts b/pulsar-broker-common/build.gradle.kts index 5e1f07549139a..f86a54ccece2a 100644 --- a/pulsar-broker-common/build.gradle.kts +++ b/pulsar-broker-common/build.gradle.kts @@ -18,9 +18,8 @@ */ plugins { - id("pulsar.java-conventions") + id("pulsar.public-java-library-conventions") id("pulsar.test-certs-conventions") - id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-broker/build.gradle.kts b/pulsar-broker/build.gradle.kts index b351074f32d4e..a72bfa27a588c 100644 --- a/pulsar-broker/build.gradle.kts +++ b/pulsar-broker/build.gradle.kts @@ -18,11 +18,10 @@ */ plugins { - id("pulsar.java-conventions") + id("pulsar.public-java-library-conventions") id("pulsar.test-certs-conventions") alias(libs.plugins.protobuf) alias(libs.plugins.lightproto) - id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-cli-utils/build.gradle.kts b/pulsar-cli-utils/build.gradle.kts index 7a2cd0a6396e7..5e0b01267ef2a 100644 --- a/pulsar-cli-utils/build.gradle.kts +++ b/pulsar-cli-utils/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/pulsar-client-admin-api/build.gradle.kts b/pulsar-client-admin-api/build.gradle.kts index ce7924ff9c8ca..378b05f3eb650 100644 --- a/pulsar-client-admin-api/build.gradle.kts +++ b/pulsar-client-admin-api/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/pulsar-client-admin-shaded/build.gradle.kts b/pulsar-client-admin-shaded/build.gradle.kts index 1beaa44b6a162..df1c0d177f1ee 100644 --- a/pulsar-client-admin-shaded/build.gradle.kts +++ b/pulsar-client-admin-shaded/build.gradle.kts @@ -18,9 +18,8 @@ */ plugins { - id("pulsar.java-conventions") + id("pulsar.public-java-library-conventions") id("pulsar.client-shade-conventions") - id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-client-admin/build.gradle.kts b/pulsar-client-admin/build.gradle.kts index 7ff0a72a50b35..660f6a416930d 100644 --- a/pulsar-client-admin/build.gradle.kts +++ b/pulsar-client-admin/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/pulsar-client-all/build.gradle.kts b/pulsar-client-all/build.gradle.kts index aec5625d5503a..f6526e423ed0b 100644 --- a/pulsar-client-all/build.gradle.kts +++ b/pulsar-client-all/build.gradle.kts @@ -18,9 +18,8 @@ */ plugins { - id("pulsar.java-conventions") + id("pulsar.public-java-library-conventions") id("pulsar.client-shade-conventions") - id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-client-api/build.gradle.kts b/pulsar-client-api/build.gradle.kts index 97648488e8e21..6b2323163684f 100644 --- a/pulsar-client-api/build.gradle.kts +++ b/pulsar-client-api/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/pulsar-client-auth-athenz/build.gradle.kts b/pulsar-client-auth-athenz/build.gradle.kts index cd0266102532a..b4f20f8d5ff54 100644 --- a/pulsar-client-auth-athenz/build.gradle.kts +++ b/pulsar-client-auth-athenz/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/pulsar-client-auth-sasl/build.gradle.kts b/pulsar-client-auth-sasl/build.gradle.kts index 09676984cf8be..b288496bd631c 100644 --- a/pulsar-client-auth-sasl/build.gradle.kts +++ b/pulsar-client-auth-sasl/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/pulsar-client-messagecrypto-bc/build.gradle.kts b/pulsar-client-messagecrypto-bc/build.gradle.kts index d901c7c295210..413a5bc77d7f8 100644 --- a/pulsar-client-messagecrypto-bc/build.gradle.kts +++ b/pulsar-client-messagecrypto-bc/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/pulsar-client-shaded/build.gradle.kts b/pulsar-client-shaded/build.gradle.kts index a0e41be7467b2..4822c850d1082 100644 --- a/pulsar-client-shaded/build.gradle.kts +++ b/pulsar-client-shaded/build.gradle.kts @@ -18,9 +18,8 @@ */ plugins { - id("pulsar.java-conventions") + id("pulsar.public-java-library-conventions") id("pulsar.client-shade-conventions") - id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-client-tools-api/build.gradle.kts b/pulsar-client-tools-api/build.gradle.kts index 0548aaf5fcc57..0cc1ad36a4958 100644 --- a/pulsar-client-tools-api/build.gradle.kts +++ b/pulsar-client-tools-api/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/pulsar-client-tools/build.gradle.kts b/pulsar-client-tools/build.gradle.kts index 3011b3d384e16..118f85aa86644 100644 --- a/pulsar-client-tools/build.gradle.kts +++ b/pulsar-client-tools/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/pulsar-client/build.gradle.kts b/pulsar-client/build.gradle.kts index 973106bd0a1b0..bd3a39d705615 100644 --- a/pulsar-client/build.gradle.kts +++ b/pulsar-client/build.gradle.kts @@ -18,9 +18,8 @@ */ plugins { - id("pulsar.java-conventions") + id("pulsar.public-java-library-conventions") alias(libs.plugins.protobuf) - id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-common/build.gradle.kts b/pulsar-common/build.gradle.kts index 4d5bddca1ab6e..cdfaaeb16c0a3 100644 --- a/pulsar-common/build.gradle.kts +++ b/pulsar-common/build.gradle.kts @@ -23,10 +23,9 @@ import java.time.ZonedDateTime import java.time.format.DateTimeFormatter plugins { - id("pulsar.java-conventions") + id("pulsar.public-java-library-conventions") id("pulsar.test-certs-conventions") alias(libs.plugins.lightproto) - id("pulsar.publish-conventions") } val generatePulsarVersion by tasks.registering { diff --git a/pulsar-config-validation/build.gradle.kts b/pulsar-config-validation/build.gradle.kts index 469134496c753..f24b1804acf24 100644 --- a/pulsar-config-validation/build.gradle.kts +++ b/pulsar-config-validation/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/pulsar-docs-tools/build.gradle.kts b/pulsar-docs-tools/build.gradle.kts index 1ec528a1cae89..416cf43c56732 100644 --- a/pulsar-docs-tools/build.gradle.kts +++ b/pulsar-docs-tools/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/pulsar-functions/api-java/build.gradle.kts b/pulsar-functions/api-java/build.gradle.kts index b32db3d6d66b0..99ef39e380f86 100644 --- a/pulsar-functions/api-java/build.gradle.kts +++ b/pulsar-functions/api-java/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/pulsar-functions/instance/build.gradle.kts b/pulsar-functions/instance/build.gradle.kts index 82537cf27ad51..d9ef29c14fe8f 100644 --- a/pulsar-functions/instance/build.gradle.kts +++ b/pulsar-functions/instance/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/pulsar-functions/localrun-shaded/build.gradle.kts b/pulsar-functions/localrun-shaded/build.gradle.kts index 407a00ee7b695..f69c7cba62ebe 100644 --- a/pulsar-functions/localrun-shaded/build.gradle.kts +++ b/pulsar-functions/localrun-shaded/build.gradle.kts @@ -18,9 +18,8 @@ */ plugins { - id("pulsar.java-conventions") + id("pulsar.public-java-library-conventions") id("pulsar.shadow-conventions") - id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-functions/localrun/build.gradle.kts b/pulsar-functions/localrun/build.gradle.kts index 38357fa670543..c61c1ba305b3c 100644 --- a/pulsar-functions/localrun/build.gradle.kts +++ b/pulsar-functions/localrun/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/pulsar-functions/proto/build.gradle.kts b/pulsar-functions/proto/build.gradle.kts index 7694494c62eb9..37e101815e069 100644 --- a/pulsar-functions/proto/build.gradle.kts +++ b/pulsar-functions/proto/build.gradle.kts @@ -18,9 +18,8 @@ */ plugins { - id("pulsar.java-conventions") + id("pulsar.public-java-library-conventions") alias(libs.plugins.lightproto) - id("pulsar.publish-conventions") } // Suppress warnings in LightProto generated code diff --git a/pulsar-functions/runtime/build.gradle.kts b/pulsar-functions/runtime/build.gradle.kts index ad6e11c65d196..279136c79e5dc 100644 --- a/pulsar-functions/runtime/build.gradle.kts +++ b/pulsar-functions/runtime/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } // Include parent module's test resources (YAML config files used by WorkerApiV2ResourceConfigTest) diff --git a/pulsar-functions/secrets/build.gradle.kts b/pulsar-functions/secrets/build.gradle.kts index fc55125967a48..2cc40772e0913 100644 --- a/pulsar-functions/secrets/build.gradle.kts +++ b/pulsar-functions/secrets/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/pulsar-functions/utils/build.gradle.kts b/pulsar-functions/utils/build.gradle.kts index ccbd6fefe32d5..37c31000a0ea5 100644 --- a/pulsar-functions/utils/build.gradle.kts +++ b/pulsar-functions/utils/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/pulsar-functions/worker/build.gradle.kts b/pulsar-functions/worker/build.gradle.kts index 96fc8d0d4c60a..d2b3a614f005b 100644 --- a/pulsar-functions/worker/build.gradle.kts +++ b/pulsar-functions/worker/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } // Include parent module's test resources (YAML config files) diff --git a/pulsar-io/batch-data-generator/build.gradle.kts b/pulsar-io/batch-data-generator/build.gradle.kts index e1167297c55f7..ee14cd8594b55 100644 --- a/pulsar-io/batch-data-generator/build.gradle.kts +++ b/pulsar-io/batch-data-generator/build.gradle.kts @@ -18,9 +18,8 @@ */ plugins { - id("pulsar.java-conventions") + id("pulsar.public-java-library-conventions") id("pulsar.nar-conventions") - id("pulsar.publish-conventions") } dependencies { implementation(project(":pulsar-io:pulsar-io-core")) diff --git a/pulsar-io/batch-discovery-triggerers/build.gradle.kts b/pulsar-io/batch-discovery-triggerers/build.gradle.kts index 744a2bfe0b607..8b16d397c17e7 100644 --- a/pulsar-io/batch-discovery-triggerers/build.gradle.kts +++ b/pulsar-io/batch-discovery-triggerers/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/pulsar-io/common/build.gradle.kts b/pulsar-io/common/build.gradle.kts index 69de4e6f9f839..24ed7359cd4db 100644 --- a/pulsar-io/common/build.gradle.kts +++ b/pulsar-io/common/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/pulsar-io/core/build.gradle.kts b/pulsar-io/core/build.gradle.kts index 6531bf3d09202..1fb04bed6e89a 100644 --- a/pulsar-io/core/build.gradle.kts +++ b/pulsar-io/core/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/pulsar-io/data-generator/build.gradle.kts b/pulsar-io/data-generator/build.gradle.kts index 585ac3926e327..a17c0ce14891f 100644 --- a/pulsar-io/data-generator/build.gradle.kts +++ b/pulsar-io/data-generator/build.gradle.kts @@ -18,9 +18,8 @@ */ plugins { - id("pulsar.java-conventions") + id("pulsar.public-java-library-conventions") id("pulsar.nar-conventions") - id("pulsar.publish-conventions") } dependencies { implementation(project(":pulsar-io:pulsar-io-core")) diff --git a/pulsar-metadata/build.gradle.kts b/pulsar-metadata/build.gradle.kts index 9714aee69e8a6..13b3795cb3c3e 100644 --- a/pulsar-metadata/build.gradle.kts +++ b/pulsar-metadata/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/pulsar-opentelemetry/build.gradle.kts b/pulsar-opentelemetry/build.gradle.kts index 50eada3af6453..8563f5d4a6d0f 100644 --- a/pulsar-opentelemetry/build.gradle.kts +++ b/pulsar-opentelemetry/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/pulsar-package-management/bookkeeper-storage/build.gradle.kts b/pulsar-package-management/bookkeeper-storage/build.gradle.kts index 4c306a2f1d653..11d2e19ed6dff 100644 --- a/pulsar-package-management/bookkeeper-storage/build.gradle.kts +++ b/pulsar-package-management/bookkeeper-storage/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/pulsar-package-management/core/build.gradle.kts b/pulsar-package-management/core/build.gradle.kts index 0fd16e379726b..be0e227bcfd8a 100644 --- a/pulsar-package-management/core/build.gradle.kts +++ b/pulsar-package-management/core/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/pulsar-package-management/filesystem-storage/build.gradle.kts b/pulsar-package-management/filesystem-storage/build.gradle.kts index 316808c88a7e1..6bd29bb9cc195 100644 --- a/pulsar-package-management/filesystem-storage/build.gradle.kts +++ b/pulsar-package-management/filesystem-storage/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/pulsar-proxy/build.gradle.kts b/pulsar-proxy/build.gradle.kts index d2f01c0ea02a2..8d0966893af5d 100644 --- a/pulsar-proxy/build.gradle.kts +++ b/pulsar-proxy/build.gradle.kts @@ -18,9 +18,8 @@ */ plugins { - id("pulsar.java-conventions") + id("pulsar.public-java-library-conventions") id("pulsar.test-certs-conventions") - id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-testclient/build.gradle.kts b/pulsar-testclient/build.gradle.kts index 3aabb3f10c48a..012e348563380 100644 --- a/pulsar-testclient/build.gradle.kts +++ b/pulsar-testclient/build.gradle.kts @@ -18,9 +18,8 @@ */ plugins { - id("pulsar.java-conventions") + id("pulsar.public-java-library-conventions") id("pulsar.test-certs-conventions") - id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-transaction/common/build.gradle.kts b/pulsar-transaction/common/build.gradle.kts index a08672cc07e0c..7eadba5ef7064 100644 --- a/pulsar-transaction/common/build.gradle.kts +++ b/pulsar-transaction/common/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } // pulsar-transaction-common has no internal Pulsar dependencies diff --git a/pulsar-transaction/coordinator/build.gradle.kts b/pulsar-transaction/coordinator/build.gradle.kts index 61792608d2a40..e33199002aa5c 100644 --- a/pulsar-transaction/coordinator/build.gradle.kts +++ b/pulsar-transaction/coordinator/build.gradle.kts @@ -18,9 +18,8 @@ */ plugins { - id("pulsar.java-conventions") + id("pulsar.public-java-library-conventions") alias(libs.plugins.lightproto) - id("pulsar.publish-conventions") } dependencies { diff --git a/pulsar-websocket/build.gradle.kts b/pulsar-websocket/build.gradle.kts index d0b455df9a7ad..20351173397b6 100644 --- a/pulsar-websocket/build.gradle.kts +++ b/pulsar-websocket/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/structured-event-log/build.gradle.kts b/structured-event-log/build.gradle.kts index d27bf07027081..dd811ed15f49b 100644 --- a/structured-event-log/build.gradle.kts +++ b/structured-event-log/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/testmocks/build.gradle.kts b/testmocks/build.gradle.kts index d2a1990453b16..4a3ec2524f061 100644 --- a/testmocks/build.gradle.kts +++ b/testmocks/build.gradle.kts @@ -18,8 +18,7 @@ */ plugins { - id("pulsar.java-conventions") - id("pulsar.publish-conventions") + id("pulsar.public-java-library-conventions") } dependencies { diff --git a/tiered-storage/file-system/build.gradle.kts b/tiered-storage/file-system/build.gradle.kts index b33e26d2efed8..e18f8ae68eeae 100644 --- a/tiered-storage/file-system/build.gradle.kts +++ b/tiered-storage/file-system/build.gradle.kts @@ -18,9 +18,8 @@ */ plugins { - id("pulsar.java-conventions") + id("pulsar.public-java-library-conventions") id("pulsar.nar-conventions") - id("pulsar.publish-conventions") } // Force Jetty 9 for this module. Hadoop MiniDFSCluster requires Jetty 9 classes diff --git a/tiered-storage/jcloud/build.gradle.kts b/tiered-storage/jcloud/build.gradle.kts index b4ff41f546e68..8b66f2c677b38 100644 --- a/tiered-storage/jcloud/build.gradle.kts +++ b/tiered-storage/jcloud/build.gradle.kts @@ -18,9 +18,8 @@ */ plugins { - id("pulsar.java-conventions") + id("pulsar.public-java-library-conventions") id("pulsar.nar-conventions") - id("pulsar.publish-conventions") } dependencies { compileOnly(project(":managed-ledger")) From 7a74e643fe1e42cb3c6e775a5134d623127cb820 Mon Sep 17 00:00:00 2001 From: Lari Hotari Date: Wed, 8 Apr 2026 18:32:46 +0300 Subject: [PATCH 4/5] [improve][build] Validate published modules don't depend on unpublished projects Add a publish-time validation check that ensures all project dependencies in publishable scopes (api, implementation, runtimeOnly) point to projects that also apply maven-publish. This prevents mistakes where a consumer downloading from Maven Central couldn't resolve a dependency because the referenced module was never published. Test/compileOnly scoped dependencies are excluded since they don't appear in the published POM. --- .../pulsar.publish-conventions.gradle.kts | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/build-logic/conventions/src/main/kotlin/pulsar.publish-conventions.gradle.kts b/build-logic/conventions/src/main/kotlin/pulsar.publish-conventions.gradle.kts index d3abdd99bb212..073133b3a1ca3 100644 --- a/build-logic/conventions/src/main/kotlin/pulsar.publish-conventions.gradle.kts +++ b/build-logic/conventions/src/main/kotlin/pulsar.publish-conventions.gradle.kts @@ -195,3 +195,49 @@ tasks.withType().configureEach { tasks.withType().configureEach { suppressedValidationErrors.add("enforced-platform") } + +// Validate that published modules only depend on other published modules. +// Dependencies in test/compileOnly scopes are excluded since they don't +// appear in the published POM. +if (project != rootProject) { + pluginManager.withPlugin("java-library") { + val publishedScopes = listOf("api", "implementation", "runtimeOnly") + val configsToCheck = publishedScopes.mapNotNull { name -> + configurations.findByName(name)?.let { name to it } + } + val currentProjectPath = project.path + + // Collect unpublished project dependencies at configuration time + // (after all plugins/dependencies are declared). Store as plain strings + // for configuration cache compatibility. + val unpublishedDeps = provider { + val errors = mutableListOf() + for ((configName, config) in configsToCheck) { + for (dep in config.dependencies) { + if (dep is ProjectDependency) { + val depPath = dep.path + val depProject = project.rootProject.project(depPath) + if (!depProject.plugins.hasPlugin("maven-publish")) { + errors.add(" - $configName -> $depPath (not published)") + } + } + } + } + errors + } + + tasks.withType().configureEach { + val errorList = unpublishedDeps + doFirst { + val errors = errorList.get() + if (errors.isNotEmpty()) { + throw GradleException( + "Published module '$currentProjectPath' depends on unpublished projects:\n" + + errors.joinToString("\n") + "\n" + + "Either publish the dependency or move it to a test/compileOnly scope." + ) + } + } + } + } +} From f092d35753efae9a41ad5d353d19013bb4173d9f Mon Sep 17 00:00:00 2001 From: Lari Hotari Date: Wed, 8 Apr 2026 21:01:11 +0300 Subject: [PATCH 5/5] [improve][build] NAR modules get their own publishing convention - Move NAR publishing into pulsar.nar-conventions: applies pulsar.publish-conventions and configures NAR-specific publication with .nar artifact and empty POM (no dependencies) - NAR modules use pulsar.java-conventions + pulsar.nar-conventions instead of pulsar.public-java-library-conventions - Downgrade jclouds-shaded to internal (only used by tiered-storage NAR) - Move dependency validation from pulsar.publish-conventions to pulsar.public-java-library-conventions (NAR modules don't need it) - Disable publishing for example NAR modules --- .../kotlin/pulsar.nar-conventions.gradle.kts | 27 +++++++- ...public-java-library-conventions.gradle.kts | 42 +++++++++++++ .../pulsar.publish-conventions.gradle.kts | 62 ------------------- jclouds-shaded/build.gradle.kts | 2 +- .../build.gradle.kts | 3 + .../java-examples-builtin/build.gradle.kts | 3 + .../batch-data-generator/build.gradle.kts | 2 +- pulsar-io/data-generator/build.gradle.kts | 2 +- tiered-storage/file-system/build.gradle.kts | 2 +- tiered-storage/jcloud/build.gradle.kts | 2 +- 10 files changed, 79 insertions(+), 68 deletions(-) diff --git a/build-logic/conventions/src/main/kotlin/pulsar.nar-conventions.gradle.kts b/build-logic/conventions/src/main/kotlin/pulsar.nar-conventions.gradle.kts index d51ebc8ad23e6..c101449289572 100644 --- a/build-logic/conventions/src/main/kotlin/pulsar.nar-conventions.gradle.kts +++ b/build-logic/conventions/src/main/kotlin/pulsar.nar-conventions.gradle.kts @@ -19,10 +19,12 @@ // Convention plugin for NAR (Nifi Archive) modules. // Configures platform module exclusions from runtimeClasspath, forces JAR artifacts -// for bundled-dependencies, and handles archive name qualification. +// for bundled-dependencies, handles archive name qualification, and publishes the +// NAR artifact with an empty POM (no dependencies — everything is bundled). plugins { id("io.github.merlimat.nar") + id("pulsar.publish-conventions") } // NAR modules should not bundle Pulsar platform dependencies — they are provided @@ -91,3 +93,26 @@ if (parentProject != null && parentProject != rootProject && parentProject.paren val narIdProp = narExt.javaClass.getMethod("getNarId").invoke(narExt) as org.gradle.api.provider.Property narIdProp.set(qualifiedName) } + +// --- NAR publishing: publish only the .nar artifact with an empty POM --- +// NAR modules bundle all dependencies, so the POM should have no section. +publishing { + publications { + named("maven") { + // Replace component-based artifacts with just the NAR file + artifacts.clear() + artifact(tasks.named("nar")) + pom { + packaging = "nar" + // Remove all dependencies — NAR bundles everything + withXml { + val root = asNode() + root.children().removeAll { node -> + val name = (node as groovy.util.Node).name() + name.toString().contains("dependencies") + } + } + } + } + } +} diff --git a/build-logic/conventions/src/main/kotlin/pulsar.public-java-library-conventions.gradle.kts b/build-logic/conventions/src/main/kotlin/pulsar.public-java-library-conventions.gradle.kts index 1b7f1dca5a543..45010ea637804 100644 --- a/build-logic/conventions/src/main/kotlin/pulsar.public-java-library-conventions.gradle.kts +++ b/build-logic/conventions/src/main/kotlin/pulsar.public-java-library-conventions.gradle.kts @@ -25,3 +25,45 @@ plugins { id("pulsar.java-conventions") id("pulsar.publish-conventions") } + +// Validate that public java-library modules only depend on other published modules +// in scopes that end up in the published POM (api, implementation, runtimeOnly). +// Test/compileOnly scoped dependencies are excluded since they don't appear in the POM. +// NAR modules are not validated here — they bundle all dependencies and have empty POMs. +run { + val publishedScopes = listOf("api", "implementation", "runtimeOnly") + val configsToCheck = publishedScopes.mapNotNull { name -> + configurations.findByName(name)?.let { name to it } + } + val currentProjectPath = project.path + + val unpublishedDeps = provider { + val errors = mutableListOf() + for ((configName, config) in configsToCheck) { + for (dep in config.dependencies) { + if (dep is ProjectDependency) { + val depPath = dep.path + val depProject = project.rootProject.project(depPath) + if (!depProject.plugins.hasPlugin("maven-publish")) { + errors.add(" - $configName -> $depPath (not published)") + } + } + } + } + errors + } + + tasks.withType().configureEach { + val errorList = unpublishedDeps + doFirst { + val errors = errorList.get() + if (errors.isNotEmpty()) { + throw GradleException( + "Published module '$currentProjectPath' depends on unpublished projects:\n" + + errors.joinToString("\n") + "\n" + + "Either publish the dependency or move it to a test/compileOnly scope." + ) + } + } + } +} diff --git a/build-logic/conventions/src/main/kotlin/pulsar.publish-conventions.gradle.kts b/build-logic/conventions/src/main/kotlin/pulsar.publish-conventions.gradle.kts index 073133b3a1ca3..eae72273f310f 100644 --- a/build-logic/conventions/src/main/kotlin/pulsar.publish-conventions.gradle.kts +++ b/build-logic/conventions/src/main/kotlin/pulsar.publish-conventions.gradle.kts @@ -68,23 +68,6 @@ pluginManager.withPlugin("java-library") { } } - // NAR modules disable the jar task and produce .nar files instead. - // When the NAR plugin is applied (possibly after this plugin), reconfigure - // the publication to use the .nar artifact instead of the jar. - pluginManager.withPlugin("io.github.merlimat.nar") { - publishing { - publications { - named("maven") { - // Clear the component-based artifacts and use NAR instead - artifacts.clear() - artifact(tasks.named("nar")) - artifact(sourcesJar) - artifact(javadocJar) - pom.packaging = "nar" - } - } - } - } } // --- java-platform projects (BOM, dependencies): POM-only, no JAR --- @@ -196,48 +179,3 @@ tasks.withType().configureEach { suppressedValidationErrors.add("enforced-platform") } -// Validate that published modules only depend on other published modules. -// Dependencies in test/compileOnly scopes are excluded since they don't -// appear in the published POM. -if (project != rootProject) { - pluginManager.withPlugin("java-library") { - val publishedScopes = listOf("api", "implementation", "runtimeOnly") - val configsToCheck = publishedScopes.mapNotNull { name -> - configurations.findByName(name)?.let { name to it } - } - val currentProjectPath = project.path - - // Collect unpublished project dependencies at configuration time - // (after all plugins/dependencies are declared). Store as plain strings - // for configuration cache compatibility. - val unpublishedDeps = provider { - val errors = mutableListOf() - for ((configName, config) in configsToCheck) { - for (dep in config.dependencies) { - if (dep is ProjectDependency) { - val depPath = dep.path - val depProject = project.rootProject.project(depPath) - if (!depProject.plugins.hasPlugin("maven-publish")) { - errors.add(" - $configName -> $depPath (not published)") - } - } - } - } - errors - } - - tasks.withType().configureEach { - val errorList = unpublishedDeps - doFirst { - val errors = errorList.get() - if (errors.isNotEmpty()) { - throw GradleException( - "Published module '$currentProjectPath' depends on unpublished projects:\n" + - errors.joinToString("\n") + "\n" + - "Either publish the dependency or move it to a test/compileOnly scope." - ) - } - } - } - } -} diff --git a/jclouds-shaded/build.gradle.kts b/jclouds-shaded/build.gradle.kts index 2fa72b7cb1f7f..597e32e6e3b0c 100644 --- a/jclouds-shaded/build.gradle.kts +++ b/jclouds-shaded/build.gradle.kts @@ -18,7 +18,7 @@ */ plugins { - id("pulsar.public-java-library-conventions") + id("pulsar.java-conventions") id("pulsar.shadow-conventions") } diff --git a/pulsar-client-tools-customcommand-example/build.gradle.kts b/pulsar-client-tools-customcommand-example/build.gradle.kts index 308ce20579570..4995c0c3ccae3 100644 --- a/pulsar-client-tools-customcommand-example/build.gradle.kts +++ b/pulsar-client-tools-customcommand-example/build.gradle.kts @@ -22,6 +22,9 @@ plugins { id("pulsar.nar-conventions") } +// This is an example module — don't publish to Maven repositories +tasks.withType().configureEach { enabled = false } + dependencies { compileOnly(project(":pulsar-client-tools-api")) compileOnly(libs.picocli) diff --git a/pulsar-functions/java-examples-builtin/build.gradle.kts b/pulsar-functions/java-examples-builtin/build.gradle.kts index 41ddd77a347ee..b4ca1028aba6c 100644 --- a/pulsar-functions/java-examples-builtin/build.gradle.kts +++ b/pulsar-functions/java-examples-builtin/build.gradle.kts @@ -22,6 +22,9 @@ plugins { id("pulsar.nar-conventions") } +// This is an example module — don't publish to Maven repositories +tasks.withType().configureEach { enabled = false } + dependencies { implementation(project(":pulsar-functions:pulsar-functions-api-examples")) } diff --git a/pulsar-io/batch-data-generator/build.gradle.kts b/pulsar-io/batch-data-generator/build.gradle.kts index ee14cd8594b55..86d22762fb381 100644 --- a/pulsar-io/batch-data-generator/build.gradle.kts +++ b/pulsar-io/batch-data-generator/build.gradle.kts @@ -18,7 +18,7 @@ */ plugins { - id("pulsar.public-java-library-conventions") + id("pulsar.java-conventions") id("pulsar.nar-conventions") } dependencies { diff --git a/pulsar-io/data-generator/build.gradle.kts b/pulsar-io/data-generator/build.gradle.kts index a17c0ce14891f..ad629d02c12ce 100644 --- a/pulsar-io/data-generator/build.gradle.kts +++ b/pulsar-io/data-generator/build.gradle.kts @@ -18,7 +18,7 @@ */ plugins { - id("pulsar.public-java-library-conventions") + id("pulsar.java-conventions") id("pulsar.nar-conventions") } dependencies { diff --git a/tiered-storage/file-system/build.gradle.kts b/tiered-storage/file-system/build.gradle.kts index e18f8ae68eeae..83558e1ae4d35 100644 --- a/tiered-storage/file-system/build.gradle.kts +++ b/tiered-storage/file-system/build.gradle.kts @@ -18,7 +18,7 @@ */ plugins { - id("pulsar.public-java-library-conventions") + id("pulsar.java-conventions") id("pulsar.nar-conventions") } diff --git a/tiered-storage/jcloud/build.gradle.kts b/tiered-storage/jcloud/build.gradle.kts index 8b66f2c677b38..40eef5d5cddeb 100644 --- a/tiered-storage/jcloud/build.gradle.kts +++ b/tiered-storage/jcloud/build.gradle.kts @@ -18,7 +18,7 @@ */ plugins { - id("pulsar.public-java-library-conventions") + id("pulsar.java-conventions") id("pulsar.nar-conventions") } dependencies {