blob: 959ae4db5f7919daf6511c89131319eed2c953da [file]
// 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.
// This file contains tasks and configuration to support shading dependencies
// consistently when a subproject requires shaded artifacts.
import org.gradle.api.internal.artifacts.publish.ArchivePublishArtifact
apply plugin: "com.github.johnrengelman.shadow"
knows.enabled = false // Disable the "easter egg" knows task.
knows.group = "" // Hide the "easter egg" knows task.
shadowJar.group = "" // Hide shadowJar task since it's used by the default build.
// Add a property to explicitly allow slf4j shading.
ext {
shadowIncludeSlf4j = false
}
// Configure a shaded jar to replace the default jar
shadowJar.classifier = null // Configure shadow jar to have the default classifier.
jar.finalizedBy(shadowJar) // Generate the shaded jar anytime the jar task is run.
jar.classifier = "unshaded" // Add an unshaded classifier to the default jar.
// Add the shadowJar to the published artifacts.
artifacts {
archives shadowJar
}
// Remove the unshaded jar from the published artifacts.
configurations.archives.artifacts.removeAll {
it instanceof ArchivePublishArtifact && it.archiveTask == jar
}
// Ensure we always relocate these shaded dependencies to the same
// location across all modules.
shadowJar {
dependencies {
// Excluding bouncycastle due to:
// https://github.com/apache/hadoop/blob/4d7825309348956336b8f06a08322b78422849b1/hadoop-client-modules/hadoop-client-runtime/pom.xml#L156-L157
exclude dependency("org.bouncycastle::.*")
}
// TODO(achennaka): Figure out a better way to deal with MR-JAR specific files. For now
// we exclude everything as there were no failures seen but probably we need to exclude
// based on the target release version.
exclude "META-INF/versions/9/**"
exclude "META-INF/versions/1?/**"
// Current Gradle version(7.6.4) used to compile Java projects of Kudu project doesn't support
// anything above Java19.
// https://docs.gradle.org/current/userguide/compatibility.html#java_runtime
exclude "META-INF/versions/2?/"
relocate "com.google.common", "org.apache.kudu.shaded.com.google.common"
relocate "com.google.flatbuffers", "org.apache.kudu.shaded.com.google.flatbuffers"
relocate "com.google.gradle.osdetector", "org.apache.kudu.shaded.com.google.gradle.osdetector"
relocate "com.google.gson", "org.apache.kudu.shaded.com.google.gson"
relocate "com.google.protobuf", "org.apache.kudu.shaded.com.google.protobuf"
relocate "com.google.thirdparty", "org.apache.kudu.shaded.com.google.thirdparty"
relocate "com.sangupta", "org.apache.kudu.shaded.com.sangupta"
// Pulled in via osdetector.
relocate "kr.motd.maven", "org.apache.kudu.shaded.kr.motd.maven"
relocate "org.apache.http", "org.apache.kudu.shaded.org.apache.http"
relocate "org.apache.commons", "org.apache.kudu.shaded.org.apache.commons"
// Pulled in via Guava.
relocate "org.checkerframework", "org.apache.kudu.shaded.org.checkerframework"
relocate "org.hamcrest", "org.apache.kudu.shaded.org.hamcrest"
relocate "org.HdrHistogram", "org.apache.kudu.shaded.org.HdrHistogram"
// Pulled in via Micrometer.
relocate "org.LatencyUtils", "org.apache.kudu.shaded.org.LatencyUtils"
relocate "io.micrometer", "org.apache.kudu.shaded.io.micrometer"
relocate "io.netty", "org.apache.kudu.shaded.io.netty"
relocate "scopt", "org.apache.kudu.shaded.scopt"
}
// ------------------------------------------------------------------
// Everything below is a "hack" to support partial shading and
// accurate pom generation. At some point this logic should exist
// in the shadow plugin itself.
// https://github.com/johnrengelman/shadow/issues/166
// https://github.com/johnrengelman/shadow/issues/159
// ------------------------------------------------------------------
// Add a configuration to support unshaded compile dependencies.
// By default shadow assumes all dependencies are shaded.
configurations.create("compileUnshaded")
configurations.shadow.extendsFrom(configurations.compileUnshaded)
configurations.compileOnly.extendsFrom(configurations.compileUnshaded)
// We use afterEvaluate to add additional configuration once all the definitions
// in the projects build script have been applied
afterEvaluate {
// Ensure we never shade SLF4J unless we explicitly specify it.
// This is a workaround because in the shadow plugin exclusions from
// parent modules are not respected in modules that use them.
if (!shadowIncludeSlf4j) {
shadowJar {
dependencies {
exclude(dependency("org.slf4j:slf4j-api::.*"))
}
}
}
// Ensure compileUnshaded dependencies are not compiled into shadowJar.
project.configurations.compileUnshaded.dependencies.each { dep ->
def depStr = "${dep.group}:${dep.name}:${dep.version}"
logger.info "Excluding ${depStr} from being bundled into the shaded jar."
shadowJar {
dependencies {
exclude(dependency(depStr))
}
}
}
}