import java.util.jar.JarFile plugins { id "java" id "maven-publish" id "com.github.johnrengelman.shadow" id "com.google.protobuf" id "ru.vyarus.animalsniffer" } description = "gRPC: XDS plugin" [compileJava].each() { it.options.compilerArgs += [ // valueOf(int) in RoutingPriority has been deprecated "-Xlint:-deprecation", // only has AutoValue annotation processor "-Xlint:-processing", ] appendToProperty( it.options.errorprone.excludedPaths, ".*/build/generated/sources/annotationProcessor/java/.*", "|") } evaluationDependsOn(project(':grpc-core').path) dependencies { implementation project(':grpc-protobuf'), project(':grpc-stub'), project(':grpc-core'), project(':grpc-services'), project(':grpc-auth'), project(path: ':grpc-alts', configuration: 'shadow'), libraries.gson, libraries.re2j, libraries.bouncycastle, libraries.autovalue_annotation, libraries.opencensus_proto, libraries.protobuf_util def nettyDependency = implementation project(':grpc-netty') testImplementation project(':grpc-core').sourceSets.test.output annotationProcessor libraries.autovalue compileOnly libraries.javax_annotation, // At runtime use the epoll included in grpc-netty-shaded libraries.netty_epoll testImplementation project(':grpc-testing'), project(':grpc-testing-proto'), libraries.netty_epoll testImplementation (libraries.guava_testlib) { exclude group: 'junit', module: 'junit' } shadow configurations.implementation.getDependencies().minus([nettyDependency]) shadow project(path: ':grpc-netty-shaded', configuration: 'shadow') signature "org.codehaus.mojo.signature:java17:1.0@signature" testRuntimeOnly libraries.netty_tcnative } sourceSets { main { java { srcDir "${projectDir}/third_party/zero-allocation-hashing/main/java" } proto { srcDir 'third_party/envoy/src/main/proto' srcDir 'third_party/protoc-gen-validate/src/main/proto' srcDir 'third_party/udpa/src/main/proto' srcDir 'third_party/googleapis/src/main/proto' srcDir 'third_party/istio/src/main/proto' } } test { java { srcDir "${projectDir}/third_party/zero-allocation-hashing/test/java" } } } configureProtoCompilation() jar { classifier = 'original' } javadoc { // Exclusions here should generally also be relocated exclude 'com/github/udpa/**' exclude 'com/google/security/**' exclude 'io/envoyproxy/**' // Need to clean up the class structure to reduce how much is exposed exclude 'io/grpc/xds/*LoadBalancer*' exclude 'io/grpc/xds/Bootstrapper.java' exclude 'io/grpc/xds/Envoy*' exclude 'io/grpc/xds/FilterChainMatchingProtocolNegotiators.java' exclude 'io/grpc/xds/TlsContextManager.java' exclude 'io/grpc/xds/XdsAttributes.java' exclude 'io/grpc/xds/XdsInitializationException.java' exclude 'io/grpc/xds/XdsNameResolverProvider.java' exclude 'io/grpc/xds/internal/**' exclude 'io/grpc/xds/Internal*' } def prefixName = 'io.grpc.xds' shadowJar { classifier = null dependencies { include(project(':grpc-xds')) } // Relocated packages commonly need exclusions in jacocoTestReport and javadoc relocate 'com.github.udpa', "${prefixName}.shaded.com.github.udpa" relocate 'com.google.api.expr', "${prefixName}.shaded.com.google.api.expr" relocate 'com.google.security', "${prefixName}.shaded.com.google.security" // TODO: missing java_package option in .proto relocate 'envoy.annotations', "${prefixName}.shaded.envoy.annotations" relocate 'io.envoyproxy', "${prefixName}.shaded.io.envoyproxy" relocate 'io.grpc.netty', 'io.grpc.netty.shaded.io.grpc.netty' relocate 'io.netty', 'io.grpc.netty.shaded.io.netty' // TODO: missing java_package option in .proto relocate 'udpa.annotations', "${prefixName}.shaded.udpa.annotations" exclude "**/*.proto" } task checkPackageLeakage(dependsOn: shadowJar) { doLast { def jarEntryPrefixName = prefixName.replaceAll('\\.', '/') shadowJar.outputs.getFiles().each { jar -> def package_leak_detected = false JarFile jf = new JarFile(jar) jf.entries().each { entry -> if (entry.name.endsWith(".class") && !entry.name.startsWith( jarEntryPrefixName)) { package_leak_detected = true println "WARNING: package leaked, may need relocation: " + entry.name } } jf.close() if (package_leak_detected) { throw new TaskExecutionException(shadowJar, new IllegalStateException("Resource leakage detected!")) } } } } test { dependsOn checkPackageLeakage } jacocoTestReport { classDirectories.from = sourceSets.main.output.collect { fileTree(dir: it, exclude: [ // Exclusions here should generally also be relocated '**/com/github/udpa/**', '**/com/google/api/expr/**', '**/com/google/security/**', '**/envoy/annotations/**', '**/io/envoyproxy/**', '**/udpa/annotations/**', ]) } } publishing { publications { maven(MavenPublication) { // We want this to throw an exception if it isn't working def originalJar = artifacts.find { dep -> dep.classifier == 'original'} artifacts.remove(originalJar) pom.withXml { def dependenciesNode = new Node(null, 'dependencies') project.configurations.shadow.allDependencies.each { dep -> def dependencyNode = dependenciesNode.appendNode('dependency') dependencyNode.appendNode('groupId', dep.group) dependencyNode.appendNode('artifactId', dep.name) def version = (dep.name == 'grpc-netty-shaded') ? '[' + dep.version + ']' : dep.version dependencyNode.appendNode('version', version) dependencyNode.appendNode('scope', 'compile') } asNode().dependencies[0].replaceNode(dependenciesNode) } } } }