From cb21dad7d4d9dd197e7b570ba5330b500e29d6f9 Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Thu, 30 Oct 2025 17:47:21 +0100 Subject: [PATCH 1/4] Migrate build to shared convention plugins setup --- .github/workflows/ci-build.yml | 2 +- build.gradle.kts | 154 ++++++++++-------- gradle/checkstyle/checkstyle.xml | 23 --- gradle/checkstyle/header.txt | 15 -- gradle/gradle-daemon-jvm.properties | 1 + .../plugins/build-lifecycle/build.gradle.kts | 3 - .../kotlin/gradlexbuild.lifecycle.gradle.kts | 13 -- .../plugins/build-parameters/build.gradle.kts | 11 -- gradle/plugins/documentation/build.gradle.kts | 8 - ...exbuild.asciidoctor-conventions.gradle.kts | 48 ------ .../documentation/CapabilityListing.kt | 44 ----- gradle/plugins/settings.gradle.kts | 11 -- settings.gradle.kts | 28 +--- ...avaCapabilityConflictResolutionTest.groovy | 5 - .../conflict/test/JarOverlapTest.groovy | 3 + ...ingCapabilitiesPluginFunctionalTest.groovy | 2 +- .../conflict/samples/SamplesTest.java | 29 ---- .../PluginBuildLocationSampleModifier.java | 36 ++-- .../conflict/samples/SamplesTest.java | 12 ++ 19 files changed, 119 insertions(+), 329 deletions(-) delete mode 100644 gradle/checkstyle/checkstyle.xml delete mode 100644 gradle/checkstyle/header.txt create mode 100644 gradle/gradle-daemon-jvm.properties delete mode 100644 gradle/plugins/build-lifecycle/build.gradle.kts delete mode 100644 gradle/plugins/build-lifecycle/src/main/kotlin/gradlexbuild.lifecycle.gradle.kts delete mode 100644 gradle/plugins/build-parameters/build.gradle.kts delete mode 100644 gradle/plugins/documentation/build.gradle.kts delete mode 100644 gradle/plugins/documentation/src/main/kotlin/gradlexbuild.asciidoctor-conventions.gradle.kts delete mode 100644 gradle/plugins/documentation/src/main/kotlin/gradlexbuild/jvm/dependency/conflict/documentation/CapabilityListing.kt delete mode 100644 gradle/plugins/settings.gradle.kts delete mode 100644 src/test/java/org/gradlex/jvm/dependency/conflict/samples/SamplesTest.java rename src/{test => testSamples}/java/org/gradlex/jvm/dependency/conflict/samples/PluginBuildLocationSampleModifier.java (57%) create mode 100644 src/testSamples/java/org/gradlex/jvm/dependency/conflict/samples/SamplesTest.java diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml index c5e02ae9..6eb8a6fe 100644 --- a/.github/workflows/ci-build.yml +++ b/.github/workflows/ci-build.yml @@ -19,4 +19,4 @@ jobs: java-version: 17 - name: Set up Gradle uses: gradle/actions/setup-gradle@v5 - - run: "./gradlew quickCheck" + - run: "./gradlew qualityCheck test" diff --git a/build.gradle.kts b/build.gradle.kts index 600d5b4d..0740fc1b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,42 +1,44 @@ -plugins { - id("groovy") - id("gradlexbuild.lifecycle") - id("gradlexbuild.asciidoctor-conventions") - id("org.gradlex.internal.plugin-publish-conventions") version "0.6" -} +import java.net.URLClassLoader +import org.asciidoctor.gradle.base.AsciidoctorAttributeProvider -group = "org.gradlex" version = "2.4" -java { - toolchain.languageVersion = JavaLanguageVersion.of(17) -} - -tasks.withType().configureEach { - options.release = 8 -} - -tasks.withType().configureEach { - options { - this as StandardJavadocDocletOptions - encoding = "UTF-8" - addStringOption("Xdoclint:all,-missing", "-quiet") - addStringOption("Xwerror", "-quiet") +publishingConventions { + pluginPortal("org.gradlex.jvm-dependency-conflict-resolution") { + implementationClass("org.gradlex.jvm.dependency.conflict.resolution.JvmDependencyConflictResolutionPlugin") + displayName("JVM Conflict Resolution Gradle Plugin") + description("Convenient dependency conflict management for Java projects.") + tags( + "dependency", + "dependencies", + "dependency-management", + "capabilities", + "java", + "logging", + "asm", + "bouncycastle", + "cglib", + "commons-io", + "dom4j", + "guava", + "hamcrest", + "javax", + "jakarta", + "junit", + "mysql", + "postgresql", + "stax", + "slf4j", + "log4j2", + "velocity", + "woodstox", + ) + } + pluginPortal("org.gradlex.jvm-dependency-conflict-detection") { + implementationClass("org.gradlex.jvm.dependency.conflict.detection.JvmDependencyConflictDetectionPlugin") + displayName("JVM Conflict Detection Gradle Plugin") + description("Adds Capabilities to well-known Components hosted on Maven Central.") } -} - -val tagsList = listOf( - "dependency", "dependencies", "dependency-management", "capabilities", "java", "logging", - "asm", "bouncycastle", "cglib", "commons-io", "dom4j", "guava", "hamcrest", "javax", "jakarta", "junit", - "mysql", "postgresql", "stax", "slf4j", "log4j2", "velocity", "woodstox" -) - -pluginPublishConventions { - id("org.gradlex.jvm-dependency-conflict-resolution") - implementationClass("org.gradlex.jvm.dependency.conflict.resolution.JvmDependencyConflictResolutionPlugin") - displayName("JVM Conflict Resolution Gradle Plugin") - description("Convenient dependency conflict management for Java projects.") - tags(*tagsList.toTypedArray()) gitHub("https://github.com/gradlex-org/jvm-dependency-conflict-resolution") website("https://github.com/gradlex-org/jvm-dependency-conflict-resolution") developer { @@ -56,46 +58,64 @@ pluginPublishConventions { } } -gradlePlugin { - plugins { - create("jvm-dependency-conflict-detection") { - id = "org.gradlex.jvm-dependency-conflict-detection" - implementationClass = "org.gradlex.jvm.dependency.conflict.detection.JvmDependencyConflictDetectionPlugin" - displayName = "JVM Conflict Detection Gradle Plugin" - description = "Adds Capabilities to well-known Components hosted on Maven Central." - tags = tagsList - } +testingConventions { testGradleVersions("6.8.3", "6.9.4", "7.0.2", "8.0.2", "8.14.3") } + +tasks.compileTestJava { options.release = 11 } // allow tests to run against 6.x + +val generateCapabilitiesList = + tasks.register("generateCapabilitiesList") { + pluginClasses.from(tasks.jar) + outputFile = layout.buildDirectory.file("generated/docs/asciidoc/parts/capabilities-listing.adoc") } -} -dependencies { - testImplementation("org.gradle.exemplar:samples-check:1.0.3") - testImplementation("org.spockframework:spock-core:2.3-groovy-4.0") - testRuntimeOnly("org.junit.vintage:junit-vintage-engine") +tasks.asciidoctor { + dependsOn(generateCapabilitiesList) + attributeProviders += AsciidoctorAttributeProvider { + mapOf("capabilities-listing" to generateCapabilitiesList.get().outputFile.get().asFile.absolutePath) + } } -testing.suites.named("test") { - useJUnitJupiter() - listOf("6.8.3", "6.9.4", "7.0.2", "8.0.2", "8.14.3").forEach { gradleVersionUnderTest -> - targets.register("test${gradleVersionUnderTest}") { - testTask { - group = LifecycleBasePlugin.VERIFICATION_GROUP - description = "Runs tests against Gradle $gradleVersionUnderTest" - useJUnitPlatform { - excludeTags("no-cross-version") +abstract class CapabilityListing : DefaultTask() { + + @get:OutputFile abstract val outputFile: RegularFileProperty + + @get:Classpath abstract val pluginClasses: ConfigurableFileCollection + + @TaskAction + fun update() { + val classesUrls = pluginClasses.files.map { it.toURI().toURL() } + val loader = + URLClassLoader("pluginClasspath", classesUrls.toTypedArray(), ComponentMetadataRule::class.java.classLoader) + val definitions = loader.loadClass("org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition") + + val allCapabilities = + definitions.enumConstants + .map { rule -> + val capability = definitions.getDeclaredMethod("getCapability").invoke(rule) as String + val modules = definitions.getDeclaredMethod("getModules").invoke(rule) as List<*> + + Pair(capability, modules) } - systemProperty("gradleVersionUnderTest", gradleVersionUnderTest) + .sortedBy { it.first } - exclude("**/*SamplesTest.class") // Not yet cross-version ready + val capabilityList = + allCapabilities.joinToString("") { c -> + "* ${c.first}\n${c.second.joinToString("") { "** ${(it as String).asRepoLink()}\n" }}" } + + outputFile.get().asFile.also { + it.parentFile.mkdirs() + it.writeText(capabilityList) } } - targets.all { - testTask { - maxParallelForks = 4 - inputs.dir(layout.projectDirectory.dir("samples")) - inputs.dir("src/docs/samples") - } - } + + private fun String.asRepoLink() = "https://search.maven.org/artifact/${replace(":", "/")}[$this]" } +// === the following custom configuration should be removed once tests are migrated to Java +apply(plugin = "groovy") + +tasks.named("compileTestGroovy") { targetCompatibility = "11" } // allow tests to run against 6.x + +dependencies { testImplementation("org.spockframework:spock-core:2.3-groovy-4.0") } // +// ==================================================================================== diff --git a/gradle/checkstyle/checkstyle.xml b/gradle/checkstyle/checkstyle.xml deleted file mode 100644 index e7521b07..00000000 --- a/gradle/checkstyle/checkstyle.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/gradle/checkstyle/header.txt b/gradle/checkstyle/header.txt deleted file mode 100644 index 4fe8a001..00000000 --- a/gradle/checkstyle/header.txt +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ \ No newline at end of file diff --git a/gradle/gradle-daemon-jvm.properties b/gradle/gradle-daemon-jvm.properties new file mode 100644 index 00000000..20fe5710 --- /dev/null +++ b/gradle/gradle-daemon-jvm.properties @@ -0,0 +1 @@ +toolchainVersion=17 \ No newline at end of file diff --git a/gradle/plugins/build-lifecycle/build.gradle.kts b/gradle/plugins/build-lifecycle/build.gradle.kts deleted file mode 100644 index bc0172f0..00000000 --- a/gradle/plugins/build-lifecycle/build.gradle.kts +++ /dev/null @@ -1,3 +0,0 @@ -plugins { - `kotlin-dsl` -} diff --git a/gradle/plugins/build-lifecycle/src/main/kotlin/gradlexbuild.lifecycle.gradle.kts b/gradle/plugins/build-lifecycle/src/main/kotlin/gradlexbuild.lifecycle.gradle.kts deleted file mode 100644 index 3245cd92..00000000 --- a/gradle/plugins/build-lifecycle/src/main/kotlin/gradlexbuild.lifecycle.gradle.kts +++ /dev/null @@ -1,13 +0,0 @@ -// Workaround for the fact that test suites are always added to check. -// Since we set up test suites for long running cross version tests -// we want to have a lifecycle task that runs all quality checks and -// the default tests. -tasks.register("quickCheck") { - group = LifecycleBasePlugin.VERIFICATION_GROUP - description = "Runs the default test task as well as code verifications such as Checkstyle" - dependsOn(tasks.named("assemble")) - dependsOn(tasks.named("test")) - dependsOn(tasks.named("checkstyleMain")) - dependsOn(tasks.named("checkstyleTest")) -} - diff --git a/gradle/plugins/build-parameters/build.gradle.kts b/gradle/plugins/build-parameters/build.gradle.kts deleted file mode 100644 index f6657572..00000000 --- a/gradle/plugins/build-parameters/build.gradle.kts +++ /dev/null @@ -1,11 +0,0 @@ -plugins { - id("org.gradlex.build-parameters") version "1.4.4" -} - -buildParameters { - pluginId("gradlexbuild.build-parameters") - bool("ci") { - fromEnvironment() - defaultValue = false - } -} diff --git a/gradle/plugins/documentation/build.gradle.kts b/gradle/plugins/documentation/build.gradle.kts deleted file mode 100644 index 77c0c7c2..00000000 --- a/gradle/plugins/documentation/build.gradle.kts +++ /dev/null @@ -1,8 +0,0 @@ -plugins { - `kotlin-dsl` -} - -dependencies { - implementation(project(":build-lifecycle")) - implementation("org.asciidoctor:asciidoctor-gradle-jvm:4.0.5") -} diff --git a/gradle/plugins/documentation/src/main/kotlin/gradlexbuild.asciidoctor-conventions.gradle.kts b/gradle/plugins/documentation/src/main/kotlin/gradlexbuild.asciidoctor-conventions.gradle.kts deleted file mode 100644 index f4fbd26a..00000000 --- a/gradle/plugins/documentation/src/main/kotlin/gradlexbuild.asciidoctor-conventions.gradle.kts +++ /dev/null @@ -1,48 +0,0 @@ -import gradlexbuild.jvm.dependency.conflict.documentation.CapabilityListing -import org.asciidoctor.gradle.base.AsciidoctorAttributeProvider -import org.asciidoctor.gradle.base.log.Severity - -plugins { - id("java") - id("org.asciidoctor.jvm.convert") -} - -tasks { - val generateCapabilitiesList by tasks.registering(CapabilityListing::class) { - pluginClasses.from(tasks.jar) - outputFile = layout.buildDirectory.file("generated/docs/asciidoc/parts/capabilities-listing.adoc") - } - - asciidoctor { - notCompatibleWithConfigurationCache("See https://github.com/asciidoctor/asciidoctor-gradle-plugin/issues/564") - - failureLevel = Severity.WARN - - attributes(mapOf( - "docinfodir" to "src/docs/asciidoc", - "docinfo" to "shared", - "imagesdir" to "./images", - "source-highlighter" to "prettify", - "tabsize" to "4", - "toc" to "left", - "tip-caption" to "πŸ’‘", - "note-caption" to "ℹ️", - "important-caption" to "❗", - "caution-caption" to "πŸ”₯", - "warning-caption" to "⚠️", - "sectanchors" to true, - "idprefix" to "", - "idseparator" to "-", - "samples-path" to "$projectDir/src/docs/samples" - )) - - attributeProviders += AsciidoctorAttributeProvider { - mapOf("capabilities-listing" to generateCapabilitiesList.get().outputFile.get().asFile.absolutePath) - } - dependsOn(generateCapabilitiesList) - - inputs.dir("src/docs/samples") - .withPathSensitivity(PathSensitivity.RELATIVE) - .withPropertyName("samples") - } -} diff --git a/gradle/plugins/documentation/src/main/kotlin/gradlexbuild/jvm/dependency/conflict/documentation/CapabilityListing.kt b/gradle/plugins/documentation/src/main/kotlin/gradlexbuild/jvm/dependency/conflict/documentation/CapabilityListing.kt deleted file mode 100644 index c0767f74..00000000 --- a/gradle/plugins/documentation/src/main/kotlin/gradlexbuild/jvm/dependency/conflict/documentation/CapabilityListing.kt +++ /dev/null @@ -1,44 +0,0 @@ -package gradlexbuild.jvm.dependency.conflict.documentation - -import org.gradle.api.DefaultTask -import org.gradle.api.artifacts.ComponentMetadataRule -import org.gradle.api.file.ConfigurableFileCollection -import org.gradle.api.file.RegularFileProperty -import org.gradle.api.tasks.Classpath -import org.gradle.api.tasks.OutputFile -import org.gradle.api.tasks.TaskAction -import java.net.URLClassLoader - -abstract class CapabilityListing : DefaultTask() { - - @get:OutputFile - abstract val outputFile: RegularFileProperty - - @get:Classpath - abstract val pluginClasses: ConfigurableFileCollection - - @TaskAction - fun update() { - val classesUrls = pluginClasses.files.map { it.toURI().toURL() } - val loader = URLClassLoader("pluginClasspath", classesUrls.toTypedArray(), ComponentMetadataRule::class.java.classLoader) - val definitions = loader.loadClass("org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition") - - val allCapabilities = definitions.enumConstants.map { rule -> - val capability = definitions.getDeclaredMethod("getCapability").invoke(rule) as String - val modules = definitions.getDeclaredMethod("getModules").invoke(rule) as List<*> - - Pair(capability, modules) - }.sortedBy { it.first } - - val capabilityList = allCapabilities.joinToString("") { c -> - "* ${c.first}\n${c.second.joinToString("") { "** ${(it as String).asRepoLink()}\n" }}" - } - - outputFile.get().asFile.also { - it.parentFile.mkdirs() - it.writeText(capabilityList) - } - } - - private fun String.asRepoLink() = "https://search.maven.org/artifact/${replace(":", "/")}[$this]" -} \ No newline at end of file diff --git a/gradle/plugins/settings.gradle.kts b/gradle/plugins/settings.gradle.kts deleted file mode 100644 index a647c18d..00000000 --- a/gradle/plugins/settings.gradle.kts +++ /dev/null @@ -1,11 +0,0 @@ -dependencyResolutionManagement { - repositories.gradlePluginPortal() -} - -include("build-lifecycle") -include("build-parameters") -include("documentation") - -if (!JavaVersion.current().isJava11Compatible) { - error("This build requires JDK 11 or higher") // The custom build logic that loads classes (e.g. ReadmeUpdate) fails otherwise -} diff --git a/settings.gradle.kts b/settings.gradle.kts index 0cfcc2ff..8d2871ca 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,29 +1,3 @@ -import buildparameters.BuildParametersExtension - -pluginManagement { - includeBuild("gradle/plugins") -} - -plugins { - id("com.gradle.develocity") version "4.2.2" - id("gradlexbuild.build-parameters") -} +plugins { id("org.gradlex.internal-build-conventions") version "0.8" } rootProject.name = "jvm-dependency-conflict-resolution" - -dependencyResolutionManagement { - repositories.mavenCentral() -} - -develocity { - buildScan { - // required until we can upgrade to Gradle 8.8 - val buildParameters = the() - if (buildParameters.ci) { - termsOfUseUrl = "https://gradle.com/help/legal-terms-of-use" - termsOfUseAgree = "yes" - } else { - publishing.onlyIf { false } - } - } -} diff --git a/src/test/groovy/org/gradlex/jvm/dependency/conflict/test/GuavaCapabilityConflictResolutionTest.groovy b/src/test/groovy/org/gradlex/jvm/dependency/conflict/test/GuavaCapabilityConflictResolutionTest.groovy index 18967226..48252b80 100644 --- a/src/test/groovy/org/gradlex/jvm/dependency/conflict/test/GuavaCapabilityConflictResolutionTest.groovy +++ b/src/test/groovy/org/gradlex/jvm/dependency/conflict/test/GuavaCapabilityConflictResolutionTest.groovy @@ -197,8 +197,3 @@ class GuavaCapabilityConflictResolutionTest extends Specification { ] } } -// ["classes.jar", "robolectric-4.7.2.jar", "junit-4.13.2.jar", "core-ktx-1.7.0-runtime.jar", "material-1.5.0-runtime.jar", "constraintlayout-2.0.1-runtime.jar", "appcompat-1.4.1-runtime.jar", "browser-1.3.0-runtime.jar", "exoplayer-2.13.3-runtime.jar", "shadows-framework-4.7.2.jar", "monitor-1.4.0-runtime.jar", "junit-4.7.2.jar", "resources-4.7.2.jar", "sandbox-4.7.2.jar", "utils-reflector-4.7.2.jar", "plugins-maven-dependency-resolver-4.7.2.jar", "shadowapi-4.7.2.jar", "utils-4.7.2.jar", "pluginapi-4.7.2.jar", "annotations-4.7.2.jar", "javax.inject-1.jar", "javax.annotation-api-1.3.2.jar", "bcprov-jdk15on-1.68.jar", "hamcrest-core-1.3.jar", "kotlin-stdlib-1.5.31.jar", "viewpager2-1.0.0-runtime.jar", "fragment-1.3.6-runtime.jar", "activity-1.2.4-runtime.jar", "appcompat-resources-1.4.1-runtime.jar", "emoji2-views-helper-1.0.0-runtime.jar", "emoji2-1.0.0-runtime.jar", "drawerlayout-1.1.1-runtime.jar", "coordinatorlayout-1.1.0-runtime.jar", "dynamicanimation-1.0.0-runtime.jar", "transition-1.2.0-runtime.jar", "vectordrawable-animated-1.1.0-runtime.jar", "vectordrawable-1.1.0-runtime.jar", "viewpager-1.0.0-runtime.jar", "legacy-support-core-utils-1.0.0-runtime.jar", "loader-1.0.0-runtime.jar", "exoplayer-ui-2.13.3-runtime.jar", "recyclerview-1.1.0-runtime.jar", "customview-1.1.0-runtime.jar", "media-1.2.1-runtime.jar", "core-1.7.0-runtime.jar", "cursoradapter-1.0.0-runtime.jar", "lifecycle-viewmodel-savedstate-2.3.1-runtime.jar", "savedstate-1.1.0-runtime.jar", "lifecycle-viewmodel-2.3.1-runtime.jar", "resourceinspection-annotation-1.0.0.jar", "cardview-1.0.0-runtime.jar", "versionedparcelable-1.1.1-runtime.jar", "collection-1.1.0.jar", "concurrent-futures-1.0.0.jar", "guava-27.1-android.jar", "interpolator-1.0.0-runtime.jar", "exoplayer-dash-2.13.3-runtime.jar", "exoplayer-hls-2.13.3-runtime.jar", "exoplayer-smoothstreaming-2.13.3-runtime.jar", "exoplayer-transformer-2.13.3-runtime.jar", "exoplayer-core-2.13.3-runtime.jar", "lifecycle-process-2.4.0-runtime.jar", "startup-runtime-1.0.0-runtime.jar", "tracing-1.0.0-runtime.jar", "lifecycle-livedata-2.0.0-runtime.jar", "lifecycle-livedata-core-2.3.1-runtime.jar", "lifecycle-runtime-2.4.0-runtime.jar", "core-runtime-2.1.0-runtime.jar", "core-common-2.1.0.jar", "exoplayer-extractor-2.13.3-runtime.jar", "exoplayer-common-2.13.3-runtime.jar", "documentfile-1.0.0-runtime.jar", "localbroadcastmanager-1.0.0-runtime.jar", "print-1.0.0-runtime.jar", "lifecycle-common-2.4.0.jar", "annotation-1.3.0.jar", "annotation-experimental-1.1.0-runtime.jar", "nativeruntime-4.7.2.jar", "asm-commons-9.2.jar", "asm-util-9.2.jar", "asm-analysis-9.2.jar", "asm-tree-9.2.jar", "asm-9.2.jar", "error_prone_annotations-2.9.0.jar", "sqlite4java-1.0.392.jar", "icu4j-53.1.jar", "auto-value-annotations-1.7.4.jar", "annotations-13.0.jar", "kotlin-stdlib-common-1.5.31.jar", "constraintlayout-solver-2.0.1.jar", "failureaccess-1.0.1.jar" ] -//| | | | | | -// | [classes.jar, robolectric-4.7.2.jar, junit-4.13.2.jar, shadows-framework-4.7.2.jar, resources-4.7.2.jar, junit-4.7.2.jar, sandbox-4.7.2.jar, utils-reflector-4.7.2.jar, plugins-maven-dependency-resolver-4.7.2.jar, shadowapi-4.7.2.jar, utils-4.7.2.jar, nativeruntime-4.7.2.jar, exoplayer-2.13.3-runtime.jar, exoplayer-dash-2.13.3-runtime.jar, exoplayer-hls-2.13.3-runtime.jar, exoplayer-smoothstreaming-2.13.3-runtime.jar, exoplayer-transformer-2.13.3-runtime.jar, exoplayer-ui-2.13.3-runtime.jar, exoplayer-core-2.13.3-runtime.jar, exoplayer-extractor-2.13.3-runtime.jar, exoplayer-common-2.13.3-runtime.jar, browser-1.3.0-runtime.jar, core-ktx-1.7.0-runtime.jar, material-1.5.0-runtime.jar, constraintlayout-2.0.1-runtime.jar, appcompat-1.4.1-runtime.jar, viewpager2-1.0.0-runtime.jar, fragment-1.3.6-runtime.jar, activity-1.2.4-runtime.jar, appcompat-resources-1.4.1-runtime.jar, emoji2-views-helper-1.0.0-runtime.jar, emoji2-1.0.0-runtime.jar, drawerlayout-1.1.1-runtime.jar, coordinatorlayout-1.1.0-runtime.jar, dynamicanimation-1.0.0-runtime.jar, transition-1.2.0-runtime.jar, vectordrawable-animated-1.1.0-runtime.jar, vectordrawable-1.1.0-runtime.jar, viewpager-1.0.0-runtime.jar, legacy-support-core-utils-1.0.0-runtime.jar, loader-1.0.0-runtime.jar, recyclerview-1.1.0-runtime.jar, customview-1.1.0-runtime.jar, media-1.2.1-runtime.jar, core-1.7.0-runtime.jar, concurrent-futures-1.0.0.jar, guava-27.1-android.jar, monitor-1.4.0-runtime.jar, pluginapi-4.7.2.jar, annotations-4.7.2.jar, javax.inject-1.jar, javax.annotation-api-1.3.2.jar, bcprov-jdk15on-1.68.jar, hamcrest-core-1.3.jar, failureaccess-1.0.1.jar, kotlin-stdlib-1.5.31.jar, cursoradapter-1.0.0-runtime.jar, lifecycle-viewmodel-savedstate-2.3.1-runtime.jar, savedstate-1.1.0-runtime.jar, lifecycle-viewmodel-2.3.1-runtime.jar, resourceinspection-annotation-1.0.0.jar, cardview-1.0.0-runtime.jar, versionedparcelable-1.1.1-runtime.jar, collection-1.1.0.jar, interpolator-1.0.0-runtime.jar, lifecycle-process-2.4.0-runtime.jar, startup-runtime-1.0.0-runtime.jar, tracing-1.0.0-runtime.jar, lifecycle-livedata-2.0.0-runtime.jar, lifecycle-livedata-core-2.3.1-runtime.jar, lifecycle-runtime-2.4.0-runtime.jar, core-runtime-2.1.0-runtime.jar, core-common-2.1.0.jar, documentfile-1.0.0-runtime.jar, localbroadcastmanager-1.0.0-runtime.jar, print-1.0.0-runtime.jar, lifecycle-common-2.4.0.jar, annotation-1.3.0.jar, annotation-experimental-1.1.0-runtime.jar, asm-commons-9.2.jar, asm-util-9.2.jar, asm-analysis-9.2.jar, asm-tree-9.2.jar, asm-9.2.jar, error_prone_annotations-2.9.0.jar, sqlite4java-1.0.392.jar, icu4j-53.1.jar, auto-value-annotations-1.7.4.jar, annotations-13.0.jar, kotlin-stdlib-common-1.5.31.jar, constraintlayout-solver-2.0.1.jar] -//| | [classes.jar, robolectric-4.7.2.jar, junit-4.13.2.jar, shadows-framework-4.7.2.jar, resources-4.7.2.jar, junit-4.7.2.jar, sandbox-4.7.2.jar, utils-reflector-4.7.2.jar, plugins-maven-dependency-resolver-4.7.2.jar, shadowapi-4.7.2.jar, utils-4.7.2.jar, nativeruntime-4.7.2.jar, exoplayer-2.13.3-runtime.jar, exoplayer-dash-2.13.3-runtime.jar, exoplayer-hls-2.13.3-runtime.jar, exoplayer-smoothstreaming-2.13.3-runtime.jar, exoplayer-transformer-2.13.3-runtime.jar, exoplayer-ui-2.13.3-runtime.jar, exoplayer-core-2.13.3-runtime.jar, exoplayer-extractor-2.13.3-runtime.jar, exoplayer-common-2.13.3-runtime.jar, browser-1.3.0-runtime.jar, core-ktx-1.7.0-runtime.jar, material-1.5.0-runtime.jar, constraintlayout-2.0.1-runtime.jar, appcompat-1.4.1-runtime.jar, viewpager2-1.0.0-runtime.jar, fragment-1.3.6-runtime.jar, activity-1.2.4-runtime.jar, appcompat-resources-1.4.1-runtime.jar, emoji2-views-helper-1.0.0-runtime.jar, emoji2-1.0.0-runtime.jar, drawerlayout-1.1.1-runtime.jar, coordinatorlayout-1.1.0-runtime.jar, dynamicanimation-1.0.0-runtime.jar, transition-1.2.0-runtime.jar, vectordrawable-animated-1.1.0-runtime.jar, vectordrawable-1.1.0-runtime.jar, viewpager-1.0.0-runtime.jar, legacy-support-core-utils-1.0.0-runtime.jar, loader-1.0.0-runtime.jar, recyclerview-1.1.0-runtime.jar, customview-1.1.0-runtime.jar, media-1.2.1-runtime.jar, core-1.7.0-runtime.jar, concurrent-futures-1.0.0.jar, guava-27.1-android.jar, monitor-1.4.0-runtime.jar, pluginapi-4.7.2.jar, annotations-4.7.2.jar, javax.inject-1.jar, javax.annotation-api-1.3.2.jar, bcprov-jdk15on-1.68.jar, hamcrest-core-1.3.jar, failureaccess-1.0.1.jar, kotlin-stdlib-1.5.31.jar, cursoradapter-1.0.0-runtime.jar, lifecycle-viewmodel-savedstate-2.3.1-runtime.jar, savedstate-1.1.0-runtime.jar, lifecycle-viewmodel-2.3.1-runtime.jar, resourceinspection-annotation-1.0.0.jar, cardview-1.0.0-runtime.jar, versionedparcelable-1.1.1-runtime.jar, collection-1.1.0.jar, interpolator-1.0.0-runtime.jar, lifecycle-process-2.4.0-runtime.jar, startup-runtime-1.0.0-runtime.jar, tracing-1.0.0-runtime.jar, lifecycle-livedata-2.0.0-runtime.jar, lifecycle-livedata-core-2.3.1-runtime.jar, lifecycle-runtime-2.4.0-runtime.jar, core-runtime-2.1.0-runtime.jar, core-common-2.1.0.jar, documentfile-1.0.0-runtime.jar, localbroadcastmanager-1.0.0-runtime.jar, print-1.0.0-runtime.jar, lifecycle-common-2.4.0.jar, annotation-1.3.0.jar, annotation-experimental-1.1.0-runtime.jar, asm-commons-9.2.jar, asm-util-9.2.jar, asm-analysis-9.2.jar, asm-tree-9.2.jar, asm-9.2.jar, error_prone_annotations-2.9.0.jar, sqlite4java-1.0.392.jar, icu4j-53.1.jar, auto-value-annotations-1.7.4.jar, annotations-13.0.jar, kotlin-stdlib-common-1.5.31.jar, constraintlayout-solver-2.0.1.jar] -//| | cl \ No newline at end of file diff --git a/src/test/groovy/org/gradlex/jvm/dependency/conflict/test/JarOverlapTest.groovy b/src/test/groovy/org/gradlex/jvm/dependency/conflict/test/JarOverlapTest.groovy index 0fc7b357..1ca554da 100644 --- a/src/test/groovy/org/gradlex/jvm/dependency/conflict/test/JarOverlapTest.groovy +++ b/src/test/groovy/org/gradlex/jvm/dependency/conflict/test/JarOverlapTest.groovy @@ -3,6 +3,7 @@ package org.gradlex.jvm.dependency.conflict.test import org.gradle.testfixtures.ProjectBuilder import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition import spock.lang.Specification +import spock.lang.Tag import java.util.zip.ZipFile @@ -39,6 +40,7 @@ class JarOverlapTest extends Specification { .collect { it.replace("\")", "") } } + @Tag("no-cross-version") def "capability definition is valid"(CapabilityDefinition definition) { given: def specificVersions = definitionSpecificVersions(definition) @@ -96,6 +98,7 @@ class JarOverlapTest extends Specification { def conf = project.getConfigurations().detachedConfiguration(*modules) conf.transitive = false + conf.resolutionStrategy.disableDependencyVerification() when: List>> jarClassFiles = conf.files.collect { jar -> diff --git a/src/test/groovy/org/gradlex/jvm/dependency/conflict/test/logging/AbstractLoggingCapabilitiesPluginFunctionalTest.groovy b/src/test/groovy/org/gradlex/jvm/dependency/conflict/test/logging/AbstractLoggingCapabilitiesPluginFunctionalTest.groovy index 72caedae..6437a050 100644 --- a/src/test/groovy/org/gradlex/jvm/dependency/conflict/test/logging/AbstractLoggingCapabilitiesPluginFunctionalTest.groovy +++ b/src/test/groovy/org/gradlex/jvm/dependency/conflict/test/logging/AbstractLoggingCapabilitiesPluginFunctionalTest.groovy @@ -11,7 +11,7 @@ import java.nio.file.Path abstract class AbstractLoggingCapabilitiesPluginFunctionalTest extends Specification { - static GradleVersion testGradleVersion = System.getProperty("test.gradle-version")?.with { GradleVersion.version(it) } ?: GradleVersion.current() + static GradleVersion testGradleVersion = System.getProperty("gradleVersionUnderTest")?.with { GradleVersion.version(it) } ?: GradleVersion.current() @TempDir Path testFolder diff --git a/src/test/java/org/gradlex/jvm/dependency/conflict/samples/SamplesTest.java b/src/test/java/org/gradlex/jvm/dependency/conflict/samples/SamplesTest.java deleted file mode 100644 index a0c667a2..00000000 --- a/src/test/java/org/gradlex/jvm/dependency/conflict/samples/SamplesTest.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - -package org.gradlex.jvm.dependency.conflict.samples; - -import org.gradle.exemplar.test.runner.SampleModifiers; -import org.gradle.exemplar.test.runner.SamplesRoot; -import org.gradle.exemplar.test.runner.SamplesRunner; -import org.junit.runner.RunWith; - -@RunWith(SamplesRunner.class) -@SamplesRoot("samples") -@SampleModifiers(PluginBuildLocationSampleModifier.class) -public class SamplesTest { - -} diff --git a/src/test/java/org/gradlex/jvm/dependency/conflict/samples/PluginBuildLocationSampleModifier.java b/src/testSamples/java/org/gradlex/jvm/dependency/conflict/samples/PluginBuildLocationSampleModifier.java similarity index 57% rename from src/test/java/org/gradlex/jvm/dependency/conflict/samples/PluginBuildLocationSampleModifier.java rename to src/testSamples/java/org/gradlex/jvm/dependency/conflict/samples/PluginBuildLocationSampleModifier.java index af186379..2f438d2c 100644 --- a/src/test/java/org/gradlex/jvm/dependency/conflict/samples/PluginBuildLocationSampleModifier.java +++ b/src/testSamples/java/org/gradlex/jvm/dependency/conflict/samples/PluginBuildLocationSampleModifier.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.samples; -import org.gradle.exemplar.model.Command; -import org.gradle.exemplar.model.Sample; -import org.gradle.exemplar.test.runner.SampleModifier; - import java.io.File; import java.lang.management.ManagementFactory; import java.util.ArrayList; import java.util.Arrays; +import org.gradle.exemplar.model.Command; +import org.gradle.exemplar.model.Sample; +import org.gradle.exemplar.test.runner.SampleModifier; public class PluginBuildLocationSampleModifier implements SampleModifier { @Override @@ -31,12 +15,18 @@ public Sample modify(Sample sampleIn) { Command cmd = sampleIn.getCommands().remove(0); File pluginProjectDir = new File("."); ArrayList allArgs = new ArrayList<>(cmd.getArgs()); - allArgs.addAll(Arrays.asList("dependencies", "--configuration=compileClasspath", "-s", "-q", "-PpluginLocation=" + pluginProjectDir.getAbsolutePath())); + allArgs.addAll(Arrays.asList( + "dependencies", + "--configuration=compileClasspath", + "-s", + "-q", + "-PpluginLocation=" + pluginProjectDir.getAbsolutePath())); if (ManagementFactory.getRuntimeMXBean().getInputArguments().toString().contains("-agentlib:jdwp")) { allArgs.add("-Dorg.gradle.debug=true"); } - sampleIn.getCommands().add( - new Command(new File(pluginProjectDir, "./gradlew").getAbsolutePath(), + sampleIn.getCommands() + .add(new Command( + new File(pluginProjectDir, "./gradlew").getAbsolutePath(), cmd.getExecutionSubdirectory(), allArgs, cmd.getFlags(), diff --git a/src/testSamples/java/org/gradlex/jvm/dependency/conflict/samples/SamplesTest.java b/src/testSamples/java/org/gradlex/jvm/dependency/conflict/samples/SamplesTest.java new file mode 100644 index 00000000..ed072be0 --- /dev/null +++ b/src/testSamples/java/org/gradlex/jvm/dependency/conflict/samples/SamplesTest.java @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: Apache-2.0 +package org.gradlex.jvm.dependency.conflict.samples; + +import org.gradle.exemplar.test.runner.SampleModifiers; +import org.gradle.exemplar.test.runner.SamplesRoot; +import org.gradle.exemplar.test.runner.SamplesRunner; +import org.junit.runner.RunWith; + +@RunWith(SamplesRunner.class) +@SamplesRoot("samples") +@SampleModifiers(PluginBuildLocationSampleModifier.class) +public class SamplesTest {} From 5fb063638497c1292608f3c6a53b02ab4932a4b0 Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Thu, 30 Oct 2025 17:52:25 +0100 Subject: [PATCH 2/4] Format code --- .../JvmDependencyConflictDetectionPlugin.java | 27 +- .../conflict/detection/package-info.java | 19 +- .../detection/rules/AlignmentDefinition.java | 69 +-- .../rules/AlignmentDefinitionRule.java | 26 +- .../detection/rules/CapabilityDefinition.java | 544 ++++++++---------- .../rules/CapabilityDefinitionRule.java | 31 +- .../FixedVersionCapabilityDefinitionRule.java | 22 +- .../rules/aopalliance/AopallianceRule.java | 23 +- .../rules/aopalliance/package-info.java | 19 +- .../detection/rules/asm/AsmAlignmentRule.java | 20 +- .../rules/bouncycastle/BouncyCastleRule.java | 20 +- .../rules/bouncycastle/package-info.java | 19 +- .../guava/GuavaListenableFutureRule.java | 20 +- .../detection/rules/guava/package-info.java | 19 +- .../jakarta/JakartaActivationApiRule.java | 24 +- .../JakartaActivationImplementationRule.java | 24 +- .../jakarta/JakartaAnnotationApiRule.java | 24 +- .../rules/jakarta/JakartaJwsApiRule.java | 20 +- .../rules/jakarta/JakartaMailApiRule.java | 24 +- .../rules/jakarta/JakartaServletApiRule.java | 24 +- .../jakarta/JakartaWebsocketApiRule.java | 24 +- .../JakartaWebsocketClientApiRule.java | 24 +- .../rules/jakarta/JakartaWsRsApiRule.java | 20 +- .../rules/jakarta/JavaxActivationApiRule.java | 20 +- .../rules/jakarta/JavaxAnnotationApiRule.java | 20 +- .../rules/jakarta/JavaxEjbApiRule.java | 20 +- .../rules/jakarta/JavaxElApiRule.java | 20 +- .../rules/jakarta/JavaxInjectApiRule.java | 22 +- .../rules/jakarta/JavaxJsonApiRule.java | 20 +- .../rules/jakarta/JavaxJwsApisRule.java | 21 +- .../rules/jakarta/JavaxMailApiRule.java | 20 +- .../jakarta/JavaxPersistenceApiRule.java | 20 +- .../rules/jakarta/JavaxServletApiRule.java | 24 +- .../rules/jakarta/JavaxServletJspRule.java | 21 +- .../rules/jakarta/JavaxServletJstlRule.java | 20 +- .../rules/jakarta/JavaxSoapApiRule.java | 21 +- .../jakarta/JavaxTransactionApiRule.java | 20 +- .../rules/jakarta/JavaxValidationApiRule.java | 20 +- .../rules/jakarta/JavaxWebsocketApiRule.java | 20 +- .../rules/jakarta/JavaxWsRsApiRule.java | 26 +- .../rules/jakarta/JavaxXmlBindApiRule.java | 20 +- .../rules/jakarta/JavaxXmlWsApiRule.java | 20 +- .../detection/rules/jakarta/package-info.java | 19 +- .../rules/jetty/JettyAlignmentRule.java | 20 +- .../rules/logging/Log4J2Alignment.java | 20 +- .../logging/LoggingModuleIdentifiers.java | 17 +- .../rules/logging/Slf4J2Alignment.java | 20 +- .../rules/logging/Slf4JAlignment.java | 20 +- .../detection/rules/logging/package-info.java | 19 +- .../detection/rules/package-info.java | 19 +- .../detection/util/VersionNumber.java | 21 +- .../resolution/ConflictResolution.java | 63 +- .../resolution/ConsistentResolution.java | 90 ++- .../resolution/DefaultResolutionStrategy.java | 17 +- ...ncyConflictDetectionPluginApplication.java | 31 +- ...JvmDependencyConflictResolutionPlugin.java | 70 ++- .../JvmDependencyConflictsExtension.java | 20 +- .../conflict/resolution/Logging.java | 246 +++++--- .../dependency/conflict/resolution/Patch.java | 31 +- .../conflict/resolution/PatchModule.java | 76 +-- .../Slf4JEnforcementSubstitutionsUsing.java | 51 +- .../conflict/resolution/package-info.java | 19 +- .../AddAlignmentConstraintsMetadataRule.java | 24 +- .../rules/AddApiDependencyMetadataRule.java | 31 +- .../rules/AddBomDependencyMetadataRule.java | 28 +- .../rules/AddCapabilityMetadataRule.java | 19 +- ...dCompileOnlyApiDependencyMetadataRule.java | 30 +- .../rules/AddFeatureMetadataRule.java | 23 +- .../AddRuntimeOnlyDependencyMetadataRule.java | 30 +- ...AddTargetPlatformVariantsMetadataRule.java | 34 +- .../resolution/rules/ComponentStatusRule.java | 22 +- .../resolution/rules/GuavaComponentRule.java | 69 ++- ...oCompileOnlyApiDependencyMetadataRule.java | 36 +- ...ceToRuntimeOnlyDependencyMetadataRule.java | 36 +- .../rules/RemoveCapabilityMetadataRule.java | 20 +- .../rules/RemoveDependencyMetadataRule.java | 37 +- .../rules/VariantIdentification.java | 22 +- .../resolution/rules/VariantSelection.java | 51 +- .../resolution/rules/package-info.java | 19 +- 79 files changed, 914 insertions(+), 1987 deletions(-) diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/JvmDependencyConflictDetectionPlugin.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/JvmDependencyConflictDetectionPlugin.java index 6dd7da86..60cb2e8a 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/JvmDependencyConflictDetectionPlugin.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/JvmDependencyConflictDetectionPlugin.java @@ -1,19 +1,4 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection; import org.gradle.api.Plugin; @@ -35,7 +20,8 @@ public class JvmDependencyConflictDetectionPlugin implements Plugin modules; diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/AlignmentDefinitionRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/AlignmentDefinitionRule.java index 7140f74a..a589119d 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/AlignmentDefinitionRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/AlignmentDefinitionRule.java @@ -1,21 +1,7 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ComponentMetadataContext; import org.gradle.api.artifacts.ComponentMetadataDetails; @@ -24,8 +10,6 @@ import org.gradle.api.attributes.Category; import org.gradle.api.model.ObjectFactory; -import javax.inject.Inject; - @CacheableRule public abstract class AlignmentDefinitionRule implements ComponentMetadataRule { @@ -53,8 +37,10 @@ public final void execute(ComponentMetadataContext context) { void applyWithBom(ComponentMetadataDetails details) { String version = details.getId().getVersion(); - details.allVariants(v -> v.withDependencies(dependencies -> dependencies.add(definition.getBom() + ":" + version, - d -> d.attributes(a -> a.attribute(Category.CATEGORY_ATTRIBUTE, getObjects().named(Category.class, Category.REGULAR_PLATFORM)))))); + details.allVariants(v -> v.withDependencies(dependencies -> dependencies.add( + definition.getBom() + ":" + version, + d -> d.attributes(a -> a.attribute( + Category.CATEGORY_ATTRIBUTE, getObjects().named(Category.class, Category.REGULAR_PLATFORM)))))); } void applyWithoutBom(ComponentMetadataDetails details) { diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/CapabilityDefinition.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/CapabilityDefinition.java index 4a451398..a5c58f18 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/CapabilityDefinition.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/CapabilityDefinition.java @@ -1,21 +1,12 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules; +import static org.gradlex.jvm.dependency.conflict.resolution.DefaultResolutionStrategy.FIRST_MODULE; +import static org.gradlex.jvm.dependency.conflict.resolution.DefaultResolutionStrategy.HIGHEST_VERSION; +import static org.gradlex.jvm.dependency.conflict.resolution.DefaultResolutionStrategy.NONE; + +import java.util.Arrays; +import java.util.List; import org.gradlex.jvm.dependency.conflict.detection.rules.aopalliance.AopallianceRule; import org.gradlex.jvm.dependency.conflict.detection.rules.bouncycastle.BouncyCastleRule; import org.gradlex.jvm.dependency.conflict.detection.rules.guava.GuavaListenableFutureRule; @@ -49,28 +40,13 @@ import org.gradlex.jvm.dependency.conflict.detection.rules.logging.LoggingModuleIdentifiers; import org.gradlex.jvm.dependency.conflict.resolution.DefaultResolutionStrategy; -import java.util.Arrays; -import java.util.List; - -import static org.gradlex.jvm.dependency.conflict.resolution.DefaultResolutionStrategy.FIRST_MODULE; -import static org.gradlex.jvm.dependency.conflict.resolution.DefaultResolutionStrategy.HIGHEST_VERSION; -import static org.gradlex.jvm.dependency.conflict.resolution.DefaultResolutionStrategy.NONE; - public enum CapabilityDefinition { - - AOPALLIANCE(HIGHEST_VERSION, AopallianceRule.class, - "aopalliance:aopalliance", - "org.springframework:spring-aop" - ), - APACHE_CSV(HIGHEST_VERSION, - "org.apache.solr:solr-commons-csv", - "org.apache.commons:commons-csv" - ), - ASM(HIGHEST_VERSION, - "asm:asm", - "org.ow2.asm:asm" - ), - BOUNCYCASTLE_BCMAIL(HIGHEST_VERSION, BouncyCastleRule.class, + AOPALLIANCE(HIGHEST_VERSION, AopallianceRule.class, "aopalliance:aopalliance", "org.springframework:spring-aop"), + APACHE_CSV(HIGHEST_VERSION, "org.apache.solr:solr-commons-csv", "org.apache.commons:commons-csv"), + ASM(HIGHEST_VERSION, "asm:asm", "org.ow2.asm:asm"), + BOUNCYCASTLE_BCMAIL( + HIGHEST_VERSION, + BouncyCastleRule.class, "org.bouncycastle:bcmail-fips", "org.bouncycastle:bcmail-jdk14", "org.bouncycastle:bcmail-jdk15", @@ -83,9 +59,10 @@ public enum CapabilityDefinition { "org.bouncycastle:bcjmail-jdk15on", "org.bouncycastle:bcjmail-jdk15to18", "org.bouncycastle:bcjmail-jdk18on", - "org.bouncycastle:bcjmail-lts8on" - ), - BOUNCYCASTLE_BCPG(HIGHEST_VERSION, BouncyCastleRule.class, + "org.bouncycastle:bcjmail-lts8on"), + BOUNCYCASTLE_BCPG( + HIGHEST_VERSION, + BouncyCastleRule.class, "org.bouncycastle:bcpg-fips", "org.bouncycastle:bcpg-jdk12", "org.bouncycastle:bcpg-jdk14", @@ -95,17 +72,19 @@ public enum CapabilityDefinition { "org.bouncycastle:bcpg-jdk15to18", "org.bouncycastle:bcpg-jdk16", "org.bouncycastle:bcpg-jdk18on", - "org.bouncycastle:bcpg-lts8on" - ), - BOUNCYCASTLE_BCPKIX(HIGHEST_VERSION, BouncyCastleRule.class, + "org.bouncycastle:bcpg-lts8on"), + BOUNCYCASTLE_BCPKIX( + HIGHEST_VERSION, + BouncyCastleRule.class, "org.bouncycastle:bcpkix-fips", "org.bouncycastle:bcpkix-jdk14", "org.bouncycastle:bcpkix-jdk15on", "org.bouncycastle:bcpkix-jdk15to18", "org.bouncycastle:bcpkix-jdk18on", - "org.bouncycastle:bcpkix-lts8on" - ), - BOUNCYCASTLE_BCPROV(HIGHEST_VERSION, BouncyCastleRule.class, + "org.bouncycastle:bcpkix-lts8on"), + BOUNCYCASTLE_BCPROV( + HIGHEST_VERSION, + BouncyCastleRule.class, "org.bouncycastle:bcprov-debug-jdk14", "org.bouncycastle:bcprov-debug-jdk15on", "org.bouncycastle:bcprov-debug-jdk15to18", @@ -130,254 +109,188 @@ public enum CapabilityDefinition { "org.bouncycastle:bcprov-jdk18on", "org.bouncycastle:bcprov-lts8on", "org.bouncycastle:bc-fips", - "org.bouncycastle:bc-fips-debug" - ), - BOUNCYCASTLE_BCTLS(HIGHEST_VERSION, BouncyCastleRule.class, + "org.bouncycastle:bc-fips-debug"), + BOUNCYCASTLE_BCTLS( + HIGHEST_VERSION, + BouncyCastleRule.class, "org.bouncycastle:bctls-jdk14", "org.bouncycastle:bctls-jdk15on", "org.bouncycastle:bctls-jdk15to18", "org.bouncycastle:bctls-jdk18on", "org.bouncycastle:bctls-lts8on", - "org.bouncycastle:bctls-fips" - ), - BOUNCYCASTLE_BCTSP(HIGHEST_VERSION, BouncyCastleRule.class, + "org.bouncycastle:bctls-fips"), + BOUNCYCASTLE_BCTSP( + HIGHEST_VERSION, + BouncyCastleRule.class, "org.bouncycastle:bctsp-jdk14", "org.bouncycastle:bctsp-jdk15", "org.bouncycastle:bctsp-jdk15+", "org.bouncycastle:bctsp-jdk15on", - "org.bouncycastle:bctsp-jdk16" - ), - BOUNCYCASTLE_BCUTIL(HIGHEST_VERSION, BouncyCastleRule.class, + "org.bouncycastle:bctsp-jdk16"), + BOUNCYCASTLE_BCUTIL( + HIGHEST_VERSION, + BouncyCastleRule.class, "org.bouncycastle:bcutil-jdk14", "org.bouncycastle:bcutil-jdk15on", "org.bouncycastle:bcutil-jdk15to18", "org.bouncycastle:bcutil-jdk18on", - "org.bouncycastle:bcutil-lts8on" - ), - C3P0(HIGHEST_VERSION, - "c3p0:c3p0", - "com.mchange:c3p0" - ), - MCHANGE_COMMONS_JAVA(HIGHEST_VERSION, - "c3p0:c3p0", - "com.mchange:mchange-commons-java" - ), - CGLIB(HIGHEST_VERSION, - "cglib:cglib", - "cglib:cglib-nodep" - ), - COMMONS_BEANUTILS(HIGHEST_VERSION, - "commons-beanutils:commons-beanutils-core", - "commons-beanutils:commons-beanutils" - ), - COMMONS_IO(HIGHEST_VERSION, - "commons-io:commons-io", - "org.apache.commons:commons-io" - ), - DK_BRICS_AUTOMATON(HIGHEST_VERSION, - "dk.brics.automaton:automaton", - "dk.brics:automaton" - ), - DOM4J(HIGHEST_VERSION, - "dom4j:dom4j", - "org.dom4j:dom4j" - ), - FINDBUGS_ANNOTATIONS(HIGHEST_VERSION, + "org.bouncycastle:bcutil-lts8on"), + C3P0(HIGHEST_VERSION, "c3p0:c3p0", "com.mchange:c3p0"), + MCHANGE_COMMONS_JAVA(HIGHEST_VERSION, "c3p0:c3p0", "com.mchange:mchange-commons-java"), + CGLIB(HIGHEST_VERSION, "cglib:cglib", "cglib:cglib-nodep"), + COMMONS_BEANUTILS( + HIGHEST_VERSION, "commons-beanutils:commons-beanutils-core", "commons-beanutils:commons-beanutils"), + COMMONS_IO(HIGHEST_VERSION, "commons-io:commons-io", "org.apache.commons:commons-io"), + DK_BRICS_AUTOMATON(HIGHEST_VERSION, "dk.brics.automaton:automaton", "dk.brics:automaton"), + DOM4J(HIGHEST_VERSION, "dom4j:dom4j", "org.dom4j:dom4j"), + FINDBUGS_ANNOTATIONS( + HIGHEST_VERSION, "com.google.code.findbugs:annotations", "com.google.code.findbugs:findbugs-annotations", - "com.github.spotbugs:spotbugs-annotations" - ), - GOOGLE_COLLECTIONS(HIGHEST_VERSION, "com.google.collections", CapabilityDefinitionRule.class, + "com.github.spotbugs:spotbugs-annotations"), + GOOGLE_COLLECTIONS( + HIGHEST_VERSION, + "com.google.collections", + CapabilityDefinitionRule.class, "com.google.collections:google-collections", - "com.google.guava:guava" - ), - GUAVA(HIGHEST_VERSION, + "com.google.guava:guava"), + GUAVA(HIGHEST_VERSION, "com.google.guava:guava", "com.google.guava:guava-jdk5"), + JZY3D_EMUL_GL(HIGHEST_VERSION, "org.jzy3d:jzy3d-emul-gl", "org.jzy3d:jzy3d-emul-gl-awt"), + JZY3D_JGL(HIGHEST_VERSION, "org.jzy3d:jGL", "org.jzy3d:jzy3d-jGL-awt"), + LZ4(HIGHEST_VERSION, "net.jpountz.lz4:lz4", "org.lz4:lz4-java"), + LISTENABLEFUTURE( + FIRST_MODULE, + "com.google.guava", + GuavaListenableFutureRule.class, "com.google.guava:guava", - "com.google.guava:guava-jdk5" - ), - JZY3D_EMUL_GL(HIGHEST_VERSION, - "org.jzy3d:jzy3d-emul-gl", - "org.jzy3d:jzy3d-emul-gl-awt" - ), - JZY3D_JGL(HIGHEST_VERSION, - "org.jzy3d:jGL", - "org.jzy3d:jzy3d-jGL-awt" - ), - LZ4(HIGHEST_VERSION, - "net.jpountz.lz4:lz4", - "org.lz4:lz4-java" - ), - LISTENABLEFUTURE(FIRST_MODULE, "com.google.guava", GuavaListenableFutureRule.class, - "com.google.guava:guava", - "com.google.guava:listenablefuture" - ), - HAMCREST_LIBRARY(FIRST_MODULE, - "org.hamcrest:hamcrest", - "org.hamcrest:hamcrest-library" - ), - HAMCREST_CORE(FIRST_MODULE, - "org.hamcrest:hamcrest", - "org.hamcrest:hamcrest-core" - ), - HIKARI_CP(HIGHEST_VERSION, - "com.zaxxer:HikariCP", - "com.zaxxer:HikariCP-java6", - "com.zaxxer:HikariCP-java7" - ), - INTELLIJ_ANNOTATIONS(HIGHEST_VERSION, - "org.jetbrains:annotations", - "com.intellij:annotations" - ), - ITEXT(HIGHEST_VERSION, - "itext:itext", - "com.lowagie:itext", - "com.github.librepdf:openpdf" - ), - JAVA_ASSIST(HIGHEST_VERSION, - "javassist:javassist", - "org.javassist:javassist", - "jboss:javassist" - ), - JCIP_ANNOTATIONS(HIGHEST_VERSION, - "net.jcip:jcip-annotations", - "com.github.stephenc.jcip:jcip-annotations" - ), - JNA_PLATFORM(HIGHEST_VERSION, + "com.google.guava:listenablefuture"), + HAMCREST_LIBRARY(FIRST_MODULE, "org.hamcrest:hamcrest", "org.hamcrest:hamcrest-library"), + HAMCREST_CORE(FIRST_MODULE, "org.hamcrest:hamcrest", "org.hamcrest:hamcrest-core"), + HIKARI_CP(HIGHEST_VERSION, "com.zaxxer:HikariCP", "com.zaxxer:HikariCP-java6", "com.zaxxer:HikariCP-java7"), + INTELLIJ_ANNOTATIONS(HIGHEST_VERSION, "org.jetbrains:annotations", "com.intellij:annotations"), + ITEXT(HIGHEST_VERSION, "itext:itext", "com.lowagie:itext", "com.github.librepdf:openpdf"), + JAVA_ASSIST(HIGHEST_VERSION, "javassist:javassist", "org.javassist:javassist", "jboss:javassist"), + JCIP_ANNOTATIONS(HIGHEST_VERSION, "net.jcip:jcip-annotations", "com.github.stephenc.jcip:jcip-annotations"), + JNA_PLATFORM( + HIGHEST_VERSION, "net.java.dev.jna:platform", "net.java.dev.jna:jna-platform", - "net.java.dev.jna:jna-platform-jpms" - ), - JNA(HIGHEST_VERSION, - "net.java.dev.jna:jna", - "net.java.dev.jna:jna-jpms", - "org.elasticsearch:jna" - ), - JTS_CORE(HIGHEST_VERSION, - "com.vividsolutions:jts", - "com.vividsolutions:jts-core" - ), - JUNIT(HIGHEST_VERSION, - "junit:junit", - "junit:junit-dep" - ), - MIGLAYOUT(HIGHEST_VERSION, - "com.miglayout:miglayout-swing", - "com.miglayout:miglayout" - ), + "net.java.dev.jna:jna-platform-jpms"), + JNA(HIGHEST_VERSION, "net.java.dev.jna:jna", "net.java.dev.jna:jna-jpms", "org.elasticsearch:jna"), + JTS_CORE(HIGHEST_VERSION, "com.vividsolutions:jts", "com.vividsolutions:jts-core"), + JUNIT(HIGHEST_VERSION, "junit:junit", "junit:junit-dep"), + MIGLAYOUT(HIGHEST_VERSION, "com.miglayout:miglayout-swing", "com.miglayout:miglayout"), /** * See spring-projects/spring-boot/issues/32881 */ - ORG_JSON(HIGHEST_VERSION, - "com.vaadin.external.google:android-json", - "org.json:json" - ), - MYSQL_CONNECTOR_JAVA(HIGHEST_VERSION, - "mysql:mysql-connector-java", - "com.mysql:mysql-connector-j" - ), - POSTGRESQL(HIGHEST_VERSION, - "postgresql:postgresql", - "org.postgresql:postgresql" - ), - STAX_API(HIGHEST_VERSION, - "stax:stax-api", - "javax.xml.stream:stax-api" - ), - VELOCITY(HIGHEST_VERSION, + ORG_JSON(HIGHEST_VERSION, "com.vaadin.external.google:android-json", "org.json:json"), + MYSQL_CONNECTOR_JAVA(HIGHEST_VERSION, "mysql:mysql-connector-java", "com.mysql:mysql-connector-j"), + POSTGRESQL(HIGHEST_VERSION, "postgresql:postgresql", "org.postgresql:postgresql"), + STAX_API(HIGHEST_VERSION, "stax:stax-api", "javax.xml.stream:stax-api"), + VELOCITY( + HIGHEST_VERSION, "velocity:velocity", "org.apache.velocity:velocity", - "org.apache.velocity:velocity-engine-core" - ), - WOODSTOX_ASL(HIGHEST_VERSION, + "org.apache.velocity:velocity-engine-core"), + WOODSTOX_ASL( + HIGHEST_VERSION, "org.codehaus.woodstox:woodstox-core-asl", "org.codehaus.woodstox:woodstox-core-lgpl", "org.codehaus.woodstox:wstx-asl", "org.codehaus.woodstox:wstx-lgpl", "woodstox:wstx-asl", - "woodstox:wstx-lgpl" - ), - JAKARTA_ACTIVATION_API(HIGHEST_VERSION, JakartaActivationApiRule.class, + "woodstox:wstx-lgpl"), + JAKARTA_ACTIVATION_API( + HIGHEST_VERSION, + JakartaActivationApiRule.class, "jakarta.activation:jakarta.activation-api", - "com.sun.activation:jakarta.activation" - ), - JAKARTA_ANNOTATION_API(HIGHEST_VERSION, JakartaAnnotationApiRule.class, + "com.sun.activation:jakarta.activation"), + JAKARTA_ANNOTATION_API( + HIGHEST_VERSION, + JakartaAnnotationApiRule.class, "jakarta.annotation:jakarta.annotation-api", - "org.apache.tomcat:tomcat-annotations-api" - ), - JAKARTA_JSON_API(HIGHEST_VERSION, - "jakarta.json:jakarta.json-api", - "org.glassfish:jakarta.json" - ), - JAKARTA_MAIL_API(HIGHEST_VERSION, JakartaMailApiRule.class, + "org.apache.tomcat:tomcat-annotations-api"), + JAKARTA_JSON_API(HIGHEST_VERSION, "jakarta.json:jakarta.json-api", "org.glassfish:jakarta.json"), + JAKARTA_MAIL_API( + HIGHEST_VERSION, + JakartaMailApiRule.class, "jakarta.mail:jakarta.mail-api", "com.sun.mail:mailapi", "com.sun.mail:jakarta.mail", - "org.eclipse.angus:jakarta.mail" - ), - JAKARTA_SERVLET_API(HIGHEST_VERSION, JakartaServletApiRule.class, + "org.eclipse.angus:jakarta.mail"), + JAKARTA_SERVLET_API( + HIGHEST_VERSION, + JakartaServletApiRule.class, "jakarta.servlet:jakarta.servlet-api", "org.apache.tomcat:tomcat-servlet-api", "org.apache.tomcat.embed:tomcat-embed-core", - "org.eclipse.jetty.toolchain:jetty-jakarta-servlet-api" - ), - JAKARTA_WEBSOCKET_API(HIGHEST_VERSION, JakartaWebsocketApiRule.class, + "org.eclipse.jetty.toolchain:jetty-jakarta-servlet-api"), + JAKARTA_WEBSOCKET_API( + HIGHEST_VERSION, + JakartaWebsocketApiRule.class, "jakarta.websocket:jakarta.websocket-api", "org.apache.tomcat:tomcat-websocket-api", "org.apache.tomcat.embed:tomcat-embed-websocket", - "org.eclipse.jetty.toolchain:jetty-jakarta-websocket-api" - ), - JAKARTA_WEBSOCKET_CLIENT_API(HIGHEST_VERSION, JakartaWebsocketClientApiRule.class, + "org.eclipse.jetty.toolchain:jetty-jakarta-websocket-api"), + JAKARTA_WEBSOCKET_CLIENT_API( + HIGHEST_VERSION, + JakartaWebsocketClientApiRule.class, "jakarta.websocket:jakarta.websocket-client-api", "org.apache.tomcat:tomcat-websocket-client-api", "org.apache.tomcat.embed:tomcat-embed-websocket", - "org.eclipse.jetty.toolchain:jetty-jakarta-websocket-api" - ), - JAKARTA_WS_RS_API(HIGHEST_VERSION, JakartaWsRsApiRule.class, + "org.eclipse.jetty.toolchain:jetty-jakarta-websocket-api"), + JAKARTA_WS_RS_API( + HIGHEST_VERSION, + JakartaWsRsApiRule.class, "jakarta.ws.rs:jakarta.ws.rs-api", - "org.jboss.spec.javax.ws.rs:jboss-jaxrs-api_3.0_spec" - ), + "org.jboss.spec.javax.ws.rs:jboss-jaxrs-api_3.0_spec"), - JAVAX_ACTIVATION_API(HIGHEST_VERSION, JavaxActivationApiRule.class, + JAVAX_ACTIVATION_API( + HIGHEST_VERSION, + JavaxActivationApiRule.class, "javax.activation:activation", "jakarta.activation:jakarta.activation-api", "javax.activation:javax.activation-api", "com.sun.activation:javax.activation", - "com.sun.activation:jakarta.activation" - ), - JAVAX_ANNOTATION_API(HIGHEST_VERSION, JavaxAnnotationApiRule.class, + "com.sun.activation:jakarta.activation"), + JAVAX_ANNOTATION_API( + HIGHEST_VERSION, + JavaxAnnotationApiRule.class, "javax.annotation:jsr250-api", "jakarta.annotation:jakarta.annotation-api", "javax.annotation:javax.annotation-api", - "org.apache.tomcat:tomcat-annotations-api" - ), - JAVAX_EJB_API(HIGHEST_VERSION, JavaxEjbApiRule.class, + "org.apache.tomcat:tomcat-annotations-api"), + JAVAX_EJB_API( + HIGHEST_VERSION, + JavaxEjbApiRule.class, "jakarta.ejb:jakarta.ejb-api", "javax.ejb:javax.ejb-api", - "javax.ejb:ejb-api" - ), - JAVAX_EL_API(HIGHEST_VERSION, JavaxElApiRule.class, + "javax.ejb:ejb-api"), + JAVAX_EL_API( + HIGHEST_VERSION, + JavaxElApiRule.class, "javax.el:el-api", "jakarta.el:jakarta.el-api", - "javax.el:javax.el-api" - ), - JAVAX_INJECT_API(HIGHEST_VERSION, JavaxInjectApiRule.class, + "javax.el:javax.el-api"), + JAVAX_INJECT_API( + HIGHEST_VERSION, + JavaxInjectApiRule.class, "javax.inject:javax.inject", "jakarta.inject:jakarta.inject-api", "com.jwebmp:javax.inject", "org.glassfish.hk2.external:javax.inject", - "org.glassfish.hk2.external:jakarta.inject" - ), - JAVAX_JSON_API(HIGHEST_VERSION, JavaxJsonApiRule.class, + "org.glassfish.hk2.external:jakarta.inject"), + JAVAX_JSON_API( + HIGHEST_VERSION, + JavaxJsonApiRule.class, "javax.json:javax.json-api", "jakarta.json:jakarta.json-api", "org.glassfish:javax.json", - "org.glassfish:jakarta.json" - ), - JAVAX_JWS_API(HIGHEST_VERSION, JavaxJwsApisRule.class, - "javax.jws:javax.jws-api", - "jakarta.jws:jakarta.jws-api" - ), - JAVAX_MAIL_API(HIGHEST_VERSION, JavaxMailApiRule.class, + "org.glassfish:jakarta.json"), + JAVAX_JWS_API(HIGHEST_VERSION, JavaxJwsApisRule.class, "javax.jws:javax.jws-api", "jakarta.jws:jakarta.jws-api"), + JAVAX_MAIL_API( + HIGHEST_VERSION, + JavaxMailApiRule.class, "com.sun.mail:mailapi", // API only "jakarta.mail:jakarta.mail-api", // API only "javax.mail:javax.mail-api", // API only @@ -389,87 +302,97 @@ public enum CapabilityDefinition { "org.apache.geronimo.javamail:geronimo-javamail_1.4_mail", "org.apache.geronimo.specs:geronimo-javamail_1.4_spec", "org.apache.geronimo.javamail:geronimo-javamail_1.6_mail", - "org.apache.geronimo.specs:geronimo-javamail_1.6_spec" - ), - JAVAX_MAIL_PROVIDER(HIGHEST_VERSION, JavaxMailApiRule.class, + "org.apache.geronimo.specs:geronimo-javamail_1.6_spec"), + JAVAX_MAIL_PROVIDER( + HIGHEST_VERSION, + JavaxMailApiRule.class, "org.apache.geronimo.javamail:geronimo-javamail_1.3.1_provider", "org.apache.geronimo.javamail:geronimo-javamail_1.4_provider", - "org.apache.geronimo.javamail:geronimo-javamail_1.6_provider" - ), - JAVAX_PERSISTENCE_API(HIGHEST_VERSION, JavaxPersistenceApiRule.class, + "org.apache.geronimo.javamail:geronimo-javamail_1.6_provider"), + JAVAX_PERSISTENCE_API( + HIGHEST_VERSION, + JavaxPersistenceApiRule.class, "javax.persistence:javax.persistence-api", "jakarta.persistence:jakarta.persistence-api", "org.hibernate.javax.persistence:hibernate-jpa-2.2-api", "org.hibernate.javax.persistence:hibernate-jpa-2.1-api", - "org.hibernate.javax.persistence:hibernate-jpa-2.0-api" - ), - JAVAX_SERVLET_API(HIGHEST_VERSION, JavaxServletApiRule.class, + "org.hibernate.javax.persistence:hibernate-jpa-2.0-api"), + JAVAX_SERVLET_API( + HIGHEST_VERSION, + JavaxServletApiRule.class, "javax.servlet:servlet-api", "javax.servlet:javax.servlet-api", "jakarta.servlet:jakarta.servlet-api", "org.apache.tomcat:servlet-api", "org.apache.tomcat:tomcat-servlet-api", "org.apache.tomcat.embed:tomcat-embed-core", - "servletapi:servletapi" - ), - JAVAX_SERVLET_JSP(HIGHEST_VERSION, JavaxServletJspRule.class, + "servletapi:servletapi"), + JAVAX_SERVLET_JSP( + HIGHEST_VERSION, + JavaxServletJspRule.class, "javax.servlet:jsp-api", "javax.servlet.jsp:jsp-api", "javax.servlet.jsp:javax.servlet.jsp-api", - "jakarta.servlet.jsp:jakarta.servlet.jsp-api" - ), - JAVAX_SERVLET_JSTL(HIGHEST_VERSION, JavaxServletJstlRule.class, + "jakarta.servlet.jsp:jakarta.servlet.jsp-api"), + JAVAX_SERVLET_JSTL( + HIGHEST_VERSION, + JavaxServletJstlRule.class, "javax.servlet:jstl", "javax.servlet.jsp.jstl:jstl-api", "javax.servlet.jsp.jstl:javax.servlet.jsp.jstl-api", - "jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api" - ), - JAVAX_SOAP_API(HIGHEST_VERSION, JavaxSoapApiRule.class, + "jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api"), + JAVAX_SOAP_API( + HIGHEST_VERSION, + JavaxSoapApiRule.class, "javax.xml.soap:javax.xml.soap-api", - "jakarta.xml.soap:jakarta.xml.soap-api" - ), - JAVAX_TRANSACTION_API(HIGHEST_VERSION, JavaxTransactionApiRule.class, + "jakarta.xml.soap:jakarta.xml.soap-api"), + JAVAX_TRANSACTION_API( + HIGHEST_VERSION, + JavaxTransactionApiRule.class, "javax.transaction:jta", "javax.transaction:javax.transaction-api", "jakarta.transaction:jakarta.transaction-api", "org.jboss.spec.javax.transaction:jboss-transaction-api_1.1_spec", "org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec", - "org.jboss.spec.javax.transaction:jboss-transaction-api_1.3_spec" - ), - JAVAX_VALIDATION_API(HIGHEST_VERSION, JavaxValidationApiRule.class, + "org.jboss.spec.javax.transaction:jboss-transaction-api_1.3_spec"), + JAVAX_VALIDATION_API( + HIGHEST_VERSION, + JavaxValidationApiRule.class, "javax.validation:validation-api", - "jakarta.validation:jakarta.validation-api" - ), - JAVAX_WEBSOCKET_API_RULE(HIGHEST_VERSION, JavaxWebsocketApiRule.class, + "jakarta.validation:jakarta.validation-api"), + JAVAX_WEBSOCKET_API_RULE( + HIGHEST_VERSION, + JavaxWebsocketApiRule.class, "javax.websocket:javax.websocket-api", "jakarta.websocket:jakarta.websocket-api", - "javax.websocket:javax.websocket-client-api", // in javax namespace, websocket-api and websocket-client-api overlap + "javax.websocket:javax.websocket-client-api", // in javax namespace, websocket-api and websocket-client-api + // overlap "jakarta.websocket:jakarta.websocket-client-api", "org.apache.tomcat:tomcat-websocket-api", "org.apache.tomcat.embed:tomcat-embed-websocket", - "org.eclipse.jetty.toolchain:jetty-javax-websocket-api" - ), - JAVAX_WS_RS_API(HIGHEST_VERSION, JavaxWsRsApiRule.class, + "org.eclipse.jetty.toolchain:jetty-javax-websocket-api"), + JAVAX_WS_RS_API( + HIGHEST_VERSION, + JavaxWsRsApiRule.class, "javax.ws.rs:jsr311-api", "org.jboss.spec.javax.ws.rs:jboss-jaxrs-api_2.1_spec", "org.jboss.spec.javax.ws.rs:jboss-jaxrs-api_2.0_spec", "org.jboss.spec.javax.ws.rs:jboss-jaxrs-api_1.1_spec", "org.jboss.resteasy:jaxrs-api", "jakarta.ws.rs:jakarta.ws.rs-api", - "javax.ws.rs:javax.ws.rs-api" - ), - JAVAX_XML_BIND_API(HIGHEST_VERSION, JavaxXmlBindApiRule.class, + "javax.ws.rs:javax.ws.rs-api"), + JAVAX_XML_BIND_API( + HIGHEST_VERSION, + JavaxXmlBindApiRule.class, "javax.xml.bind:jaxb-api", - "jakarta.xml.bind:jakarta.xml.bind-api" - ), - JAVAX_XML_WS_API(HIGHEST_VERSION, JavaxXmlWsApiRule.class, - "javax.xml.ws:jaxws-api", - "jakarta.xml.ws:jakarta.xml.ws-api" - ), - JAKARTA_JWS_API(HIGHEST_VERSION, JakartaJwsApiRule.class, + "jakarta.xml.bind:jakarta.xml.bind-api"), + JAVAX_XML_WS_API( + HIGHEST_VERSION, JavaxXmlWsApiRule.class, "javax.xml.ws:jaxws-api", "jakarta.xml.ws:jakarta.xml.ws-api"), + JAKARTA_JWS_API( + HIGHEST_VERSION, + JakartaJwsApiRule.class, "jakarta.jws:jakarta.jws-api", - "jakarta.xml.ws:jakarta.xml.ws-api" - ), + "jakarta.xml.ws:jakarta.xml.ws-api"), /** * Log4J2 has its own implementation with `log4j-core`. @@ -478,10 +401,7 @@ public enum CapabilityDefinition { * Given the above: * * `log4j-core` and `log4j-to-slf4j` are exclusive */ - LOG4J2_IMPL(NONE, - LoggingModuleIdentifiers.LOG4J_TO_SLF4J.moduleId, - LoggingModuleIdentifiers.LOG4J_CORE.moduleId - ), + LOG4J2_IMPL(NONE, LoggingModuleIdentifiers.LOG4J_TO_SLF4J.moduleId, LoggingModuleIdentifiers.LOG4J_CORE.moduleId), /** * `commons-logging:commons-logging` can be replaced by: @@ -498,19 +418,18 @@ public enum CapabilityDefinition { * * `commons-logging`, `jcl-over-slf4j` and `spring-jcl` are exclusive * * `jcl-over-slf4j` and `log4j-jcl` are exclusive */ - COMMONS_LOGGING_IMPL(NONE, FixedVersionCapabilityDefinitionRule.class, + COMMONS_LOGGING_IMPL( + NONE, + FixedVersionCapabilityDefinitionRule.class, LoggingModuleIdentifiers.COMMONS_LOGGING.moduleId, LoggingModuleIdentifiers.JCL_OVER_SLF4J.moduleId, - LoggingModuleIdentifiers.SPRING_JCL.moduleId - ), - SLF4J_VS_JCL(NONE, - LoggingModuleIdentifiers.JCL_OVER_SLF4J.moduleId, - LoggingModuleIdentifiers.SLF4J_JCL.moduleId - ), - SLF4J_VS_LOG4J2_FOR_JCL(NONE, FixedVersionCapabilityDefinitionRule.class, + LoggingModuleIdentifiers.SPRING_JCL.moduleId), + SLF4J_VS_JCL(NONE, LoggingModuleIdentifiers.JCL_OVER_SLF4J.moduleId, LoggingModuleIdentifiers.SLF4J_JCL.moduleId), + SLF4J_VS_LOG4J2_FOR_JCL( + NONE, + FixedVersionCapabilityDefinitionRule.class, LoggingModuleIdentifiers.JCL_OVER_SLF4J.moduleId, - LoggingModuleIdentifiers.LOG4J_JCL.moduleId - ), + LoggingModuleIdentifiers.LOG4J_JCL.moduleId), /** * Log4J2 can act as an Slf4J implementation with `log4j-slf4j-impl` or `log4j-slf4j2-impl`. * It can also delegate to Slf4J with `log4j-to-slf4j`. @@ -518,11 +437,11 @@ public enum CapabilityDefinition { * Given the above: * * `log4j-slf4j-impl`, `log4j-slf4j2-impl` and `log4j-to-slf4j` are exclusive */ - LOG4J2_VS_SLF4J(NONE, + LOG4J2_VS_SLF4J( + NONE, LoggingModuleIdentifiers.LOG4J_SLF4J_IMPL.moduleId, LoggingModuleIdentifiers.LOG4J_SLF4J2_IMPL.moduleId, - LoggingModuleIdentifiers.LOG4J_TO_SLF4J.moduleId - ), + LoggingModuleIdentifiers.LOG4J_TO_SLF4J.moduleId), /** * Slf4J provides an API, which requires an implementation. * Only one implementation can be on the classpath, selected between: @@ -534,7 +453,9 @@ public enum CapabilityDefinition { * * `slf4j-jdk14` to use Java Util Logging * * `log4j-slf4j-impl` to use Log4J2 */ - SLF4J_IMPL(NONE, FixedVersionCapabilityDefinitionRule.class, + SLF4J_IMPL( + NONE, + FixedVersionCapabilityDefinitionRule.class, LoggingModuleIdentifiers.SLF4J_SIMPLE.moduleId, LoggingModuleIdentifiers.SLF4J_NOP.moduleId, LoggingModuleIdentifiers.LOGBACK_CLASSIC.moduleId, @@ -542,8 +463,7 @@ public enum CapabilityDefinition { LoggingModuleIdentifiers.SLF4J_JCL.moduleId, LoggingModuleIdentifiers.SLF4J_JDK14.moduleId, LoggingModuleIdentifiers.LOG4J_SLF4J_IMPL.moduleId, - LoggingModuleIdentifiers.LOG4J_SLF4J2_IMPL.moduleId - ), + LoggingModuleIdentifiers.LOG4J_SLF4J2_IMPL.moduleId), /** * `log4j:log4j` can be replaced by: * * Slf4j with `log4j-over-slf4j` @@ -557,15 +477,14 @@ public enum CapabilityDefinition { * * `log4j-over-slf4j` and `slf4j-log4j12` are exclusive * * `log4j-over-slf4j` and `log4j-1.2-api` and `log4j` are exclusive */ - SLF4J_VS_LOG4J(NONE, - LoggingModuleIdentifiers.LOG4J_OVER_SLF4J.moduleId, - LoggingModuleIdentifiers.SLF4J_LOG4J12.moduleId - ), - SLF4J_VS_LOG4J2_FOR_LOG4J(NONE, FixedVersionCapabilityDefinitionRule.class, + SLF4J_VS_LOG4J( + NONE, LoggingModuleIdentifiers.LOG4J_OVER_SLF4J.moduleId, LoggingModuleIdentifiers.SLF4J_LOG4J12.moduleId), + SLF4J_VS_LOG4J2_FOR_LOG4J( + NONE, + FixedVersionCapabilityDefinitionRule.class, LoggingModuleIdentifiers.LOG4J_OVER_SLF4J.moduleId, LoggingModuleIdentifiers.LOG4J12API.moduleId, - LoggingModuleIdentifiers.LOG4J.moduleId - ), + LoggingModuleIdentifiers.LOG4J.moduleId), /** * Java Util Logging can be replaced by: * * Slf4J with `jul-to-slf4j` @@ -579,14 +498,12 @@ public enum CapabilityDefinition { * * `jul-to-slf4j` and `slf4j-jdk14` are exclusive * * `jul-to-slf4j` and `log4j-jul` are exclusive */ - SLF4J_VS_JUL(NONE, - LoggingModuleIdentifiers.JUL_TO_SLF4J.moduleId, - LoggingModuleIdentifiers.SLF4J_JDK14.moduleId - ), - SLF4J_VS_LOG4J2_FOR_JUL(NONE, FixedVersionCapabilityDefinitionRule.class, + SLF4J_VS_JUL(NONE, LoggingModuleIdentifiers.JUL_TO_SLF4J.moduleId, LoggingModuleIdentifiers.SLF4J_JDK14.moduleId), + SLF4J_VS_LOG4J2_FOR_JUL( + NONE, + FixedVersionCapabilityDefinitionRule.class, LoggingModuleIdentifiers.JUL_TO_SLF4J.moduleId, - LoggingModuleIdentifiers.LOG4J_JUL.moduleId - ); + LoggingModuleIdentifiers.LOG4J_JUL.moduleId); private final String group; private final String capabilityName; @@ -598,11 +515,18 @@ public enum CapabilityDefinition { this(defaultStrategy, "org.gradlex", CapabilityDefinitionRule.class, modules); } - CapabilityDefinition(DefaultResolutionStrategy defaultStrategy, Class ruleClass, String... modules) { + CapabilityDefinition( + DefaultResolutionStrategy defaultStrategy, + Class ruleClass, + String... modules) { this(defaultStrategy, "org.gradlex", ruleClass, modules); } - CapabilityDefinition(DefaultResolutionStrategy defaultStrategy, String group, Class ruleClass, String... modules) { + CapabilityDefinition( + DefaultResolutionStrategy defaultStrategy, + String group, + Class ruleClass, + String... modules) { this.group = group; this.capabilityName = nameInKebabCase(); this.modules = Arrays.asList(modules); diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/CapabilityDefinitionRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/CapabilityDefinitionRule.java index 3a88e6d9..b9c4bbc5 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/CapabilityDefinitionRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/CapabilityDefinitionRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ComponentMetadataContext; import org.gradle.api.artifacts.ComponentMetadataRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradle.api.artifacts.VariantMetadata; -import javax.inject.Inject; - @CacheableRule public abstract class CapabilityDefinitionRule implements ComponentMetadataRule { @@ -41,12 +25,11 @@ public final void execute(ComponentMetadataContext context) { variant.withCapabilities(capabilities -> { // remove capability if it already exists so that it can be added back // with a potentially different version - capabilities.removeCapability( - definition.getGroup(), definition.getCapabilityName() - ); + capabilities.removeCapability(definition.getGroup(), definition.getCapabilityName()); capabilities.addCapability( - definition.getGroup(), definition.getCapabilityName(), getVersion(context.getDetails().getId()) - ); + definition.getGroup(), + definition.getCapabilityName(), + getVersion(context.getDetails().getId())); }); additionalAdjustments(variant); }); @@ -61,5 +44,5 @@ protected String getVersion(ModuleVersionIdentifier id) { return id.getVersion(); } - protected void additionalAdjustments(VariantMetadata variant) { } + protected void additionalAdjustments(VariantMetadata variant) {} } diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/FixedVersionCapabilityDefinitionRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/FixedVersionCapabilityDefinitionRule.java index 2d984115..dbb1453a 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/FixedVersionCapabilityDefinitionRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/FixedVersionCapabilityDefinitionRule.java @@ -1,26 +1,10 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; -import javax.inject.Inject; - /** * Rule adding a capability with a hard coded version. */ @@ -36,4 +20,4 @@ public FixedVersionCapabilityDefinitionRule(CapabilityDefinition capabilityDefin protected String getVersion(ModuleVersionIdentifier id) { return "1.0"; } -} \ No newline at end of file +} diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/aopalliance/AopallianceRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/aopalliance/AopallianceRule.java index 93496d14..156471e6 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/aopalliance/AopallianceRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/aopalliance/AopallianceRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.aopalliance; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class AopallianceRule extends CapabilityDefinitionRule { @@ -37,6 +21,7 @@ public AopallianceRule(CapabilityDefinition rule) { @Override protected boolean shouldApply(ModuleVersionIdentifier id) { - return "aopalliance".equals(id.getGroup()) || VersionNumber.parse(id.getVersion()).compareTo(VersionNumber.parse(FIRST_AOP_EMBEDDED_VERSION)) >= 0; + return "aopalliance".equals(id.getGroup()) + || VersionNumber.parse(id.getVersion()).compareTo(VersionNumber.parse(FIRST_AOP_EMBEDDED_VERSION)) >= 0; } } diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/aopalliance/package-info.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/aopalliance/package-info.java index 50f8042c..1c9a4e02 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/aopalliance/package-info.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/aopalliance/package-info.java @@ -1,20 +1,5 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 @NullMarked package org.gradlex.jvm.dependency.conflict.detection.rules.aopalliance; -import org.jspecify.annotations.NullMarked; \ No newline at end of file +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/asm/AsmAlignmentRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/asm/AsmAlignmentRule.java index bceaa5f4..63402d2f 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/asm/AsmAlignmentRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/asm/AsmAlignmentRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.asm; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.AlignmentDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.AlignmentDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class AsmAlignmentRule extends AlignmentDefinitionRule { diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/bouncycastle/BouncyCastleRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/bouncycastle/BouncyCastleRule.java index d590f408..424f67c8 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/bouncycastle/BouncyCastleRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/bouncycastle/BouncyCastleRule.java @@ -1,28 +1,12 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.bouncycastle; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; -import javax.inject.Inject; - @CacheableRule public abstract class BouncyCastleRule extends CapabilityDefinitionRule { diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/bouncycastle/package-info.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/bouncycastle/package-info.java index 3ccd30aa..62e9b68e 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/bouncycastle/package-info.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/bouncycastle/package-info.java @@ -1,20 +1,5 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 @NullMarked package org.gradlex.jvm.dependency.conflict.detection.rules.bouncycastle; -import org.jspecify.annotations.NullMarked; \ No newline at end of file +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/guava/GuavaListenableFutureRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/guava/GuavaListenableFutureRule.java index 5162613b..d0ce6f77 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/guava/GuavaListenableFutureRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/guava/GuavaListenableFutureRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.guava; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradle.api.artifacts.VariantMetadata; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; -import javax.inject.Inject; - @CacheableRule public abstract class GuavaListenableFutureRule extends CapabilityDefinitionRule { diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/guava/package-info.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/guava/package-info.java index d5fca2d1..5d15fc4e 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/guava/package-info.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/guava/package-info.java @@ -1,20 +1,5 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 @NullMarked package org.gradlex.jvm.dependency.conflict.detection.rules.guava; -import org.jspecify.annotations.NullMarked; \ No newline at end of file +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaActivationApiRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaActivationApiRule.java index 3552e85c..23acb386 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaActivationApiRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaActivationApiRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.jakarta; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class JakartaActivationApiRule extends CapabilityDefinitionRule { @@ -34,6 +18,8 @@ public JakartaActivationApiRule(CapabilityDefinition rule) { @Override protected boolean shouldApply(ModuleVersionIdentifier id) { - return VersionNumber.parse(id.getVersion()).compareTo(VersionNumber.parse(JavaxActivationApiRule.FIRST_JAKARTA_VERSION)) >= 0; + return VersionNumber.parse(id.getVersion()) + .compareTo(VersionNumber.parse(JavaxActivationApiRule.FIRST_JAKARTA_VERSION)) + >= 0; } } diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaActivationImplementationRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaActivationImplementationRule.java index 99bbae29..d2a961a0 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaActivationImplementationRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaActivationImplementationRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.jakarta; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class JakartaActivationImplementationRule extends CapabilityDefinitionRule { @@ -42,7 +26,9 @@ protected boolean shouldApply(ModuleVersionIdentifier id) { private boolean isSunJakartaActivationImpl(ModuleVersionIdentifier id) { return "com.sun.activation".equals(id.getGroup()) - && VersionNumber.parse(id.getVersion()).compareTo(VersionNumber.parse(JavaxActivationApiRule.FIRST_JAKARTA_VERSION)) >= 0; + && VersionNumber.parse(id.getVersion()) + .compareTo(VersionNumber.parse(JavaxActivationApiRule.FIRST_JAKARTA_VERSION)) + >= 0; } private boolean isAngusJakartaActivationImpl(ModuleVersionIdentifier id) { diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaAnnotationApiRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaAnnotationApiRule.java index fd1e8537..d52b31a6 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaAnnotationApiRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaAnnotationApiRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.jakarta; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class JakartaAnnotationApiRule extends CapabilityDefinitionRule { @@ -42,7 +26,9 @@ protected String getVersion(ModuleVersionIdentifier id) { @Override protected boolean shouldApply(ModuleVersionIdentifier id) { - return VersionNumber.parse(getVersion(id)).compareTo(VersionNumber.parse(JavaxAnnotationApiRule.FIRST_JAKARTA_VERSION)) >= 0; + return VersionNumber.parse(getVersion(id)) + .compareTo(VersionNumber.parse(JavaxAnnotationApiRule.FIRST_JAKARTA_VERSION)) + >= 0; } // This is probably 100% accurate - older Tomcat versions might ship older 1.x specs diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaJwsApiRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaJwsApiRule.java index f2cf30ad..a6f89391 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaJwsApiRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaJwsApiRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.jakarta; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class JakartaJwsApiRule extends CapabilityDefinitionRule { diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaMailApiRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaMailApiRule.java index 577d67ee..16e09fa3 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaMailApiRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaMailApiRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.jakarta; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class JakartaMailApiRule extends CapabilityDefinitionRule { @@ -36,6 +20,8 @@ public JakartaMailApiRule(CapabilityDefinition rule) { protected boolean shouldApply(ModuleVersionIdentifier id) { // org.eclipse.angus has its own versioning, and everything is Jakarta return "org.eclipse.angus".equals(id.getGroup()) - || VersionNumber.parse(id.getVersion()).compareTo(VersionNumber.parse(JavaxMailApiRule.FIRST_JAKARTA_VERSION)) >= 0; + || VersionNumber.parse(id.getVersion()) + .compareTo(VersionNumber.parse(JavaxMailApiRule.FIRST_JAKARTA_VERSION)) + >= 0; } } diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaServletApiRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaServletApiRule.java index 34424608..cb07bcd8 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaServletApiRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaServletApiRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.jakarta; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class JakartaServletApiRule extends CapabilityDefinitionRule { @@ -42,6 +26,8 @@ protected String getVersion(ModuleVersionIdentifier id) { @Override protected boolean shouldApply(ModuleVersionIdentifier id) { - return VersionNumber.parse(getVersion(id)).compareTo(VersionNumber.parse(JavaxServletApiRule.FIRST_JAKARTA_VERSION)) >= 0; + return VersionNumber.parse(getVersion(id)) + .compareTo(VersionNumber.parse(JavaxServletApiRule.FIRST_JAKARTA_VERSION)) + >= 0; } } diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaWebsocketApiRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaWebsocketApiRule.java index 8a876787..afe8862f 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaWebsocketApiRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaWebsocketApiRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.jakarta; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class JakartaWebsocketApiRule extends CapabilityDefinitionRule { @@ -42,6 +26,8 @@ protected String getVersion(ModuleVersionIdentifier id) { @Override protected boolean shouldApply(ModuleVersionIdentifier id) { - return VersionNumber.parse(getVersion(id)).compareTo(VersionNumber.parse(JavaxWebsocketApiRule.FIRST_JAKARTA_VERSION)) >= 0; + return VersionNumber.parse(getVersion(id)) + .compareTo(VersionNumber.parse(JavaxWebsocketApiRule.FIRST_JAKARTA_VERSION)) + >= 0; } } diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaWebsocketClientApiRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaWebsocketClientApiRule.java index ae186cb9..2cb895fa 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaWebsocketClientApiRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaWebsocketClientApiRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.jakarta; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class JakartaWebsocketClientApiRule extends CapabilityDefinitionRule { @@ -42,6 +26,8 @@ protected String getVersion(ModuleVersionIdentifier id) { @Override protected boolean shouldApply(ModuleVersionIdentifier id) { - return VersionNumber.parse(id.getVersion()).compareTo(VersionNumber.parse(JavaxWebsocketApiRule.FIRST_JAKARTA_VERSION)) >= 0; + return VersionNumber.parse(id.getVersion()) + .compareTo(VersionNumber.parse(JavaxWebsocketApiRule.FIRST_JAKARTA_VERSION)) + >= 0; } } diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaWsRsApiRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaWsRsApiRule.java index 1f3e9725..35af1414 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaWsRsApiRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaWsRsApiRule.java @@ -1,28 +1,12 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.jakarta; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; -import javax.inject.Inject; - @CacheableRule public abstract class JakartaWsRsApiRule extends CapabilityDefinitionRule { diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxActivationApiRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxActivationApiRule.java index 7e3fac3a..cbfd99b4 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxActivationApiRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxActivationApiRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.jakarta; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class JavaxActivationApiRule extends CapabilityDefinitionRule { diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxAnnotationApiRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxAnnotationApiRule.java index c5e3e0db..2f612547 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxAnnotationApiRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxAnnotationApiRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.jakarta; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class JavaxAnnotationApiRule extends CapabilityDefinitionRule { diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxEjbApiRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxEjbApiRule.java index cca8010f..268cad11 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxEjbApiRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxEjbApiRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.jakarta; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class JavaxEjbApiRule extends CapabilityDefinitionRule { diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxElApiRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxElApiRule.java index d4849448..eb1f2139 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxElApiRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxElApiRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.jakarta; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class JavaxElApiRule extends CapabilityDefinitionRule { diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxInjectApiRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxInjectApiRule.java index 13a832a2..6eab4a94 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxInjectApiRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxInjectApiRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.jakarta; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class JavaxInjectApiRule extends CapabilityDefinitionRule { @@ -42,7 +26,7 @@ protected boolean shouldApply(ModuleVersionIdentifier id) { @Override protected String getVersion(ModuleVersionIdentifier id) { if ("org.glassfish.hk2.external".equals(id.getGroup())) { - return "1"; + return "1"; } return id.getVersion(); } diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxJsonApiRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxJsonApiRule.java index 81965dc8..a77fc7e3 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxJsonApiRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxJsonApiRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.jakarta; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class JavaxJsonApiRule extends CapabilityDefinitionRule { diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxJwsApisRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxJwsApisRule.java index 1108c9c7..7ba18b4c 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxJwsApisRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxJwsApisRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.jakarta; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class JavaxJwsApisRule extends CapabilityDefinitionRule { @@ -39,4 +23,3 @@ protected boolean shouldApply(ModuleVersionIdentifier id) { return VersionNumber.parse(getVersion(id)).compareTo(VersionNumber.parse(FIRST_JAKARTA_VERSION)) < 0; } } - diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxMailApiRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxMailApiRule.java index b4cb4b6b..9eb6de5f 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxMailApiRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxMailApiRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.jakarta; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class JavaxMailApiRule extends CapabilityDefinitionRule { diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxPersistenceApiRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxPersistenceApiRule.java index 9b97eb56..16f72b7c 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxPersistenceApiRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxPersistenceApiRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.jakarta; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class JavaxPersistenceApiRule extends CapabilityDefinitionRule { diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxServletApiRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxServletApiRule.java index 32b3c5e6..0103e6ee 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxServletApiRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxServletApiRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.jakarta; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class JavaxServletApiRule extends CapabilityDefinitionRule { @@ -36,7 +20,9 @@ public JavaxServletApiRule(CapabilityDefinition rule) { @Override protected boolean shouldApply(ModuleVersionIdentifier id) { - return VersionNumber.parse(getVersion(id)).compareTo(VersionNumber.parse(JavaxServletApiRule.FIRST_JAKARTA_VERSION)) < 0; + return VersionNumber.parse(getVersion(id)) + .compareTo(VersionNumber.parse(JavaxServletApiRule.FIRST_JAKARTA_VERSION)) + < 0; } @Override diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxServletJspRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxServletJspRule.java index 0b552b3e..a23039b0 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxServletJspRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxServletJspRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.jakarta; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class JavaxServletJspRule extends CapabilityDefinitionRule { @@ -38,5 +22,4 @@ public JavaxServletJspRule(CapabilityDefinition rule) { protected boolean shouldApply(ModuleVersionIdentifier id) { return VersionNumber.parse(id.getVersion()).compareTo(VersionNumber.parse(FIRST_JAKARTA_VERSION)) < 0; } - } diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxServletJstlRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxServletJstlRule.java index 1b8cc737..df0f8504 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxServletJstlRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxServletJstlRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.jakarta; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class JavaxServletJstlRule extends CapabilityDefinitionRule { diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxSoapApiRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxSoapApiRule.java index c757f92f..2cccba58 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxSoapApiRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxSoapApiRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.jakarta; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class JavaxSoapApiRule extends CapabilityDefinitionRule { @@ -39,4 +23,3 @@ protected boolean shouldApply(ModuleVersionIdentifier id) { return VersionNumber.parse(id.getVersion()).compareTo(VersionNumber.parse(FIRST_JAKARTA_VERSION)) < 0; } } - diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxTransactionApiRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxTransactionApiRule.java index f2434f06..ca2e8872 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxTransactionApiRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxTransactionApiRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.jakarta; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class JavaxTransactionApiRule extends CapabilityDefinitionRule { diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxValidationApiRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxValidationApiRule.java index 162cf3c0..6dd51662 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxValidationApiRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxValidationApiRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.jakarta; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class JavaxValidationApiRule extends CapabilityDefinitionRule { diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxWebsocketApiRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxWebsocketApiRule.java index 96665230..87aba9c2 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxWebsocketApiRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxWebsocketApiRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.jakarta; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class JavaxWebsocketApiRule extends CapabilityDefinitionRule { diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxWsRsApiRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxWsRsApiRule.java index 2560aa07..717e04e3 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxWsRsApiRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxWsRsApiRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.jakarta; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class JavaxWsRsApiRule extends CapabilityDefinitionRule { @@ -36,7 +20,8 @@ public JavaxWsRsApiRule(CapabilityDefinition rule) { @Override protected boolean shouldApply(ModuleVersionIdentifier id) { - return "org.jboss.resteasy".equals(id.getGroup()) || VersionNumber.parse(getVersion(id)).compareTo(VersionNumber.parse(FIRST_JAKARTA_VERSION)) < 0; + return "org.jboss.resteasy".equals(id.getGroup()) + || VersionNumber.parse(getVersion(id)).compareTo(VersionNumber.parse(FIRST_JAKARTA_VERSION)) < 0; } @Override @@ -45,7 +30,7 @@ protected String getVersion(ModuleVersionIdentifier id) { String moduleVersion = id.getVersion(); if (name.contains("jboss-jaxrs-api_")) { - return rsApiVersionForJbossName(name); + return rsApiVersionForJbossName(name); } if (moduleVersion.endsWith(".Final")) { return moduleVersion.substring(0, moduleVersion.indexOf(".Final")); @@ -62,4 +47,3 @@ private static String rsApiVersionForJbossName(String name) { return name.substring(index, index + 3) + ".0"; } } - diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxXmlBindApiRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxXmlBindApiRule.java index 598d269b..c24d4dea 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxXmlBindApiRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxXmlBindApiRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.jakarta; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class JavaxXmlBindApiRule extends CapabilityDefinitionRule { diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxXmlWsApiRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxXmlWsApiRule.java index ba203c30..0e64aafa 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxXmlWsApiRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxXmlWsApiRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.jakarta; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class JavaxXmlWsApiRule extends CapabilityDefinitionRule { diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/package-info.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/package-info.java index 332ae954..24567b4b 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/package-info.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/package-info.java @@ -1,20 +1,5 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 @NullMarked package org.gradlex.jvm.dependency.conflict.detection.rules.jakarta; -import org.jspecify.annotations.NullMarked; \ No newline at end of file +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jetty/JettyAlignmentRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jetty/JettyAlignmentRule.java index a46f4e02..4cbb1d58 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jetty/JettyAlignmentRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jetty/JettyAlignmentRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.jetty; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.AlignmentDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.AlignmentDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class JettyAlignmentRule extends AlignmentDefinitionRule { diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/logging/Log4J2Alignment.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/logging/Log4J2Alignment.java index 732eed50..352f5240 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/logging/Log4J2Alignment.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/logging/Log4J2Alignment.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.logging; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.AlignmentDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.AlignmentDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class Log4J2Alignment extends AlignmentDefinitionRule { diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/logging/LoggingModuleIdentifiers.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/logging/LoggingModuleIdentifiers.java index 9465add8..d7f0ec0f 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/logging/LoggingModuleIdentifiers.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/logging/LoggingModuleIdentifiers.java @@ -1,19 +1,4 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.logging; import org.gradle.api.artifacts.Dependency; diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/logging/Slf4J2Alignment.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/logging/Slf4J2Alignment.java index 42eb23a4..de5ac19f 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/logging/Slf4J2Alignment.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/logging/Slf4J2Alignment.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.logging; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.AlignmentDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.AlignmentDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class Slf4J2Alignment extends AlignmentDefinitionRule { diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/logging/Slf4JAlignment.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/logging/Slf4JAlignment.java index ff1d21de..10b903d6 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/logging/Slf4JAlignment.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/logging/Slf4JAlignment.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.rules.logging; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradlex.jvm.dependency.conflict.detection.rules.AlignmentDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.AlignmentDefinitionRule; import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; -import javax.inject.Inject; - @CacheableRule public abstract class Slf4JAlignment extends AlignmentDefinitionRule { diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/logging/package-info.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/logging/package-info.java index 5de388c7..39a93025 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/logging/package-info.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/logging/package-info.java @@ -1,20 +1,5 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 @NullMarked package org.gradlex.jvm.dependency.conflict.detection.rules.logging; -import org.jspecify.annotations.NullMarked; \ No newline at end of file +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/package-info.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/package-info.java index b0d460dc..493ee8cb 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/package-info.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/package-info.java @@ -1,20 +1,5 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 @NullMarked package org.gradlex.jvm.dependency.conflict.detection.rules; -import org.jspecify.annotations.NullMarked; \ No newline at end of file +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/util/VersionNumber.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/util/VersionNumber.java index ad1c389b..99631201 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/util/VersionNumber.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/util/VersionNumber.java @@ -1,24 +1,8 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.detection.util; -import org.jspecify.annotations.Nullable; - import java.util.Objects; +import org.jspecify.annotations.Nullable; /** * Inspired by: org.gradle.util.internal.VersionNumber @@ -80,7 +64,6 @@ public int hashCode() { @Override public String toString() { return String.format("%d.%d.%d%s", major, minor, micro, qualifier == null ? "" : "-" + qualifier); - } public static VersionNumber version(int major, int minor) { diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/ConflictResolution.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/ConflictResolution.java index 052a43c0..9b4ee600 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/ConflictResolution.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/ConflictResolution.java @@ -1,21 +1,9 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.resolution; +import java.util.Arrays; +import java.util.Optional; +import javax.inject.Inject; import org.gradle.api.artifacts.CapabilityResolutionDetails; import org.gradle.api.artifacts.ComponentVariantIdentifier; import org.gradle.api.artifacts.ConfigurationContainer; @@ -24,10 +12,6 @@ import org.gradle.api.provider.SetProperty; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; -import javax.inject.Inject; -import java.util.Arrays; -import java.util.Optional; - public abstract class ConflictResolution { @Inject @@ -40,7 +24,9 @@ public void deactivateResolutionStrategy(CapabilityDefinition capability) { } public void deactivateResolutionStrategy(String capability) { - Optional definition = Arrays.stream(CapabilityDefinition.values()).filter(c -> capability.equals(c.getCapability())).findFirst(); + Optional definition = Arrays.stream(CapabilityDefinition.values()) + .filter(c -> capability.equals(c.getCapability())) + .findFirst(); definition.ifPresent(c -> getDeactivatedResolutionStrategies().add(c)); } @@ -75,26 +61,29 @@ private void selectLenient(String capability, String module) { } private void doSelectHighestVersion(String capability) { - getConfigurations().configureEach(conf -> conf.getResolutionStrategy().getCapabilitiesResolution().withCapability(capability, - CapabilityResolutionDetails::selectHighestVersion)); + getConfigurations().configureEach(conf -> conf.getResolutionStrategy() + .getCapabilitiesResolution() + .withCapability(capability, CapabilityResolutionDetails::selectHighestVersion)); } private void doSelect(String capability, String module, boolean lenient) { String group = module.split(":")[0]; String name = module.split(":")[1]; - getConfigurations().configureEach(conf -> conf.getResolutionStrategy().getCapabilitiesResolution().withCapability(capability, c -> { - for (ComponentVariantIdentifier candidate : c.getCandidates()) { - ComponentIdentifier id = candidate.getId(); - if (id instanceof ModuleComponentIdentifier - && ((ModuleComponentIdentifier) id).getGroup().equals(group) - && ((ModuleComponentIdentifier) id).getModule().equals(name)) { - c.select(candidate); - return; - } - } - if (lenient && !c.getCandidates().isEmpty()) { - c.select(c.getCandidates().get(0)); - } - })); + getConfigurations().configureEach(conf -> conf.getResolutionStrategy() + .getCapabilitiesResolution() + .withCapability(capability, c -> { + for (ComponentVariantIdentifier candidate : c.getCandidates()) { + ComponentIdentifier id = candidate.getId(); + if (id instanceof ModuleComponentIdentifier + && ((ModuleComponentIdentifier) id).getGroup().equals(group) + && ((ModuleComponentIdentifier) id).getModule().equals(name)) { + c.select(candidate); + return; + } + } + if (lenient && !c.getCandidates().isEmpty()) { + c.select(c.getCandidates().get(0)); + } + })); } } diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/ConsistentResolution.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/ConsistentResolution.java index a8c920bc..408e5727 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/ConsistentResolution.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/ConsistentResolution.java @@ -1,21 +1,11 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.resolution; +import static org.gradlex.jvm.dependency.conflict.resolution.JvmDependencyConflictResolutionPlugin.INTERNAL_CONFIGURATION_NAME; +import static org.gradlex.jvm.dependency.conflict.resolution.JvmDependencyConflictResolutionPlugin.MAIN_RUNTIME_CLASSPATH_CONFIGURATION_NAME; + +import java.util.Collections; +import javax.inject.Inject; import org.gradle.api.NamedDomainObjectProvider; import org.gradle.api.artifacts.Configuration; import org.gradle.api.artifacts.ConfigurationContainer; @@ -30,12 +20,6 @@ import org.gradle.api.tasks.SourceSetContainer; import org.gradle.util.GradleVersion; -import javax.inject.Inject; -import java.util.Collections; - -import static org.gradlex.jvm.dependency.conflict.resolution.JvmDependencyConflictResolutionPlugin.INTERNAL_CONFIGURATION_NAME; -import static org.gradlex.jvm.dependency.conflict.resolution.JvmDependencyConflictResolutionPlugin.MAIN_RUNTIME_CLASSPATH_CONFIGURATION_NAME; - public abstract class ConsistentResolution { private final SourceSetContainer sourceSets; @@ -79,7 +63,8 @@ public void platform(String platform) { ConfigurationContainer configurations = getConfigurations(); configurations.named(sourceSet.getRuntimeClasspathConfigurationName(), c -> c.extendsFrom(internal.get())); configurations.named(sourceSet.getCompileClasspathConfigurationName(), c -> c.extendsFrom(internal.get())); - configurations.named(sourceSet.getAnnotationProcessorConfigurationName(), c -> c.extendsFrom(internal.get())); + configurations.named( + sourceSet.getAnnotationProcessorConfigurationName(), c -> c.extendsFrom(internal.get())); }); } @@ -89,28 +74,39 @@ private NamedDomainObjectProvider maybeCreateMainRuntimeClasspath } NamedDomainObjectProvider internal = maybeCreateInternalConfiguration(); - NamedDomainObjectProvider mainRuntimeClasspath = getConfigurations().register(MAIN_RUNTIME_CLASSPATH_CONFIGURATION_NAME, c -> { - ObjectFactory objects = getObjects(); - c.setCanBeResolved(true); - c.setCanBeConsumed(false); - c.extendsFrom(internal.get()); - c.getAttributes().attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.class, Usage.JAVA_RUNTIME)); - c.getAttributes().attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.class, Category.LIBRARY)); - c.getAttributes().attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements.class, LibraryElements.JAR)); - c.getAttributes().attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling.class, Bundling.EXTERNAL)); - if (GradleVersion.current().compareTo(GradleVersion.version("7.0")) >= 0) { - c.getAttributes().attribute(TargetJvmEnvironment.TARGET_JVM_ENVIRONMENT_ATTRIBUTE, - objects.named(TargetJvmEnvironment.class, TargetJvmEnvironment.STANDARD_JVM)); - } - }); + NamedDomainObjectProvider mainRuntimeClasspath = getConfigurations() + .register(MAIN_RUNTIME_CLASSPATH_CONFIGURATION_NAME, c -> { + ObjectFactory objects = getObjects(); + c.setCanBeResolved(true); + c.setCanBeConsumed(false); + c.extendsFrom(internal.get()); + c.getAttributes().attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.class, Usage.JAVA_RUNTIME)); + c.getAttributes() + .attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.class, Category.LIBRARY)); + c.getAttributes() + .attribute( + LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, + objects.named(LibraryElements.class, LibraryElements.JAR)); + c.getAttributes() + .attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling.class, Bundling.EXTERNAL)); + if (GradleVersion.current().compareTo(GradleVersion.version("7.0")) >= 0) { + c.getAttributes() + .attribute( + TargetJvmEnvironment.TARGET_JVM_ENVIRONMENT_ATTRIBUTE, + objects.named(TargetJvmEnvironment.class, TargetJvmEnvironment.STANDARD_JVM)); + } + }); sourceSets.configureEach(sourceSet -> { ConfigurationContainer configurations = getConfigurations(); - NamedDomainObjectProvider runtime = configurations.named(sourceSet.getRuntimeClasspathConfigurationName(),c -> - c.shouldResolveConsistentlyWith(mainRuntimeClasspath.get())); - configurations.named(sourceSet.getCompileClasspathConfigurationName(), c -> - c.shouldResolveConsistentlyWith(runtime.get())); - configurations.named(sourceSet.getAnnotationProcessorConfigurationName(), c -> - c.shouldResolveConsistentlyWith(runtime.get())); + NamedDomainObjectProvider runtime = configurations.named( + sourceSet.getRuntimeClasspathConfigurationName(), + c -> c.shouldResolveConsistentlyWith(mainRuntimeClasspath.get())); + configurations.named( + sourceSet.getCompileClasspathConfigurationName(), + c -> c.shouldResolveConsistentlyWith(runtime.get())); + configurations.named( + sourceSet.getAnnotationProcessorConfigurationName(), + c -> c.shouldResolveConsistentlyWith(runtime.get())); }); return mainRuntimeClasspath; } @@ -127,8 +123,10 @@ private NamedDomainObjectProvider maybeCreateInternalConfiguratio private Dependency createDependency(String project) { boolean isProjectInBuild = project.startsWith(":"); - return getDependencies().create(isProjectInBuild - ? getDependencies().project(Collections.singletonMap("path", project)) - : project); + return getDependencies() + .create( + isProjectInBuild + ? getDependencies().project(Collections.singletonMap("path", project)) + : project); } } diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/DefaultResolutionStrategy.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/DefaultResolutionStrategy.java index f3a6208d..767567b6 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/DefaultResolutionStrategy.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/DefaultResolutionStrategy.java @@ -1,19 +1,4 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.resolution; public enum DefaultResolutionStrategy { diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/JvmDependencyConflictDetectionPluginApplication.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/JvmDependencyConflictDetectionPluginApplication.java index c4444232..7504410e 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/JvmDependencyConflictDetectionPluginApplication.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/JvmDependencyConflictDetectionPluginApplication.java @@ -1,19 +1,4 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.resolution; import org.gradle.api.Project; @@ -40,19 +25,19 @@ void handleRulesMode() { boolean baseAppliedViaSettings = isBaseAppliedViaSettings(); RulesMode rulesMode = getRulesMode(); String settingsFileName = getSettings().getSettingsScript().getFileName(); - switch(rulesMode) { - // PREFER_PROJECT is the default if the user did not configure something else + switch (rulesMode) { + // PREFER_PROJECT is the default if the user did not configure something else case PREFER_PROJECT: project.getPlugins().apply(JvmDependencyConflictDetectionPlugin.class); break; case PREFER_SETTINGS: case FAIL_ON_PROJECT_RULES: if (!baseAppliedViaSettings) { - throw new IllegalStateException( - "RulesMode is set to " + rulesMode + " in " + settingsFileName + " but the '" + PLUGIN_ID + "' plugin was not applied via settings." + - " As a result this plugin will not work." + - " Fix this problem by either changing dependencyResolutionManagement.rulesMode to PREFER_PROJECT or by applying '" + PLUGIN_ID + "' as a settings plugin in " + settingsFileName + "." - ); + throw new IllegalStateException("RulesMode is set to " + rulesMode + " in " + settingsFileName + + " but the '" + PLUGIN_ID + "' plugin was not applied via settings." + + " As a result this plugin will not work." + + " Fix this problem by either changing dependencyResolutionManagement.rulesMode to PREFER_PROJECT or by applying '" + + PLUGIN_ID + "' as a settings plugin in " + settingsFileName + "."); } break; default: diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/JvmDependencyConflictResolutionPlugin.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/JvmDependencyConflictResolutionPlugin.java index e25b41f2..e30368c8 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/JvmDependencyConflictResolutionPlugin.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/JvmDependencyConflictResolutionPlugin.java @@ -1,21 +1,10 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.resolution; +import static org.gradlex.jvm.dependency.conflict.resolution.DefaultResolutionStrategy.FIRST_MODULE; +import static org.gradlex.jvm.dependency.conflict.resolution.DefaultResolutionStrategy.HIGHEST_VERSION; + +import java.util.Optional; import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.artifacts.CapabilitiesResolution; @@ -28,11 +17,6 @@ import org.gradle.api.tasks.SourceSetContainer; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; -import java.util.Optional; - -import static org.gradlex.jvm.dependency.conflict.resolution.DefaultResolutionStrategy.FIRST_MODULE; -import static org.gradlex.jvm.dependency.conflict.resolution.DefaultResolutionStrategy.HIGHEST_VERSION; - public abstract class JvmDependencyConflictResolutionPlugin implements Plugin { public static final String MAIN_RUNTIME_CLASSPATH_CONFIGURATION_NAME = "mainRuntimeClasspath"; public static final String INTERNAL_CONFIGURATION_NAME = "internal"; @@ -44,16 +28,17 @@ public void apply(Project project) { // Make sure 'jvm-ecosystem' is applied which adds the schemas for the attributes this plugin relies on project.getPlugins().apply(JvmEcosystemPlugin.class); - JvmDependencyConflictsExtension jvmDependencyConflicts = project.getExtensions().create( - "jvmDependencyConflicts", - JvmDependencyConflictsExtension.class, - project.getExtensions().getByType(SourceSetContainer.class) - ); + JvmDependencyConflictsExtension jvmDependencyConflicts = project.getExtensions() + .create( + "jvmDependencyConflicts", + JvmDependencyConflictsExtension.class, + project.getExtensions().getByType(SourceSetContainer.class)); configureResolutionStrategies(project.getConfigurations(), jvmDependencyConflicts); } - private void configureResolutionStrategies(ConfigurationContainer configurations, JvmDependencyConflictsExtension jvmDependencyConflicts) { + private void configureResolutionStrategies( + ConfigurationContainer configurations, JvmDependencyConflictsExtension jvmDependencyConflicts) { configurations.configureEach(configuration -> { for (CapabilityDefinition definition : CapabilityDefinition.values()) { defineStrategy(definition, configuration, jvmDependencyConflicts); @@ -61,10 +46,18 @@ private void configureResolutionStrategies(ConfigurationContainer configurations }); } - private void defineStrategy(CapabilityDefinition definition, Configuration configuration, JvmDependencyConflictsExtension jvmDependencyConflicts) { - CapabilitiesResolution resolution = configuration.getResolutionStrategy().getCapabilitiesResolution(); + private void defineStrategy( + CapabilityDefinition definition, + Configuration configuration, + JvmDependencyConflictsExtension jvmDependencyConflicts) { + CapabilitiesResolution resolution = + configuration.getResolutionStrategy().getCapabilitiesResolution(); resolution.withCapability(definition.getCapability(), details -> { - if (!jvmDependencyConflicts.getConflictResolution().getDeactivatedResolutionStrategies().get().contains(definition)) { + if (!jvmDependencyConflicts + .getConflictResolution() + .getDeactivatedResolutionStrategies() + .get() + .contains(definition)) { if (definition.getDefaultStrategy() == HIGHEST_VERSION) { details.selectHighestVersion(); } else if (definition.getDefaultStrategy() == FIRST_MODULE) { @@ -75,12 +68,17 @@ private void defineStrategy(CapabilityDefinition definition, Configuration confi } private void select(CapabilityResolutionDetails details, String moduleGA) { - Optional module = details.getCandidates().stream().filter(c -> { - if (c.getId() instanceof ModuleComponentIdentifier) { - return ((ModuleComponentIdentifier) c.getId()).getModuleIdentifier().toString().equals(moduleGA); - } - return false; - }).findFirst(); + Optional module = details.getCandidates().stream() + .filter(c -> { + if (c.getId() instanceof ModuleComponentIdentifier) { + return ((ModuleComponentIdentifier) c.getId()) + .getModuleIdentifier() + .toString() + .equals(moduleGA); + } + return false; + }) + .findFirst(); module.ifPresent(details::select); } } diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/JvmDependencyConflictsExtension.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/JvmDependencyConflictsExtension.java index a30e79de..f79091a7 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/JvmDependencyConflictsExtension.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/JvmDependencyConflictsExtension.java @@ -1,27 +1,11 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.resolution; +import javax.inject.Inject; import org.gradle.api.Action; import org.gradle.api.model.ObjectFactory; import org.gradle.api.tasks.SourceSetContainer; -import javax.inject.Inject; - public abstract class JvmDependencyConflictsExtension { private final ConflictResolution conflictResolution; diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/Logging.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/Logging.java index 632126d7..ea2ea646 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/Logging.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/Logging.java @@ -1,21 +1,7 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.resolution; +import javax.inject.Inject; import org.gradle.api.Action; import org.gradle.api.artifacts.CapabilitiesResolution; import org.gradle.api.artifacts.ConfigurationContainer; @@ -27,8 +13,6 @@ import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.detection.rules.logging.LoggingModuleIdentifiers; -import javax.inject.Inject; - /** * Project extension that enables expressing preference over potential logging capabilities conflicts. */ @@ -59,12 +43,17 @@ public void selectSlf4JBinding(Object dependencyNotation) { } else if (LoggingModuleIdentifiers.SLF4J_JCL.matches(dependency)) { selectCapabilityConflict(CapabilityDefinition.SLF4J_VS_JCL.getCapability(), dependency, because); selectCapabilityConflict(CapabilityDefinition.SLF4J_IMPL.getCapability(), dependency, because); - } else if (LoggingModuleIdentifiers.LOG4J_SLF4J_IMPL.matches(dependency) || LoggingModuleIdentifiers.LOG4J_SLF4J2_IMPL.matches(dependency)) { + } else if (LoggingModuleIdentifiers.LOG4J_SLF4J_IMPL.matches(dependency) + || LoggingModuleIdentifiers.LOG4J_SLF4J2_IMPL.matches(dependency)) { selectCapabilityConflict(CapabilityDefinition.LOG4J2_VS_SLF4J.getCapability(), dependency, because); selectCapabilityConflict(CapabilityDefinition.SLF4J_IMPL.getCapability(), dependency, because); // Slf4j binding towards log4j2, so we need to make sure Log4j-core is selected - selectCapabilityConflict(CapabilityDefinition.LOG4J2_IMPL.getCapability(), validateNotation(LoggingModuleIdentifiers.LOG4J_CORE.moduleId), because); - } else if (LoggingModuleIdentifiers.LOGBACK_CLASSIC.matches(dependency) || LoggingModuleIdentifiers.SLF4J_SIMPLE.matches(dependency)) { + selectCapabilityConflict( + CapabilityDefinition.LOG4J2_IMPL.getCapability(), + validateNotation(LoggingModuleIdentifiers.LOG4J_CORE.moduleId), + because); + } else if (LoggingModuleIdentifiers.LOGBACK_CLASSIC.matches(dependency) + || LoggingModuleIdentifiers.SLF4J_SIMPLE.matches(dependency)) { selectCapabilityConflict(CapabilityDefinition.SLF4J_IMPL.getCapability(), dependency, because); } else { throw new IllegalArgumentException("Provided dependency '" + dependency + "' is not a valid Slf4J binding"); @@ -83,21 +72,36 @@ public void selectSlf4JBinding(String configurationName, Object dependencyNotati ExternalDependency dependency = validateNotation(dependencyNotation); String because = "Logging capabilities plugin selected Slf4J binding"; if (LoggingModuleIdentifiers.SLF4J_LOG4J12.matches(dependency)) { - selectCapabilityConflict(configurationName, CapabilityDefinition.SLF4J_VS_LOG4J.getCapability(), dependency, because); - selectCapabilityConflict(configurationName, CapabilityDefinition.SLF4J_IMPL.getCapability(), dependency, because); + selectCapabilityConflict( + configurationName, CapabilityDefinition.SLF4J_VS_LOG4J.getCapability(), dependency, because); + selectCapabilityConflict( + configurationName, CapabilityDefinition.SLF4J_IMPL.getCapability(), dependency, because); } else if (LoggingModuleIdentifiers.SLF4J_JDK14.matches(dependency)) { - selectCapabilityConflict(configurationName, CapabilityDefinition.SLF4J_VS_JUL.getCapability(), dependency, because); - selectCapabilityConflict(configurationName, CapabilityDefinition.SLF4J_IMPL.getCapability(), dependency, because); + selectCapabilityConflict( + configurationName, CapabilityDefinition.SLF4J_VS_JUL.getCapability(), dependency, because); + selectCapabilityConflict( + configurationName, CapabilityDefinition.SLF4J_IMPL.getCapability(), dependency, because); } else if (LoggingModuleIdentifiers.SLF4J_JCL.matches(dependency)) { - selectCapabilityConflict(configurationName, CapabilityDefinition.SLF4J_VS_JCL.getCapability(), dependency, because); - selectCapabilityConflict(configurationName, CapabilityDefinition.SLF4J_IMPL.getCapability(), dependency, because); - } else if (LoggingModuleIdentifiers.LOG4J_SLF4J_IMPL.matches(dependency) || LoggingModuleIdentifiers.LOG4J_SLF4J2_IMPL.matches(dependency)) { - selectCapabilityConflict(configurationName, CapabilityDefinition.LOG4J2_VS_SLF4J.getCapability(), dependency, because); - selectCapabilityConflict(configurationName, CapabilityDefinition.SLF4J_IMPL.getCapability(), dependency, because); + selectCapabilityConflict( + configurationName, CapabilityDefinition.SLF4J_VS_JCL.getCapability(), dependency, because); + selectCapabilityConflict( + configurationName, CapabilityDefinition.SLF4J_IMPL.getCapability(), dependency, because); + } else if (LoggingModuleIdentifiers.LOG4J_SLF4J_IMPL.matches(dependency) + || LoggingModuleIdentifiers.LOG4J_SLF4J2_IMPL.matches(dependency)) { + selectCapabilityConflict( + configurationName, CapabilityDefinition.LOG4J2_VS_SLF4J.getCapability(), dependency, because); + selectCapabilityConflict( + configurationName, CapabilityDefinition.SLF4J_IMPL.getCapability(), dependency, because); // Slf4j binding towards log4j2, so we need to make sure Log4j-core is selected - selectCapabilityConflict(configurationName, CapabilityDefinition.LOG4J2_IMPL.getCapability(), validateNotation(LoggingModuleIdentifiers.LOG4J_CORE.moduleId), because); - } else if (LoggingModuleIdentifiers.LOGBACK_CLASSIC.matches(dependency) || LoggingModuleIdentifiers.SLF4J_SIMPLE.matches(dependency)) { - selectCapabilityConflict(configurationName, CapabilityDefinition.SLF4J_IMPL.getCapability(), dependency, because); + selectCapabilityConflict( + configurationName, + CapabilityDefinition.LOG4J2_IMPL.getCapability(), + validateNotation(LoggingModuleIdentifiers.LOG4J_CORE.moduleId), + because); + } else if (LoggingModuleIdentifiers.LOGBACK_CLASSIC.matches(dependency) + || LoggingModuleIdentifiers.SLF4J_SIMPLE.matches(dependency)) { + selectCapabilityConflict( + configurationName, CapabilityDefinition.SLF4J_IMPL.getCapability(), dependency, because); } else { throw new IllegalArgumentException("Provided dependency '" + dependency + "' is not a valid Slf4J binding"); } @@ -118,7 +122,8 @@ public void selectLog4J2Implementation(Object dependencyNotation) { } else if (LoggingModuleIdentifiers.LOG4J_TO_SLF4J.matches(dependency)) { selectCapabilityConflict(CapabilityDefinition.LOG4J2_IMPL.getCapability(), dependency, because); } else { - throw new IllegalArgumentException("Provided dependency '" + dependency + "' is not a valid Log4J2 implementation"); + throw new IllegalArgumentException( + "Provided dependency '" + dependency + "' is not a valid Log4J2 implementation"); } } @@ -134,11 +139,14 @@ public void selectLog4J2Implementation(String configurationName, Object dependen ExternalDependency dependency = validateNotation(dependencyNotation); String because = "Logging capabilities plugin selected Log4J2 implementation"; if (LoggingModuleIdentifiers.LOG4J_CORE.matches(dependency)) { - selectCapabilityConflict(configurationName, CapabilityDefinition.LOG4J2_IMPL.getCapability(), dependency, because); + selectCapabilityConflict( + configurationName, CapabilityDefinition.LOG4J2_IMPL.getCapability(), dependency, because); } else if (LoggingModuleIdentifiers.LOG4J_TO_SLF4J.matches(dependency)) { - selectCapabilityConflict(configurationName, CapabilityDefinition.LOG4J2_IMPL.getCapability(), dependency, because); + selectCapabilityConflict( + configurationName, CapabilityDefinition.LOG4J2_IMPL.getCapability(), dependency, because); } else { - throw new IllegalArgumentException("Provided dependency '" + dependency + "' is not a valid Log4J2 implementation"); + throw new IllegalArgumentException( + "Provided dependency '" + dependency + "' is not a valid Log4J2 implementation"); } } @@ -153,16 +161,20 @@ public void selectLog4J12Implementation(Object dependencyNotation) { ExternalDependency dependency = validateNotation(dependencyNotation); String because = "Logging capabilities plugin selected Log4J implementation"; if (LoggingModuleIdentifiers.LOG4J_OVER_SLF4J.matches(dependency)) { - selectCapabilityConflict(CapabilityDefinition.SLF4J_VS_LOG4J2_FOR_LOG4J.getCapability(), dependency, because); + selectCapabilityConflict( + CapabilityDefinition.SLF4J_VS_LOG4J2_FOR_LOG4J.getCapability(), dependency, because); selectCapabilityConflict(CapabilityDefinition.SLF4J_VS_LOG4J.getCapability(), dependency, because); } else if (LoggingModuleIdentifiers.LOG4J12API.matches(dependency)) { - selectCapabilityConflict(CapabilityDefinition.SLF4J_VS_LOG4J2_FOR_LOG4J.getCapability(), dependency, because); + selectCapabilityConflict( + CapabilityDefinition.SLF4J_VS_LOG4J2_FOR_LOG4J.getCapability(), dependency, because); } else if (LoggingModuleIdentifiers.LOG4J.matches(dependency)) { - selectCapabilityConflict(CapabilityDefinition.SLF4J_VS_LOG4J2_FOR_LOG4J.getCapability(), dependency, because); + selectCapabilityConflict( + CapabilityDefinition.SLF4J_VS_LOG4J2_FOR_LOG4J.getCapability(), dependency, because); } else if (LoggingModuleIdentifiers.SLF4J_LOG4J12.matches(dependency)) { selectCapabilityConflict(CapabilityDefinition.SLF4J_VS_LOG4J.getCapability(), dependency, because); } else { - throw new IllegalArgumentException("Provided dependency '" + dependency + "' is not a valid Log4J implementation"); + throw new IllegalArgumentException( + "Provided dependency '" + dependency + "' is not a valid Log4J implementation"); } } @@ -178,16 +190,31 @@ public void selectLog4J12Implementation(String configurationName, Object depende ExternalDependency dependency = validateNotation(dependencyNotation); String because = "Logging capabilities plugin selected Log4J implementation"; if (LoggingModuleIdentifiers.LOG4J_OVER_SLF4J.matches(dependency)) { - selectCapabilityConflict(configurationName, CapabilityDefinition.SLF4J_VS_LOG4J2_FOR_LOG4J.getCapability(), dependency, because); - selectCapabilityConflict(configurationName, CapabilityDefinition.SLF4J_VS_LOG4J.getCapability(), dependency, because); + selectCapabilityConflict( + configurationName, + CapabilityDefinition.SLF4J_VS_LOG4J2_FOR_LOG4J.getCapability(), + dependency, + because); + selectCapabilityConflict( + configurationName, CapabilityDefinition.SLF4J_VS_LOG4J.getCapability(), dependency, because); } else if (LoggingModuleIdentifiers.LOG4J12API.matches(dependency)) { - selectCapabilityConflict(configurationName, CapabilityDefinition.SLF4J_VS_LOG4J2_FOR_LOG4J.getCapability(), dependency, because); + selectCapabilityConflict( + configurationName, + CapabilityDefinition.SLF4J_VS_LOG4J2_FOR_LOG4J.getCapability(), + dependency, + because); } else if (LoggingModuleIdentifiers.LOG4J.matches(dependency)) { - selectCapabilityConflict(configurationName, CapabilityDefinition.SLF4J_VS_LOG4J2_FOR_LOG4J.getCapability(), dependency, because); + selectCapabilityConflict( + configurationName, + CapabilityDefinition.SLF4J_VS_LOG4J2_FOR_LOG4J.getCapability(), + dependency, + because); } else if (LoggingModuleIdentifiers.SLF4J_LOG4J12.matches(dependency)) { - selectCapabilityConflict(configurationName, CapabilityDefinition.SLF4J_VS_LOG4J.getCapability(), dependency, because); + selectCapabilityConflict( + configurationName, CapabilityDefinition.SLF4J_VS_LOG4J.getCapability(), dependency, because); } else { - throw new IllegalArgumentException("Provided dependency '" + dependency + "' is not a valid Log4J implementation"); + throw new IllegalArgumentException( + "Provided dependency '" + dependency + "' is not a valid Log4J implementation"); } } @@ -209,7 +236,8 @@ public void selectJulDelegation(Object dependencyNotation) { } else if (LoggingModuleIdentifiers.LOG4J_JUL.matches(dependency)) { selectCapabilityConflict(CapabilityDefinition.SLF4J_VS_LOG4J2_FOR_JUL.getCapability(), dependency, because); } else { - throw new IllegalArgumentException("Provided dependency '" + dependency + "' is not a valid JUL delegation"); + throw new IllegalArgumentException( + "Provided dependency '" + dependency + "' is not a valid JUL delegation"); } } @@ -225,14 +253,25 @@ public void selectJulDelegation(String configurationName, Object dependencyNotat ExternalDependency dependency = validateNotation(dependencyNotation); String because = "Logging capabilities plugin selected JUL delegation"; if (LoggingModuleIdentifiers.JUL_TO_SLF4J.matches(dependency)) { - selectCapabilityConflict(configurationName, CapabilityDefinition.SLF4J_VS_LOG4J2_FOR_JUL.getCapability(), dependency, because); - selectCapabilityConflict(configurationName, CapabilityDefinition.SLF4J_VS_JUL.getCapability(), dependency, because); + selectCapabilityConflict( + configurationName, + CapabilityDefinition.SLF4J_VS_LOG4J2_FOR_JUL.getCapability(), + dependency, + because); + selectCapabilityConflict( + configurationName, CapabilityDefinition.SLF4J_VS_JUL.getCapability(), dependency, because); } else if (LoggingModuleIdentifiers.SLF4J_JDK14.matches(dependency)) { - selectCapabilityConflict(configurationName, CapabilityDefinition.SLF4J_VS_JUL.getCapability(), dependency, because); + selectCapabilityConflict( + configurationName, CapabilityDefinition.SLF4J_VS_JUL.getCapability(), dependency, because); } else if (LoggingModuleIdentifiers.LOG4J_JUL.matches(dependency)) { - selectCapabilityConflict(configurationName, CapabilityDefinition.SLF4J_VS_LOG4J2_FOR_JUL.getCapability(), dependency, because); + selectCapabilityConflict( + configurationName, + CapabilityDefinition.SLF4J_VS_LOG4J2_FOR_JUL.getCapability(), + dependency, + because); } else { - throw new IllegalArgumentException("Provided dependency '" + dependency + "' is not a valid JUL delegation"); + throw new IllegalArgumentException( + "Provided dependency '" + dependency + "' is not a valid JUL delegation"); } } @@ -257,9 +296,11 @@ public void selectJCLImplementation(Object dependencyNotation) { } else if (LoggingModuleIdentifiers.LOG4J_JCL.matches(dependency)) { selectCapabilityConflict(CapabilityDefinition.SLF4J_VS_LOG4J2_FOR_JCL.getCapability(), dependency, because); ExternalDependency commonsLogging = validateNotation(LoggingModuleIdentifiers.COMMONS_LOGGING.moduleId); - selectCapabilityConflict(CapabilityDefinition.COMMONS_LOGGING_IMPL.getCapability(), commonsLogging, because); + selectCapabilityConflict( + CapabilityDefinition.COMMONS_LOGGING_IMPL.getCapability(), commonsLogging, because); } else { - throw new IllegalArgumentException("Provided dependency '" + dependency + "' is not a valid JCL implementation"); + throw new IllegalArgumentException( + "Provided dependency '" + dependency + "' is not a valid JCL implementation"); } } @@ -275,19 +316,36 @@ public void selectJCLImplementation(String configurationName, Object dependencyN ExternalDependency dependency = validateNotation(dependencyNotation); String because = "Logging capabilities plugin selected JCL implementation"; if (LoggingModuleIdentifiers.JCL_OVER_SLF4J.matches(dependency)) { - selectCapabilityConflict(configurationName, CapabilityDefinition.COMMONS_LOGGING_IMPL.getCapability(), dependency, because); - selectCapabilityConflict(configurationName, CapabilityDefinition.SLF4J_VS_JCL.getCapability(), dependency, because); - selectCapabilityConflict(configurationName, CapabilityDefinition.SLF4J_VS_LOG4J2_FOR_JCL.getCapability(), dependency, because); + selectCapabilityConflict( + configurationName, CapabilityDefinition.COMMONS_LOGGING_IMPL.getCapability(), dependency, because); + selectCapabilityConflict( + configurationName, CapabilityDefinition.SLF4J_VS_JCL.getCapability(), dependency, because); + selectCapabilityConflict( + configurationName, + CapabilityDefinition.SLF4J_VS_LOG4J2_FOR_JCL.getCapability(), + dependency, + because); } else if (LoggingModuleIdentifiers.COMMONS_LOGGING.matches(dependency)) { - selectCapabilityConflict(configurationName, CapabilityDefinition.COMMONS_LOGGING_IMPL.getCapability(), dependency, because); + selectCapabilityConflict( + configurationName, CapabilityDefinition.COMMONS_LOGGING_IMPL.getCapability(), dependency, because); } else if (LoggingModuleIdentifiers.SLF4J_JCL.matches(dependency)) { - selectCapabilityConflict(configurationName, CapabilityDefinition.SLF4J_VS_JCL.getCapability(), dependency, because); + selectCapabilityConflict( + configurationName, CapabilityDefinition.SLF4J_VS_JCL.getCapability(), dependency, because); } else if (LoggingModuleIdentifiers.LOG4J_JCL.matches(dependency)) { - selectCapabilityConflict(configurationName, CapabilityDefinition.SLF4J_VS_LOG4J2_FOR_JCL.getCapability(), dependency, because); + selectCapabilityConflict( + configurationName, + CapabilityDefinition.SLF4J_VS_LOG4J2_FOR_JCL.getCapability(), + dependency, + because); ExternalDependency commonsLogging = validateNotation(LoggingModuleIdentifiers.COMMONS_LOGGING.moduleId); - selectCapabilityConflict(configurationName, CapabilityDefinition.COMMONS_LOGGING_IMPL.getCapability(), commonsLogging, because); + selectCapabilityConflict( + configurationName, + CapabilityDefinition.COMMONS_LOGGING_IMPL.getCapability(), + commonsLogging, + because); } else { - throw new IllegalArgumentException("Provided dependency '" + dependency + "' is not a valid JCL implementation"); + throw new IllegalArgumentException( + "Provided dependency '" + dependency + "' is not a valid JCL implementation"); } } @@ -304,11 +362,13 @@ public void selectSlf4JLog4J2Interaction(Object dependencyNotation) { if (LoggingModuleIdentifiers.LOG4J_TO_SLF4J.matches(dependency)) { selectCapabilityConflict(CapabilityDefinition.LOG4J2_VS_SLF4J.getCapability(), dependency, because); selectCapabilityConflict(CapabilityDefinition.LOG4J2_IMPL.getCapability(), dependency, because); - } else if (LoggingModuleIdentifiers.LOG4J_SLF4J_IMPL.matches(dependency) || LoggingModuleIdentifiers.LOG4J_SLF4J2_IMPL.matches(dependency)) { + } else if (LoggingModuleIdentifiers.LOG4J_SLF4J_IMPL.matches(dependency) + || LoggingModuleIdentifiers.LOG4J_SLF4J2_IMPL.matches(dependency)) { selectCapabilityConflict(CapabilityDefinition.SLF4J_IMPL.getCapability(), dependency, because); selectCapabilityConflict(CapabilityDefinition.LOG4J2_VS_SLF4J.getCapability(), dependency, because); } else { - throw new IllegalArgumentException("Provided dependency '" + dependency + "' is not a valid Slf4J / Log4J 2 interaction"); + throw new IllegalArgumentException( + "Provided dependency '" + dependency + "' is not a valid Slf4J / Log4J 2 interaction"); } } @@ -324,13 +384,19 @@ public void selectSlf4JLog4J2Interaction(String configurationName, Object depend ExternalDependency dependency = validateNotation(dependencyNotation); String because = "Logging capabilities plugin selected Slf4J Log4J 2 interaction"; if (LoggingModuleIdentifiers.LOG4J_TO_SLF4J.matches(dependency)) { - selectCapabilityConflict(configurationName, CapabilityDefinition.LOG4J2_VS_SLF4J.getCapability(), dependency, because); - selectCapabilityConflict(configurationName, CapabilityDefinition.LOG4J2_IMPL.getCapability(), dependency, because); - } else if (LoggingModuleIdentifiers.LOG4J_SLF4J_IMPL.matches(dependency) || LoggingModuleIdentifiers.LOG4J_SLF4J2_IMPL.matches(dependency)) { - selectCapabilityConflict(configurationName, CapabilityDefinition.SLF4J_IMPL.getCapability(), dependency, because); - selectCapabilityConflict(configurationName, CapabilityDefinition.LOG4J2_VS_SLF4J.getCapability(), dependency, because); + selectCapabilityConflict( + configurationName, CapabilityDefinition.LOG4J2_VS_SLF4J.getCapability(), dependency, because); + selectCapabilityConflict( + configurationName, CapabilityDefinition.LOG4J2_IMPL.getCapability(), dependency, because); + } else if (LoggingModuleIdentifiers.LOG4J_SLF4J_IMPL.matches(dependency) + || LoggingModuleIdentifiers.LOG4J_SLF4J2_IMPL.matches(dependency)) { + selectCapabilityConflict( + configurationName, CapabilityDefinition.SLF4J_IMPL.getCapability(), dependency, because); + selectCapabilityConflict( + configurationName, CapabilityDefinition.LOG4J2_VS_SLF4J.getCapability(), dependency, because); } else { - throw new IllegalArgumentException("Provided dependency '" + dependency + "' is not a valid Slf4J / Log4J 2 interaction"); + throw new IllegalArgumentException( + "Provided dependency '" + dependency + "' is not a valid Slf4J / Log4J 2 interaction"); } } @@ -394,7 +460,6 @@ public void enforceLog4J2() { selectJulDelegation(LoggingModuleIdentifiers.LOG4J_JUL.moduleId); selectJCLImplementation(LoggingModuleIdentifiers.LOG4J_JCL.moduleId); selectLog4J12Implementation(LoggingModuleIdentifiers.LOG4J12API.moduleId); - } /** @@ -438,34 +503,41 @@ private ExternalDependency validateNotation(Object dependencyNotation) { if (dependency instanceof ExternalDependency) { return (ExternalDependency) dependency; } else { - throw new IllegalArgumentException("Provided notation '" + dependencyNotation + "' cannot be converted to an ExternalDependency"); + throw new IllegalArgumentException( + "Provided notation '" + dependencyNotation + "' cannot be converted to an ExternalDependency"); } } - private void selectCapabilityConflict(String configuration, String capabilityId, ExternalDependency target, String because) { + private void selectCapabilityConflict( + String configuration, String capabilityId, ExternalDependency target, String because) { getConfigurations().configureEach(conf -> { if (conf.getName().equals(configuration)) { - conf.getResolutionStrategy().capabilitiesResolution(getCapabilitiesResolutionAction(capabilityId, target, because)); + conf.getResolutionStrategy() + .capabilitiesResolution(getCapabilitiesResolutionAction(capabilityId, target, because)); } }); } private void selectCapabilityConflict(String capabilityId, ExternalDependency target, String because) { - getConfigurations().configureEach(conf -> conf.getResolutionStrategy().capabilitiesResolution(getCapabilitiesResolutionAction(capabilityId, target, because))); + getConfigurations().configureEach(conf -> conf.getResolutionStrategy() + .capabilitiesResolution(getCapabilitiesResolutionAction(capabilityId, target, because))); } - private Action getCapabilitiesResolutionAction(String capabilityId, ExternalDependency target, String because) { + private Action getCapabilitiesResolutionAction( + String capabilityId, ExternalDependency target, String because) { return resolution -> resolution.withCapability(capabilityId, details -> { - details.getCandidates().stream().filter(candidate -> { - ComponentIdentifier id = candidate.getId(); - if (!(id instanceof ModuleComponentIdentifier)) { - return false; - } - ModuleComponentIdentifier moduleId = (ModuleComponentIdentifier) id; - return moduleId.getGroup().equals(target.getGroup()) - && moduleId.getModule().equals(target.getName()); - }).findFirst().ifPresent(candidate -> details.select(candidate).because(because)); + details.getCandidates().stream() + .filter(candidate -> { + ComponentIdentifier id = candidate.getId(); + if (!(id instanceof ModuleComponentIdentifier)) { + return false; + } + ModuleComponentIdentifier moduleId = (ModuleComponentIdentifier) id; + return moduleId.getGroup().equals(target.getGroup()) + && moduleId.getModule().equals(target.getName()); + }) + .findFirst() + .ifPresent(candidate -> details.select(candidate).because(because)); }); } - } diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/Patch.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/Patch.java index 31b90b67..ea8c22f6 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/Patch.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/Patch.java @@ -1,30 +1,14 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.resolution; +import java.util.Arrays; +import javax.inject.Inject; import org.gradle.api.Action; import org.gradle.api.artifacts.dsl.DependencyHandler; import org.gradle.api.model.ObjectFactory; import org.gradlex.jvm.dependency.conflict.resolution.rules.AddAlignmentConstraintsMetadataRule; import org.gradlex.jvm.dependency.conflict.resolution.rules.AddBomDependencyMetadataRule; -import javax.inject.Inject; -import java.util.Arrays; - public abstract class Patch { @Inject @@ -52,7 +36,9 @@ public void module(String module, Action action) { */ public void alignWithBom(String bom, String... modules) { for (String module : modules) { - getDependencies().getComponents().withModule(module, AddBomDependencyMetadataRule.class, r -> r.params(bom)); + getDependencies() + .getComponents() + .withModule(module, AddBomDependencyMetadataRule.class, r -> r.params(bom)); } } @@ -61,7 +47,10 @@ public void alignWithBom(String bom, String... modules) { */ public void align(String... modules) { for (String module : modules) { - getDependencies().getComponents().withModule(module, AddAlignmentConstraintsMetadataRule.class, r -> r.params(Arrays.asList(modules))); + getDependencies() + .getComponents() + .withModule( + module, AddAlignmentConstraintsMetadataRule.class, r -> r.params(Arrays.asList(modules))); } } } diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/PatchModule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/PatchModule.java index 5d0d6b82..9edd36ce 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/PatchModule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/PatchModule.java @@ -1,21 +1,8 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.resolution; +import java.util.Arrays; +import javax.inject.Inject; import org.gradle.api.artifacts.dsl.DependencyHandler; import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; import org.gradlex.jvm.dependency.conflict.resolution.rules.AddApiDependencyMetadataRule; @@ -30,9 +17,6 @@ import org.gradlex.jvm.dependency.conflict.resolution.rules.RemoveCapabilityMetadataRule; import org.gradlex.jvm.dependency.conflict.resolution.rules.RemoveDependencyMetadataRule; -import javax.inject.Inject; -import java.util.Arrays; - public abstract class PatchModule { @Inject @@ -50,7 +34,9 @@ public PatchModule(String module) { * See: component_metadata_rules.html#fixing_wrong_dependency_details */ public void addApiDependency(String dependency) { - getDependencies().getComponents().withModule(module, AddApiDependencyMetadataRule.class, r -> r.params(dependency)); + getDependencies() + .getComponents() + .withModule(module, AddApiDependencyMetadataRule.class, r -> r.params(dependency)); } /** @@ -58,7 +44,9 @@ public void addApiDependency(String dependency) { * See: component_metadata_rules.html#fixing_wrong_dependency_details */ public void addRuntimeOnlyDependency(String dependency) { - getDependencies().getComponents().withModule(module, AddRuntimeOnlyDependencyMetadataRule.class, r -> r.params(dependency)); + getDependencies() + .getComponents() + .withModule(module, AddRuntimeOnlyDependencyMetadataRule.class, r -> r.params(dependency)); } /** @@ -66,7 +54,9 @@ public void addRuntimeOnlyDependency(String dependency) { * See: component_metadata_rules.html#fixing_wrong_dependency_details */ public void addCompileOnlyApiDependency(String dependency) { - getDependencies().getComponents().withModule(module, AddCompileOnlyApiDependencyMetadataRule.class, r -> r.params(dependency)); + getDependencies() + .getComponents() + .withModule(module, AddCompileOnlyApiDependencyMetadataRule.class, r -> r.params(dependency)); } /** @@ -74,7 +64,9 @@ public void addCompileOnlyApiDependency(String dependency) { * See: component_metadata_rules.html#fixing_wrong_dependency_details */ public void removeDependency(String dependency) { - getDependencies().getComponents().withModule(module, RemoveDependencyMetadataRule.class, r -> r.params(dependency)); + getDependencies() + .getComponents() + .withModule(module, RemoveDependencyMetadataRule.class, r -> r.params(dependency)); } /** @@ -82,7 +74,9 @@ public void removeDependency(String dependency) { * See: component_metadata_rules.html#fixing_wrong_dependency_details */ public void reduceToRuntimeOnlyDependency(String dependency) { - getDependencies().getComponents().withModule(module, ReduceToRuntimeOnlyDependencyMetadataRule.class, r -> r.params(dependency)); + getDependencies() + .getComponents() + .withModule(module, ReduceToRuntimeOnlyDependencyMetadataRule.class, r -> r.params(dependency)); } /** @@ -90,7 +84,9 @@ public void reduceToRuntimeOnlyDependency(String dependency) { * See: component_metadata_rules.html#fixing_wrong_dependency_details */ public void reduceToCompileOnlyApiDependency(String dependency) { - getDependencies().getComponents().withModule(module, ReduceToCompileOnlyApiDependencyMetadataRule.class, r -> r.params(dependency)); + getDependencies() + .getComponents() + .withModule(module, ReduceToCompileOnlyApiDependencyMetadataRule.class, r -> r.params(dependency)); } /** @@ -108,7 +104,9 @@ public void addCapability(CapabilityDefinition capability) { * See: blog.gradle.org/addressing-logging-complexity-capabilities */ public void addCapability(String capability) { - getDependencies().getComponents().withModule(module, AddCapabilityMetadataRule.class, r -> r.params(capability)); + getDependencies() + .getComponents() + .withModule(module, AddCapabilityMetadataRule.class, r -> r.params(capability)); } /** @@ -126,7 +124,9 @@ public void removeCapability(CapabilityDefinition capability) { * See: blog.gradle.org/addressing-logging-complexity-capabilities */ public void removeCapability(String capability) { - getDependencies().getComponents().withModule(module, RemoveCapabilityMetadataRule.class, r -> r.params(capability)); + getDependencies() + .getComponents() + .withModule(module, RemoveCapabilityMetadataRule.class, r -> r.params(capability)); } /** @@ -145,7 +145,12 @@ public void addFeature(String classifier) { * See: component_metadata_rules.html#adding_variants_for_native_jars */ public void addTargetPlatformVariant(String classifier, String operatingSystem, String architecture) { - getDependencies().getComponents().withModule(module, AddTargetPlatformVariantsMetadataRule.class, r -> r.params("", classifier, operatingSystem, architecture)); + getDependencies() + .getComponents() + .withModule( + module, + AddTargetPlatformVariantsMetadataRule.class, + r -> r.params("", classifier, operatingSystem, architecture)); } /** @@ -154,8 +159,14 @@ public void addTargetPlatformVariant(String classifier, String operatingSystem, * A 'feature' (aka Capability) can optionally be defined to require the variant to be addressed by it. * See: component_metadata_rules.html#adding_variants_for_native_jars */ - public void addTargetPlatformVariant(String feature, String classifier, String operatingSystem, String architecture) { - getDependencies().getComponents().withModule(module, AddTargetPlatformVariantsMetadataRule.class, r -> r.params(feature, classifier, operatingSystem, architecture)); + public void addTargetPlatformVariant( + String feature, String classifier, String operatingSystem, String architecture) { + getDependencies() + .getComponents() + .withModule( + module, + AddTargetPlatformVariantsMetadataRule.class, + r -> r.params(feature, classifier, operatingSystem, architecture)); } /** @@ -164,7 +175,8 @@ public void addTargetPlatformVariant(String feature, String classifier, String o * See: component_metadata_rules.html#sec:custom_status_scheme */ public void setStatusToIntegration(String... markerInVersion) { - getDependencies().getComponents().withModule(module, ComponentStatusRule.class, r -> r.params(Arrays.asList(markerInVersion))); + getDependencies() + .getComponents() + .withModule(module, ComponentStatusRule.class, r -> r.params(Arrays.asList(markerInVersion))); } - } diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/Slf4JEnforcementSubstitutionsUsing.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/Slf4JEnforcementSubstitutionsUsing.java index cc605085..7f079e96 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/Slf4JEnforcementSubstitutionsUsing.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/Slf4JEnforcementSubstitutionsUsing.java @@ -1,19 +1,4 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.resolution; import org.gradle.api.Action; @@ -39,16 +24,30 @@ public void execute(Configuration configuration) { return; } configuration.getResolutionStrategy().dependencySubstitution(substitution -> { - ComponentSelector log4JOverSlf4J = substitution.module(LoggingModuleIdentifiers.LOG4J_OVER_SLF4J.asFirstVersion()); - substitution.substitute(substitution.module(LoggingModuleIdentifiers.LOG4J.moduleId)).using(log4JOverSlf4J); - substitution.substitute(substitution.module(LoggingModuleIdentifiers.LOG4J12API.moduleId)).using(log4JOverSlf4J); - - substitution.substitute(substitution.module(LoggingModuleIdentifiers.LOG4J_JUL.moduleId)).using(substitution.module(LoggingModuleIdentifiers.JUL_TO_SLF4J.asFirstVersion())); - - ComponentSelector jclOverSlf4J = substitution.module(LoggingModuleIdentifiers.JCL_OVER_SLF4J.asFirstVersion()); - substitution.substitute(substitution.module(LoggingModuleIdentifiers.COMMONS_LOGGING.moduleId)).using(jclOverSlf4J); - substitution.substitute(substitution.module(LoggingModuleIdentifiers.LOG4J_JCL.moduleId)).using(jclOverSlf4J); - substitution.substitute(substitution.module(LoggingModuleIdentifiers.SPRING_JCL.moduleId)).using(jclOverSlf4J); + ComponentSelector log4JOverSlf4J = + substitution.module(LoggingModuleIdentifiers.LOG4J_OVER_SLF4J.asFirstVersion()); + substitution + .substitute(substitution.module(LoggingModuleIdentifiers.LOG4J.moduleId)) + .using(log4JOverSlf4J); + substitution + .substitute(substitution.module(LoggingModuleIdentifiers.LOG4J12API.moduleId)) + .using(log4JOverSlf4J); + + substitution + .substitute(substitution.module(LoggingModuleIdentifiers.LOG4J_JUL.moduleId)) + .using(substitution.module(LoggingModuleIdentifiers.JUL_TO_SLF4J.asFirstVersion())); + + ComponentSelector jclOverSlf4J = + substitution.module(LoggingModuleIdentifiers.JCL_OVER_SLF4J.asFirstVersion()); + substitution + .substitute(substitution.module(LoggingModuleIdentifiers.COMMONS_LOGGING.moduleId)) + .using(jclOverSlf4J); + substitution + .substitute(substitution.module(LoggingModuleIdentifiers.LOG4J_JCL.moduleId)) + .using(jclOverSlf4J); + substitution + .substitute(substitution.module(LoggingModuleIdentifiers.SPRING_JCL.moduleId)) + .using(jclOverSlf4J); }); } } diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/package-info.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/package-info.java index beb155fb..2b12a1ac 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/package-info.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/package-info.java @@ -1,20 +1,5 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 @NullMarked package org.gradlex.jvm.dependency.conflict.resolution; -import org.jspecify.annotations.NullMarked; \ No newline at end of file +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddAlignmentConstraintsMetadataRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddAlignmentConstraintsMetadataRule.java index 5d6ec5d1..c5a2c610 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddAlignmentConstraintsMetadataRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddAlignmentConstraintsMetadataRule.java @@ -1,28 +1,12 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.resolution.rules; +import java.util.List; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ComponentMetadataContext; import org.gradle.api.artifacts.ComponentMetadataRule; -import javax.inject.Inject; -import java.util.List; - /** * See: * blog.gradle.org/alignment-with-gradle-module-metadata @@ -46,7 +30,7 @@ public void execute(ComponentMetadataContext context) { for (String member : components) { if (member.contains(":")) { c.add(member + ":" + version); - } else { + } else { c.add(group + ":" + member + ":" + version); } } diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddApiDependencyMetadataRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddApiDependencyMetadataRule.java index c7494b7c..98a0b149 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddApiDependencyMetadataRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddApiDependencyMetadataRule.java @@ -1,31 +1,15 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.resolution.rules; +import static org.gradlex.jvm.dependency.conflict.resolution.rules.VariantSelection.allVariantsMatching; + +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ComponentMetadataContext; import org.gradle.api.artifacts.ComponentMetadataRule; import org.gradle.api.attributes.Category; import org.gradle.api.attributes.Usage; -import javax.inject.Inject; - -import static org.gradlex.jvm.dependency.conflict.resolution.rules.VariantSelection.allVariantsMatching; - /** * See: * @@ -43,8 +27,11 @@ public AddApiDependencyMetadataRule(String dependency) { @Override public void execute(ComponentMetadataContext context) { - allVariantsMatching(context, - id -> (id.matches(Usage.USAGE_ATTRIBUTE, Usage.JAVA_API) || id.matches(Usage.USAGE_ATTRIBUTE, Usage.JAVA_RUNTIME)) && id.matches(Category.CATEGORY_ATTRIBUTE, Category.LIBRARY), + allVariantsMatching( + context, + id -> (id.matches(Usage.USAGE_ATTRIBUTE, Usage.JAVA_API) + || id.matches(Usage.USAGE_ATTRIBUTE, Usage.JAVA_RUNTIME)) + && id.matches(Category.CATEGORY_ATTRIBUTE, Category.LIBRARY), v -> v.withDependencies(d -> d.add(dependency))); } } diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddBomDependencyMetadataRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddBomDependencyMetadataRule.java index 27819886..5b73c873 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddBomDependencyMetadataRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddBomDependencyMetadataRule.java @@ -1,29 +1,13 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.resolution.rules; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ComponentMetadataContext; import org.gradle.api.artifacts.ComponentMetadataRule; import org.gradle.api.attributes.Category; import org.gradle.api.model.ObjectFactory; -import javax.inject.Inject; - /** * See: * @@ -45,7 +29,11 @@ public AddBomDependencyMetadataRule(String bom) { @Override public void execute(ComponentMetadataContext context) { String version = context.getDetails().getId().getVersion(); - context.getDetails().allVariants(v -> v.withDependencies(dependencies -> dependencies.add(bom + ":" + version, - d -> d.attributes(a -> a.attribute(Category.CATEGORY_ATTRIBUTE, getObjects().named(Category.class, Category.REGULAR_PLATFORM)))))); + context.getDetails() + .allVariants(v -> v.withDependencies(dependencies -> dependencies.add( + bom + ":" + version, + d -> d.attributes(a -> a.attribute( + Category.CATEGORY_ATTRIBUTE, + getObjects().named(Category.class, Category.REGULAR_PLATFORM)))))); } } diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddCapabilityMetadataRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddCapabilityMetadataRule.java index 7c3b4668..7a7e94df 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddCapabilityMetadataRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddCapabilityMetadataRule.java @@ -1,27 +1,12 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.resolution.rules; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ComponentMetadataContext; import org.gradle.api.artifacts.ComponentMetadataRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; -import javax.inject.Inject; /** * See: * diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddCompileOnlyApiDependencyMetadataRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddCompileOnlyApiDependencyMetadataRule.java index 42c68c32..4de48739 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddCompileOnlyApiDependencyMetadataRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddCompileOnlyApiDependencyMetadataRule.java @@ -1,31 +1,15 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.resolution.rules; +import static org.gradlex.jvm.dependency.conflict.resolution.rules.VariantSelection.allVariantsMatching; + +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ComponentMetadataContext; import org.gradle.api.artifacts.ComponentMetadataRule; import org.gradle.api.attributes.Category; import org.gradle.api.attributes.Usage; -import javax.inject.Inject; - -import static org.gradlex.jvm.dependency.conflict.resolution.rules.VariantSelection.allVariantsMatching; - /** * See: * @@ -43,8 +27,10 @@ public AddCompileOnlyApiDependencyMetadataRule(String dependency) { @Override public void execute(ComponentMetadataContext context) { - allVariantsMatching(context, - id -> (id.matches(Usage.USAGE_ATTRIBUTE, Usage.JAVA_API) && id.matches(Category.CATEGORY_ATTRIBUTE, Category.LIBRARY)), + allVariantsMatching( + context, + id -> (id.matches(Usage.USAGE_ATTRIBUTE, Usage.JAVA_API) + && id.matches(Category.CATEGORY_ATTRIBUTE, Category.LIBRARY)), v -> v.withDependencies(d -> d.add(dependency))); } } diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddFeatureMetadataRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddFeatureMetadataRule.java index 5a6ad3b1..16f854be 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddFeatureMetadataRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddFeatureMetadataRule.java @@ -1,28 +1,12 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.resolution.rules; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ComponentMetadataContext; import org.gradle.api.artifacts.ComponentMetadataRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; -import javax.inject.Inject; - /** * See: * @@ -45,7 +29,8 @@ public void execute(ComponentMetadataContext context) { addFeatureVariant(context, classifier, "Runtime", "runtime"); } - private static void addFeatureVariant(ComponentMetadataContext context, String classifier, String nameSuffix, String baseVariant) { + private static void addFeatureVariant( + ComponentMetadataContext context, String classifier, String nameSuffix, String baseVariant) { ModuleVersionIdentifier id = context.getDetails().getId(); String group = id.getGroup(); String name = id.getName(); diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddRuntimeOnlyDependencyMetadataRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddRuntimeOnlyDependencyMetadataRule.java index ddbb775d..42adac5c 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddRuntimeOnlyDependencyMetadataRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddRuntimeOnlyDependencyMetadataRule.java @@ -1,31 +1,15 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.resolution.rules; +import static org.gradlex.jvm.dependency.conflict.resolution.rules.VariantSelection.allVariantsMatching; + +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ComponentMetadataContext; import org.gradle.api.artifacts.ComponentMetadataRule; import org.gradle.api.attributes.Category; import org.gradle.api.attributes.Usage; -import javax.inject.Inject; - -import static org.gradlex.jvm.dependency.conflict.resolution.rules.VariantSelection.allVariantsMatching; - /** * See: * @@ -43,8 +27,10 @@ public AddRuntimeOnlyDependencyMetadataRule(String dependency) { @Override public void execute(ComponentMetadataContext context) { - allVariantsMatching(context, - id -> id.matches(Usage.USAGE_ATTRIBUTE, Usage.JAVA_RUNTIME) && id.matches(Category.CATEGORY_ATTRIBUTE, Category.LIBRARY), + allVariantsMatching( + context, + id -> id.matches(Usage.USAGE_ATTRIBUTE, Usage.JAVA_RUNTIME) + && id.matches(Category.CATEGORY_ATTRIBUTE, Category.LIBRARY), v -> v.withDependencies(d -> d.add(dependency))); } } diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddTargetPlatformVariantsMetadataRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddTargetPlatformVariantsMetadataRule.java index 06b15eee..9d45f848 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddTargetPlatformVariantsMetadataRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddTargetPlatformVariantsMetadataRule.java @@ -1,21 +1,10 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.resolution.rules; +import static org.gradle.nativeplatform.MachineArchitecture.ARCHITECTURE_ATTRIBUTE; +import static org.gradle.nativeplatform.OperatingSystemFamily.OPERATING_SYSTEM_ATTRIBUTE; + +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ComponentMetadataContext; import org.gradle.api.artifacts.ComponentMetadataDetails; @@ -25,11 +14,6 @@ import org.gradle.nativeplatform.MachineArchitecture; import org.gradle.nativeplatform.OperatingSystemFamily; -import javax.inject.Inject; - -import static org.gradle.nativeplatform.MachineArchitecture.ARCHITECTURE_ATTRIBUTE; -import static org.gradle.nativeplatform.OperatingSystemFamily.OPERATING_SYSTEM_ATTRIBUTE; - /** * See: * @@ -44,10 +28,11 @@ public abstract class AddTargetPlatformVariantsMetadataRule implements Component private final String architecture; @Inject - abstract protected ObjectFactory getObjects(); + protected abstract ObjectFactory getObjects(); @Inject - public AddTargetPlatformVariantsMetadataRule(String feature, String classifier, String operatingSystem, String architecture) { + public AddTargetPlatformVariantsMetadataRule( + String feature, String classifier, String operatingSystem, String architecture) { this.feature = feature; this.classifier = classifier; this.operatingSystem = operatingSystem; @@ -91,7 +76,8 @@ private void addTargetPlatformVariant(ComponentMetadataDetails details, String n private void configureAttributes(VariantMetadata variant) { variant.attributes(attributes -> { - attributes.attribute(OPERATING_SYSTEM_ATTRIBUTE, getObjects().named(OperatingSystemFamily.class, operatingSystem)); + attributes.attribute( + OPERATING_SYSTEM_ATTRIBUTE, getObjects().named(OperatingSystemFamily.class, operatingSystem)); attributes.attribute(ARCHITECTURE_ATTRIBUTE, getObjects().named(MachineArchitecture.class, architecture)); }); } diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/ComponentStatusRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/ComponentStatusRule.java index f77f9135..25c599a1 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/ComponentStatusRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/ComponentStatusRule.java @@ -1,28 +1,12 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.resolution.rules; +import java.util.List; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ComponentMetadataContext; import org.gradle.api.artifacts.ComponentMetadataRule; -import javax.inject.Inject; -import java.util.List; - /** * Sets status of component versions that are not final releases to 'integration' instead of 'release'. * Otherwise, they are considered when asking for the 'latest.release' version. diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/GuavaComponentRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/GuavaComponentRule.java index fb9c23ac..2cfd8d21 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/GuavaComponentRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/GuavaComponentRule.java @@ -1,21 +1,8 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.resolution.rules; +import java.util.Arrays; +import java.util.List; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ComponentMetadataContext; import org.gradle.api.artifacts.ComponentMetadataDetails; @@ -23,9 +10,6 @@ import org.gradle.api.artifacts.VariantMetadata; import org.gradle.api.attributes.Attribute; -import java.util.Arrays; -import java.util.List; - /** * Kept for individual usage to get the patch functionality for older Guava versions. * Might be removed in future versions. @@ -45,9 +29,9 @@ */ @CacheableRule @Deprecated -abstract public class GuavaComponentRule implements ComponentMetadataRule { +public abstract class GuavaComponentRule implements ComponentMetadataRule { - private final static Attribute TARGET_JVM_ENVIRONMENT_ATTRIBUTE = + private static final Attribute TARGET_JVM_ENVIRONMENT_ATTRIBUTE = Attribute.of("org.gradle.jvm.environment", String.class); private final List RUNTIME_VARIANT_NAMES = @@ -58,7 +42,8 @@ public void execute(ComponentMetadataContext ctx) { // if (majorVersion <= 32) // May add this check should https://github.com/google/guava/pull/6606 be done removeAnnotationProcessorDependenciesFromRuntime(ctx.getDetails()); - if ((majorVersion >= 22 && majorVersion <= 31) || ctx.getDetails().getId().getVersion().startsWith("32.0")) { + if ((majorVersion >= 22 && majorVersion <= 31) + || ctx.getDetails().getId().getVersion().startsWith("32.0")) { removeAnimalSnifferAnnotations(ctx.getDetails()); addOtherJvmVariant("Compile", ctx.getDetails()); @@ -76,8 +61,10 @@ private void removeAnnotationProcessorDependenciesFromRuntime(ComponentMetadataD // everything outside the 'com.google.guava' group is an annotation processor String guavaGroup = details.getId().getGroup(); for (String runtime : RUNTIME_VARIANT_NAMES) { - details.withVariant(runtime, variant -> variant.withDependencies(dependencies -> - dependencies.removeIf(dependency -> !guavaGroup.equals(dependency.getGroup())))); + details.withVariant( + runtime, + variant -> variant.withDependencies(dependencies -> + dependencies.removeIf(dependency -> !guavaGroup.equals(dependency.getGroup())))); } } @@ -105,28 +92,37 @@ private void addOtherJvmVariant(String baseVariantName, ComponentMetadataDetails String env = isAndroidVariantVersion ? "android" : "standard-jvm"; - String otherJarSuffix = isAndroidVariantVersion ? - "22.0".equals(version) || "23.0".equals(version) ? "" : "-jre" : "-android"; + String otherJarSuffix = + isAndroidVariantVersion ? "22.0".equals(version) || "23.0".equals(version) ? "" : "-jre" : "-android"; String otherEnv = isAndroidVariantVersion ? "standard-jvm" : "android"; String otherVariantName = isAndroidVariantVersion ? "standardJvm" : "android"; - details.withVariant(baseVariantName.toLowerCase(), variant -> variant.attributes(a -> { - a.attribute(TARGET_JVM_ENVIRONMENT_ATTRIBUTE, env); - })); + details.withVariant( + baseVariantName.toLowerCase(), + variant -> variant.attributes(a -> { + a.attribute(TARGET_JVM_ENVIRONMENT_ATTRIBUTE, env); + })); details.addVariant(otherVariantName + baseVariantName, baseVariantName.toLowerCase(), variant -> { variant.attributes(a -> { a.attribute(TARGET_JVM_ENVIRONMENT_ATTRIBUTE, otherEnv); }); - adjustDependenciesForGuava31AndLower(variant, baseVariantName, version, majorVersion, isAndroidVariantVersion); + adjustDependenciesForGuava31AndLower( + variant, baseVariantName, version, majorVersion, isAndroidVariantVersion); variant.withFiles(files -> { files.removeAllFiles(); - files.addFile("guava-" + version + otherJarSuffix + ".jar", + files.addFile( + "guava-" + version + otherJarSuffix + ".jar", "../" + version + otherJarSuffix + "/guava-" + version + otherJarSuffix + ".jar"); }); }); } - private void adjustDependenciesForGuava31AndLower(VariantMetadata variant, String baseVariantName, String version, int majorVersion, boolean isAndroidVariantVersion) { + private void adjustDependenciesForGuava31AndLower( + VariantMetadata variant, + String baseVariantName, + String version, + int majorVersion, + boolean isAndroidVariantVersion) { if ((majorVersion >= 26 && majorVersion < 31) || version.startsWith("31.0") || "25.1".equals(version)) { variant.withDependencies(dependencies -> { if (majorVersion < 31 || isAndroidVariantVersion) { @@ -145,7 +141,10 @@ private String checkerVersionFor(String guavaVersion, boolean androidVariant) { if (androidVariant) { if (guavaVersion.equals("25.1")) { version = "2.0.0"; - } else if (guavaVersion.startsWith("28.") || guavaVersion.startsWith("29.") || guavaVersion.startsWith("30.") || guavaVersion.startsWith("31.")) { + } else if (guavaVersion.startsWith("28.") + || guavaVersion.startsWith("29.") + || guavaVersion.startsWith("30.") + || guavaVersion.startsWith("31.")) { version = "2.5.5"; } else { version = "2.5.2"; @@ -163,7 +162,7 @@ private String checkerVersionFor(String guavaVersion, boolean androidVariant) { version = "2.10.0"; } else if (guavaVersion.startsWith("28.")) { version = "2.8.1"; - } else if (guavaVersion.startsWith("26.") || guavaVersion.startsWith("27.")) { + } else if (guavaVersion.startsWith("26.") || guavaVersion.startsWith("27.")) { version = "2.5.2"; } else if (guavaVersion.startsWith("25.")) { version = "2.0.0"; @@ -172,4 +171,4 @@ private String checkerVersionFor(String guavaVersion, boolean androidVariant) { return name + ":" + version; } -} \ No newline at end of file +} diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/ReduceToCompileOnlyApiDependencyMetadataRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/ReduceToCompileOnlyApiDependencyMetadataRule.java index 9a02a6ac..40d7ac6e 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/ReduceToCompileOnlyApiDependencyMetadataRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/ReduceToCompileOnlyApiDependencyMetadataRule.java @@ -1,32 +1,16 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.resolution.rules; +import static org.gradlex.jvm.dependency.conflict.resolution.rules.VariantSelection.allVariantsMatching; + +import java.util.stream.Collectors; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ComponentMetadataContext; import org.gradle.api.artifacts.ComponentMetadataRule; import org.gradle.api.attributes.Category; import org.gradle.api.attributes.Usage; -import javax.inject.Inject; -import java.util.stream.Collectors; - -import static org.gradlex.jvm.dependency.conflict.resolution.rules.VariantSelection.allVariantsMatching; - /** * See: * @@ -44,8 +28,12 @@ public ReduceToCompileOnlyApiDependencyMetadataRule(String dependency) { @Override public void execute(ComponentMetadataContext context) { - allVariantsMatching(context, - id -> id.matches(Usage.USAGE_ATTRIBUTE, Usage.JAVA_RUNTIME) && id.matches(Category.CATEGORY_ATTRIBUTE, Category.LIBRARY), - v -> v.withDependencies(d -> d.removeAll(d.stream().filter(it -> dependency.equals(it.getModule().toString())).collect(Collectors.toList())))); + allVariantsMatching( + context, + id -> id.matches(Usage.USAGE_ATTRIBUTE, Usage.JAVA_RUNTIME) + && id.matches(Category.CATEGORY_ATTRIBUTE, Category.LIBRARY), + v -> v.withDependencies(d -> d.removeAll(d.stream() + .filter(it -> dependency.equals(it.getModule().toString())) + .collect(Collectors.toList())))); } } diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/ReduceToRuntimeOnlyDependencyMetadataRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/ReduceToRuntimeOnlyDependencyMetadataRule.java index 7f628288..2fddb87a 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/ReduceToRuntimeOnlyDependencyMetadataRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/ReduceToRuntimeOnlyDependencyMetadataRule.java @@ -1,32 +1,16 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.resolution.rules; +import static org.gradlex.jvm.dependency.conflict.resolution.rules.VariantSelection.allVariantsMatching; + +import java.util.stream.Collectors; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ComponentMetadataContext; import org.gradle.api.artifacts.ComponentMetadataRule; import org.gradle.api.attributes.Category; import org.gradle.api.attributes.Usage; -import javax.inject.Inject; -import java.util.stream.Collectors; - -import static org.gradlex.jvm.dependency.conflict.resolution.rules.VariantSelection.allVariantsMatching; - /** * See: * @@ -44,8 +28,12 @@ public ReduceToRuntimeOnlyDependencyMetadataRule(String dependency) { @Override public void execute(ComponentMetadataContext context) { - allVariantsMatching(context, - id -> id.matches(Usage.USAGE_ATTRIBUTE, Usage.JAVA_API) && id.matches(Category.CATEGORY_ATTRIBUTE, Category.LIBRARY), - v -> v.withDependencies(d -> d.removeAll(d.stream().filter(it -> dependency.equals(it.getModule().toString())).collect(Collectors.toList())))); // .module + allVariantsMatching( + context, + id -> id.matches(Usage.USAGE_ATTRIBUTE, Usage.JAVA_API) + && id.matches(Category.CATEGORY_ATTRIBUTE, Category.LIBRARY), + v -> v.withDependencies(d -> d.removeAll(d.stream() + .filter(it -> dependency.equals(it.getModule().toString())) + .collect(Collectors.toList())))); // .module } } diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/RemoveCapabilityMetadataRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/RemoveCapabilityMetadataRule.java index e8646c45..d663b1a2 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/RemoveCapabilityMetadataRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/RemoveCapabilityMetadataRule.java @@ -1,28 +1,12 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.resolution.rules; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ComponentMetadataContext; import org.gradle.api.artifacts.ComponentMetadataRule; import org.gradle.api.artifacts.ModuleVersionIdentifier; -import javax.inject.Inject; - /** * See: * diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/RemoveDependencyMetadataRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/RemoveDependencyMetadataRule.java index 16c69f1e..6afcfd4f 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/RemoveDependencyMetadataRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/RemoveDependencyMetadataRule.java @@ -1,32 +1,16 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.resolution.rules; +import static org.gradlex.jvm.dependency.conflict.resolution.rules.VariantSelection.allVariantsMatching; + +import java.util.stream.Collectors; +import javax.inject.Inject; import org.gradle.api.artifacts.CacheableRule; import org.gradle.api.artifacts.ComponentMetadataContext; import org.gradle.api.artifacts.ComponentMetadataRule; import org.gradle.api.attributes.Category; import org.gradle.api.attributes.Usage; -import javax.inject.Inject; -import java.util.stream.Collectors; - -import static org.gradlex.jvm.dependency.conflict.resolution.rules.VariantSelection.allVariantsMatching; - /** * See: * @@ -44,8 +28,13 @@ public RemoveDependencyMetadataRule(String dependency) { @Override public void execute(ComponentMetadataContext context) { - allVariantsMatching(context, - id -> (id.matches(Usage.USAGE_ATTRIBUTE, Usage.JAVA_API) || id.matches(Usage.USAGE_ATTRIBUTE, Usage.JAVA_RUNTIME)) && id.matches(Category.CATEGORY_ATTRIBUTE, Category.LIBRARY), - v -> v.withDependencies(d -> d.removeAll(d.stream().filter(it -> dependency.equals(it.getModule().toString())).collect(Collectors.toList())))); + allVariantsMatching( + context, + id -> (id.matches(Usage.USAGE_ATTRIBUTE, Usage.JAVA_API) + || id.matches(Usage.USAGE_ATTRIBUTE, Usage.JAVA_RUNTIME)) + && id.matches(Category.CATEGORY_ATTRIBUTE, Category.LIBRARY), + v -> v.withDependencies(d -> d.removeAll(d.stream() + .filter(it -> dependency.equals(it.getModule().toString())) + .collect(Collectors.toList())))); } } diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/VariantIdentification.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/VariantIdentification.java index 25bb543f..0ff06cf7 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/VariantIdentification.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/VariantIdentification.java @@ -1,26 +1,10 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.resolution.rules; -import org.gradle.api.Named; -import org.gradle.api.attributes.Attribute; - import java.util.Map; import java.util.Objects; +import org.gradle.api.Named; +import org.gradle.api.attributes.Attribute; class VariantIdentification { diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/VariantSelection.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/VariantSelection.java index 7b0cb4ec..e8dbe330 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/VariantSelection.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/VariantSelection.java @@ -1,21 +1,16 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.jvm.dependency.conflict.resolution.rules; +import static java.util.Objects.requireNonNull; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.gradle.api.Action; import org.gradle.api.artifacts.ComponentMetadataContext; import org.gradle.api.artifacts.VariantMetadata; @@ -27,17 +22,6 @@ import org.gradle.internal.component.external.model.ModuleComponentResolveMetadata; import org.gradle.internal.component.model.VariantResolveMetadata; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Predicate; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static java.util.Objects.requireNonNull; - final class VariantSelection { static class MavenVariant { @@ -63,10 +47,12 @@ MavenVariant attribute(String name, String value) { .attribute(Category.CATEGORY_ATTRIBUTE.getName(), Category.LIBRARY) .attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE.getName(), LibraryElements.JAR); + private VariantSelection() {} - private VariantSelection() { } - - static void allVariantsMatching(ComponentMetadataContext context, Predicate id, Action action) { + static void allVariantsMatching( + ComponentMetadataContext context, + Predicate id, + Action action) { List variantNames = discoverNames(context, id); variantNames.forEach(variantName -> context.getDetails().withVariant(variantName, action)); } @@ -89,8 +75,9 @@ private static List discoverNames(ComponentMetadataContext context, Pred } private static Map toMap(AttributeContainer attributes) { - return attributes.keySet().stream().collect(Collectors - .toMap(Attribute::getName, k -> requireNonNull(attributes.getAttribute(k)).toString())); + return attributes.keySet().stream() + .collect(Collectors.toMap(Attribute::getName, k -> requireNonNull(attributes.getAttribute(k)) + .toString())); } private static AttributeContainer getAttributes(VariantResolveMetadata metadata) { diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/package-info.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/package-info.java index 648c7fbc..7d426570 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/package-info.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/package-info.java @@ -1,20 +1,5 @@ -/* - * Copyright the GradleX team. - * - * Licensed 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. - */ - +// SPDX-License-Identifier: Apache-2.0 @NullMarked package org.gradlex.jvm.dependency.conflict.resolution.rules; -import org.jspecify.annotations.NullMarked; \ No newline at end of file +import org.jspecify.annotations.NullMarked; From 685240e07ad3e129194418a721fc39e1e5f4d7e9 Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Thu, 30 Oct 2025 17:55:30 +0100 Subject: [PATCH 3/4] Remove unused compile option --- build.gradle.kts | 2 -- 1 file changed, 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 0740fc1b..f87360f2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -60,8 +60,6 @@ publishingConventions { testingConventions { testGradleVersions("6.8.3", "6.9.4", "7.0.2", "8.0.2", "8.14.3") } -tasks.compileTestJava { options.release = 11 } // allow tests to run against 6.x - val generateCapabilitiesList = tasks.register("generateCapabilitiesList") { pluginClasses.from(tasks.jar) From 323f4c5ae81e9c2aa344469abe15bbe9c4a8ada5 Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Thu, 30 Oct 2025 17:56:18 +0100 Subject: [PATCH 4/4] Add dependency verification data --- gradle/verification-keyring.keys | 1756 ++++++++++++++++++++++++++++++ gradle/verification-metadata.xml | 158 +++ 2 files changed, 1914 insertions(+) create mode 100644 gradle/verification-keyring.keys create mode 100644 gradle/verification-metadata.xml diff --git a/gradle/verification-keyring.keys b/gradle/verification-keyring.keys new file mode 100644 index 00000000..5a5e4435 --- /dev/null +++ b/gradle/verification-keyring.keys @@ -0,0 +1,1756 @@ +pub FE6C7D77A1CE15A6 +uid GradleX Code Signing + +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQINBGL3vDQBEAC06DyZDdCJFMDH2/J7zrbhN5oJmYpM/mkwmOjkHbsIMJRcocz5 +7gYQC8OeMyfs+dkorsrY31UpgMW+efjEZbDKItfbcs+y1iEhQ0fkKKam/lzNyjK0 +wb1ew3QPMz6NFPcE9+ZmHpQDV3oHJSdNB2wrVPxrDgyxQE5Qufz4KBgbggY+Mn63 +yNPxeo7axeK0GgGzoDMw3Iu/pQCVz6eNMn8+0OKowNiE9U8PyYYNdghrmsFEe9sS +ShS8y6GmEYGz4qErI4TpkG5ZkXuIG1ZEgQlP/BuBrY4AIwkUJADGXowr70JMeeZB +1oFWa1aTx3iIHBtr2ksVOqOuQRmnFdGcUZnqEebQov+q9ZwAge5l1jHiZqZfxQ6m +oQnj7vK7rIA0FW+IznZ3De3M+vUnL/D5EIChySvsxjWOqaRCF8gCUA+KrR7Rqifl +lndVJc4gLFj/NhBvh0TwNYUu2wAEWVEuN40KFs4GcVymdPvy9nJwGqrPOZ3jqdqT +fOskvrgZJtj75wbSppED9Z+pdHLUc85lC5OzjzgE1qKiBh+cxLUwUgRSDFE797Vt +ucYWH2coJQRh92I40koTYgPBV4chkNMc3R8/Gy7LJNMIJcjS513tPuVawCMJRDYO +vz5BSWCgfily85jLX8eK2ceYt1m7OUA8LOElxmzysCGbARgP+lpCMfvHeQARAQAB +tCdHcmFkbGVYIENvZGUgU2lnbmluZyA8dGVhbUBncmFkbGV4Lm9yZz4= +=5N7Z +-----END PGP PUBLIC KEY BLOCK----- + +pub 893A028475557671 +uid Gradle Inc. + +sub 5E9AEEBA28836032 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +WzZKkqBVoahM3qqyoKOy7mfpt1hB4gEq +=E5AV +-----END PGP PUBLIC KEY BLOCK----- + +pub 85911F425EC61B51 +uid Marc Philipp + +sub 8B2A34A7D4A9B8B3 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +PXCe8La72ukmaxEGbpJ8mdzS2PJko7mm +=Xe8l +-----END PGP PUBLIC KEY BLOCK----- + +pub E2F38302C8075E3D +uid Gradle Inc. + +sub 1B80C80E07BC7190 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=Rl7p +-----END PGP PUBLIC KEY BLOCK----- + +pub AE5A7FB608A0221C +uid Robert Scholte + +sub 38185785755267BD +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=Kqmv +-----END PGP PUBLIC KEY BLOCK----- + +pub 86FDC7E2A11262CB +uid Gary David Gregory (Code signing key) + +sub 59BA7BFEAD3D7F94 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQENBE2kzuwBCACYV+G9yxNkSjAKSji0B5ipMGM74JAL1Ogtcu+993pLHHYsdXri +WWXi37x9PLjeHxw63mN26SFyrbMJ4A8erLB03PDjw0DEzAwiu9P2vSvL/RFxGBbk +cM0BTNXNR1rk8DpIzvXtejp8IHtD1qcDLTlJ8D0W3USebShDPo6NmMxTNuH0u99B +WHCMAdSa34wsg0ZpffwQmRxeA+ebrf2ydKupGkeZsKjkLlaXNkTVp1ghn5ts/lvg +KeHv1SJivWKCRmFlbPhBK4+mxSUSOPdoBNAfxA51QzZoPizSk0VbRz3YufYRVLFy +9vqPSorDmYJhCvn3f6+A38FS/j8VE+8obQ2rABEBAAG0O0dhcnkgRGF2aWQgR3Jl +Z29yeSAoQ29kZSBzaWduaW5nIGtleSkgPGdncmVnb3J5QGFwYWNoZS5vcmc+uQEN +BE2kzuwBCACzeGpkd6X/xTfKDBWvXgHOOKIJ2pht9XmtZZKiIj7LIiSwvSds/Zko +ZKxAm7AY+KPh8Xjf968FtoUBQJvHAG4rbowEqT7OOrJae2JcenH5qzaod7TpIPQV +v+Ysz8I1wLlC6LzKRj1X99Hng6X+obsEasnPbmEEkuiZ/Sgi4vVC8SHkDmYt1Dx8 +jDgm53oUeWkEJO9LSI2zcrZhSgvg1xa4Q4gY5UUK7gE4LbmGCjFlATuuW/0sryxu +8zxph15gkn4Nqgk0CPMSjesMYEGOsdDzfQXl2tXbt+Pe6mBoWh67MZ1v5zOq3EDt +oSqDpWPxponAeaCuNDDFX44vGjfxGE0tABEBAAGJAR8EGAECAAkFAk2kzuwCGwwA +CgkQhv3H4qESYsvEMAf/VGyqIEcw4T2D3gZZ3ITkeoBevQdxBT/27xNvoWOZyGSz +GYlRbRQrlo+uZsjfMc9MNvaSmxyy4gLVbcdvQr3PF//GxphJ98W8pk9l+M57jfyH +nnCumn7MO4o9ed+WuigN5oeuNJ6BIq3ff2o1DsrEvDChYOJEOeFuWxv+u7I2ABJJ +ep7NbByM2n9PE8vlGU3zUBgWUBsk6jT+klKnEyHE76WzegPLz3jtElTuyB7jRhjy +QJu1yiJEMbs2zH8aJGObi5f8Jum4tILZuEAdoI0M3c3VRq12cz/vLy+9VXa/s//8 +IsGn88kjyyYqOy8WJEjoOXFh++dpWiM7nZkgQcNi5A== +=ggBv +-----END PGP PUBLIC KEY BLOCK----- + +pub A6ADFC93EF34893E +uid Tom Denley (scarytom) + +sub 9C4C23E6FFE405BD +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsBNBE+xZxIBCACzKctn4ez8xOC0pGThhAwjYWGkzcwK4HNaC1usHThBFz3/t8JN +OqUXRixLyi5wELN6GHlsGVUQS3IfB4JtuhScsieSB8PTree68/knMq6JI08mJqZr +9nFrAB4eDW0UMbSL9kPmclUm/yN+qcCZBrsVn0q6CWb/Kcd8EEXEu6sGILzOGqGe +d433t5O+tGXWL2TjAz+Scsk2Hf4zcuDeQcxELAMnVaVgKuGuEZvibrjsdIvJDGI+ +0BzWIu8ZP8ldBl4SVtzGpEVzLvDUo3mOqBeTkj3rP7xLtFDN/3AFtowbLfL7L2Pg +SMcTnKK+jfFHRfbHP1Ih3rQ4ilLzhCnY/QIZABEBAAG0K1RvbSBEZW5sZXkgKHNj +YXJ5dG9tKSA8dC5kZW5sZXlAY2FudGFiLm5ldD7OwE0ET7FnEgEIAM3i3e1sjwrx +2PN8XYMPQWG+/YTtw1BYDl2+iYE+LaZvtq1hpbgeCLgEVwXrCJ4spLP1rFXogWqK +rkJ0LRjlpdKhKBvyH1ex4grh3cWN/bIDJcJ7JA4I/Bhqhlh8hYycS9pGFeS+MR3a +FIsii+vadrwYYvuVYGeWvdZhB7mJKYevj5Ms0OpYTfZd95Pzo4o//lNpDnrG7Xd3 +tgTNU/fkpw6rFB/2Ib1Qlk+Kz1z6JNsp+tOPGGCBrzwfwglcikTuqS+xyRgC9cHh +5eCol11uSoWPKcQR2Ar8Eo56nxv/UApdu15iJ7R8cA5guKeeS4jt0CGCPs2Phugg +DxI73Xvl4zsAEQEAAcLAXwQYAQIACQUCT7FnEgIbDAAKCRCmrfyT7zSJPuylB/9i +wtIQeexMWBmQNdDe0md8HLulDfcujPtklrvYHtXMJQFaGA0Vafq0oT9MhBfb1YCP +79uF0qgswSxINYCOJx4nTPIP9BOdTwqfGo7ul27REgNq4lIUW0GkMgZAUA2ft/vc +0u/I0PqnhKCi4Pq79hLIx7eiX2ySfXfYfLXRVzbMWKMoi7lWXseQqbM0RvCA54J1 +qAi6Ew+JyoYGQ7OvXdL5Eh5Tkm2cpIADyqCkp/aFDe5lqZiU1zS2fU6mpOf/o0co ++GoYkieIxxibDCmt3BioLgmyzpGUsMNwh4pAIQUGkcxd4spC0KIWdDEvq/QJEEIh +ZlI/ojefaZkRseFrtl3X +=L0GY +-----END PGP PUBLIC KEY BLOCK----- + +pub 54AC8E2D98CFEAC6 +uid gitlab@ysb33r.org + +sub 1309825C79629B3C +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQGNBGB1tD4BDADSzOETLscSpqNTDixnOsYLLwodQQ6pxebc4w4s2QarDHvdaFft +lZge0kTQCxpvGiENusWwt6gQngegy6qWziWSfbdHgVWBsH5u9frgJ8wCZ21UqEwV +A3d/rEbzpc3Ujo1L3yFpuZJWpBo4jTwH3GGxNXS64VwKN/mAKFZirm9DrSpdNjQU +S0mlOThn/SdJ4jqH2podnRZs3yxlr33NvVAYaACndLABCTMkHqKTRPhFYR2C2XAV +sMQ0sQaYJLmMHUTB2Cn8FZRudhuBl+O3TY58w77h+EoUrSw8T4aQRZn9Lbuq1voL +3onEnoR9tU06P576wjrJ44KGi4YJz/L5yKreKBfSe7vfGhBWDmrcjSb3thj+pP30 +Q7LQFmY5EaAz/Wpr0oDMAxtBBbii+QCllEFxu397OMrZZYqQjt9K/l4krYjDZc12 +fQZqCT889kRBA8nqhPpueY5iELmL5oGHTKmWDbKFo6fEPAq6F3e9p50s9pfhT1g2 +GUM9m+0LDs+N+38AEQEAAbQRZ2l0bGFiQHlzYjMzci5vcme5AY0EYHW0PgEMALkB +cL/X7eKvtznC1SE4dJr0skc9rGniiYwVhSNiyiYXlbb0ETdRDbajSHjv53cR5DGb +AyPgwwLNzHo1K3MrE0CvM09sCMJBOjpCu1X5sma1w76I9ScvJ+Gqr3jFu8CO9JbS +s4bj2VRr9ITOEZinvwo+Ult1vj1Vib9K4lAlpsXcd0dgFS7jlTBqeDgRR+xyRdt+ +54yrCay+IXupBF0GuYQ9lHwCVyFhwhOneoQq4xhEmwmNEQOWq28byVLUpMDzKAPt ++T5AmyxNebLRQmE7rWX2PmoCSTby8aQPlG0OSRBQJu3f6lhMZN21QbTcCBeDW5VI +sjPtZnJ7nIpOkT2UXulnlRk/QAEydJdPdSz/Idps3JcHyNK0YXKJ3qvrH1k0ur8Y +fgHuY41d4QqShOZleDcJtDXj7Gh0BtLlijspiscBNt16BpkKzEcqd/6Pt1fMIOEx +iBXrdad9mPpZT14KTXT8dXHtAEKozut37a4hLfJ7al+XBqilnYEm1OjVx/BVKwAR +AQABiQG2BBgBCAAgFiEE6gIlYKgeW9SNs9GLVKyOLZjP6sYFAmB1tD4CGwwACgkQ +VKyOLZjP6sbEogv+LX9Z8BlnClkJ3lVMZlyzbUf2lleg+QA4cWTsPE4SSi1VFHsR +CAoxesJdKqJuFcIEOFxscGfpkSbhTsTEczI9e2XsaaDAaY1GodvJfRUAu2VdvVAG +xHhoEqUUSbD4r3AW0yLViLlsQVoiuKIizm8PQZr9bfLSkXjGQz1wlPfZVC7raPJ1 +VYb3TQXmIALTc8peel2SlqFLQVZ+3Lb8JKC/9DeHAGmpBipB+VcSC5vRchqpncsH +Az0GXtmqzkgcyzq0Kyh0nIshDsGQ/vXoZQRl5hjMWBLaN/y5ik7Qde4bjL7p1ozK +Vm0S2qY0CfrGSzZnLXLOxX90fqXXN9cwmLv++bdyrXElA10u9LIqsViop3UvHitV +jkJlIhwt9/duJEhPJnT/qH2O9YAqwlEFggSNSctD3LC1uMjB8JD6XcpQgDP6BiZU +wP/yCGQGvA27Omf2WgrpGukXiZFSBkCZPL+/rcP5dnVrCwneGCXluI+sONfybagy +2nNTTJWxonBh7c5p +=ksoJ +-----END PGP PUBLIC KEY BLOCK----- + +pub 8B8E0CB0F6A7657E +uid Robert Panzer + +sub 66E5C946D7F2C395 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mDMEYpEQgxYJKwYBBAHaRw8BAQdAAyUqDlsM76TEI9sgzz6DaXhdy7BqSrZ1C/Hi +P8QhqbK0JFJvYmVydCBQYW56ZXIgPHJvYmVydC5wYW56ZXJAbWUuY29tPrg4BGKR +EIMSCisGAQQBl1UBBQEBB0AJY1E2mT4hAuveR1BnaNwwosfF1JiwU7ihSB0aiytl +DAMBCAeIfgQYFgoAJhYhBK0pbKAUMhSF62eA/4uODLD2p2V+BQJikRCDAhsMBQkD +wmcAAAoJEIuODLD2p2V+VMEA/j1HUrIcDQ+FZtFsVQOnCjgIoeOzphExVVZmOjr2 +mAQWAPsFmTyYBbzvAHsj8KBEyO6FlSY0mKQlJxIelqBxUlxyDw== +=oQqF +-----END PGP PUBLIC KEY BLOCK----- + +pub 38EE757D69184620 +uid Lasse Collin + +sub 5923A9D358ADF744 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +mBUN4AU6 +=kKlc +-----END PGP PUBLIC KEY BLOCK----- + +pub 22E44AC0622B91C3 +uid Cedric Beust + +sub BFE9E301CD277BAF +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQENBFpqN94BCACaAb8Afmng1QPu5k5uzLoA1FJnF6Wf31ZU1FzDxHFHLNUYSWN2 +Bg6k95QH5ruZ+Z/QOJSoIB+b3htDklyxd8m+G2KsMIqnQs0BaTN18hb3PFyMIknM +YWkkTPF3nVV9APk73AebTAcd2V1GB7xOP+L3T7tyUcB9/7bDeM3od6qPksdVGNMA +0S32U8SNhe4jw8uXKdFL6PSxgyg9yeu0V7DyR92V9jF+ZicZWxaLeKpf/Vn3MBX8 +JdePR9SCJc8CNj0n/tsvg/aSmGZ3OMZTUYYvrtfgpXUw0WVkyma+T0ANcdDN91uZ +P8lV3o+Ic8f15xwsTePDhMhmtOapIz/85ukFABEBAAG0H0NlZHJpYyBCZXVzdCA8 +Y2VkcmljQGJldXN0LmNvbT65AQ0EWmo33gEIAMB9fJ0TVVhqKzqj/gmlVDCT0kve +vaGSDB83rwHatG/D2h9dmipoEIWBvD42/PXkYuY42iIO8/itvVOxpPZOL+FNRvei +/ZbVEno4VGaJKQ646NkeVWyVgXZ8+VkRdZ0n09a+goz/e1pogJfL8BVKbU0F6trW +XYywnV4+vp2kwwMGNRTXmvNabdY6rAE0TfjCGE6O9T28OXy7iHXFX3oTkHjtltUH +WlHrLe9JhCDCPoFiSndTPYyDcZD+cEWg27BX8XsuJRvlbrzA57xD3w25ESHWJyj8 +4z6K52M/Ys7S/PawZ7pflRkbAJ9smeWr9+qg+GLJboc9vX4kdTTyQp5jkEkAEQEA +AYkBNgQYAQgAIBYhBMcLhE8ALyH20rnIdSLkSsBiK5HDBQJaajfeAhsMAAoJECLk +SsBiK5HD5coH/ROhc7Z1pjr9mWR8rr07yNEHNuGf3T/Z148z+ovLkV7dRobayB64 +VhtMwZtE+8Kmf0Tltx5zN2GQkqoSPl08dWFRTr6N7If8N0OCtw/XZJBHa8eD2FF7 +SnNWi6IwNfhCdRtbT0LCmaHKaUineldvmM1riI3GNggGa4cMSYw/65blR757aWAg +AVZEWi9n0LUMKDRhjIaS1zjtxqSrcQ0o1TYsW9FxuCjJ+MzQSmtJQKiVRQ03fLJQ +1z4j5u8YvmzCEqp2dEdqBuDuR6Wyf/TmgMUY9AeLT9U6VZTvAGH69TDqVvdmLsKh +tQidSFbes+7ku5tM61P6ggfv5FJQgQk7WEQ= +=iA+h +-----END PGP PUBLIC KEY BLOCK----- + +pub 62EBFC78FE4156D1 +uid Thomas E. Enebo + +sub 23A1AFB15EDBF29D +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsBNBFI7ev4BCAC4jaYN8BG+wOCtqLKOBx9geHISO895HtRpYYPpSxfiBjYrvdpP +3Fc6MHymKUydUyNvLEO6/fBvHnxARYNskky/QuqjKJkh7zVj187UfbdSR0avI6uW +6MYrlkEHfF3GpwH83XT82Vbw5TIu/HI6LR40WSojn3YmJuBp9DCt4WPoSCbtV4RS +0f+YYgxdKn7AwgGNScEsiyds1dLZOlyieEh5ZNDq0N79ha1Q4397l7NsWY79TlP3 +HB5cvhLl+B1cb8VZOL1V3B5zifRtWhqWPYCndVIva8kkrYOMqLMzu5syBHKYzfnK +RkQAUt8pRSCc/NIr/wYC2/ZES5ICP9XNUl5TABEBAAG0JVRob21hcyBFLiBFbmVi +byA8dG9tLmVuZWJvQGdtYWlsLmNvbT7OwE0EUjt6/gEIANbrQJi8V4ipB/k2jMd0 +FzZA0C4Dp8yUFFTDhdfppdjyZU4v8+eN0zfkj6UE/tmC1le5Dv4ER/asvGEGYLMp +bstFLVYFROgvNEr3Jlte8FzGfgq9LFDunAr4lkpNTH/tvq0TlKR7+FKZG20OWsBy +9mAbSg/Wmrz4ClzddOWkiPuXeWX9HFfcvWixiJbMBPv27/xBOup8TgZJOjniktR/ +FGFyGRkpV1vLUsDrV6CiQdb7bTLeZa5BzxvU/N9JWLy2A7RGkPYoPOunyUe3Ybep +3X3clwdOAU8vRgDGQ+06GnrUJqVVKUS3CqXXKXYK4VtUHCljFYtHw+dB+maf5XDF +zF0AEQEAAcLAXwQYAQIACQUCUjt6/gIbDAAKCRBi6/x4/kFW0fE5CACPeMdo8PtI +kVjhQnySlgngNC1Z8gzZXREAhBmfrdV4t+ehnoQ7X8Mn9umS++Wo7s/YhV0koc1Z +Ut1m6Vy+nvej9KpyjuB8rh1v/rsOLGKFnWBFUhpk8HdhE7vkFvoXfkzoU1vLcUjo +3p5vn3vgCGKKJaONy2bM20iuSEX0yeC9ntPHgl2+vD2MinB4bC7+jX+mGALYi/5C +ApYObCkhTG6gxK++OlPu0B+6g/6X5WhOjyO75xdpWK1Z/ZOLE3hiz3YK6AexvgL+ +yZOqSw2FdoTg6cG9cSBYCzfDGe2BMAtXkbq6whdFazMHT6F7J49PaK8aBz0Ms0hB +PiqbTzohKaVJ +=q3tc +-----END PGP PUBLIC KEY BLOCK----- + +pub 1AAAA7AB37293D3E +uid DiffPlug LLC (release signing key) + +sub 2C7F998F4272C851 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +Eg== +=PrQD +-----END PGP PUBLIC KEY BLOCK----- + +pub A1AE06236CA2BA62 +uid DiffPlug LLC + +sub 030DD9087C31C9AF +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsDNBGPAYVUBDADCs9PkY8zzhzE38bRZX+vTrr3LdChGNBmObV858NGRrXeZtyLu +U7YwYVF7w2vHUI/JQWrlPZc5tBFicefucfUtKt790WzAk3NBjGtX4IWpG57C1Z5t +QRI23HqWr1If0UanH2vUjy4fUgNZdYlH2KzookoU0950dIcqwA/HwiosO5RmQ9iY +HztkwwvFW9QxiJgL+lR84EcaIVN1ukr0ZKrG1a6wOJ6HLf9S2F3DMe7fQ+O+TpT/ +A11RewOZHwE9spH8cEsNYgutBouw/MttuYHjZKD7O4hN12MmzecWeMAPyrvYgTJp +PHcjQaVeD27OGLRpy5n5LonvkzJbhTzM+Ps1qEj/4of3EFVhxNjR0gdrkX+0Ub1A +XXiw3gjqAQuLQVKIbwvCbfj2go+YHrfcXN6kpKkYZU8ERPxI/VBTw230PPdXXwXP +Ux/JRQIEXOuMIuELm/91H8TXKutw6NdNRu5q+LPcUkU7W6jsv28dmQHdC+ebVHlA +vNcBOWVSY5e8IasAEQEAAbQjRGlmZlBsdWcgTExDIDxzc2xjZXJ0QGRpZmZwbHVn +LmNvbT7OwM0EY8BhVQEMAL4ZVuEVH9zbhY6AewA4T3u2XZ7k1KGOxoK74eygzYEp +fKMplWQtCxcxBXe2tboT7I8U3MrV6m7KDwcxLNVZM638fvfU3Px0yGs0jBzyjOcb +Vk6n18xX9UoNyoEqpxHhyPbTBr+U9OINcneXZ/iG9FfLURZjDxhNcQcnrnmvbUB6 +M+teZ6Gpb1Ye8ghVCJJNjRRQhFxXE7XnmX3C1pZoSoGcBx5zVspSuHjq7nTTw/rd +7OpC6sBK0ULk8GPAd2vJUfOtZcsLvOs2++bHxNULTXraTy/fYvXsTSe+PmbJo1Fd +5o3imI0eUy853UJmF/HbuWspFe8yONHjo0+uZITsAMq0jbzG8MTKMmgsXS/i/vaW +8BVUmLfhB7E+bUXJLJuQAan397NbYZqPF5agLZ1wHSki3iuYEttdMsy5PYCLeCqh +8Tv6VBNkEToKDAvNbaad4ZgBdwbBQaAIrWekWpiXSXizyGr/VTFE2hT5NC0d1BXy +sc9P2UCvHit6A1bCl7MSywARAQABwsD8BBgBCAAmFiEER5e09dzEbOphBZBxoa4G +I2yiumIFAmPAYVUCGwwFCQPCZwAACgkQoa4GI2yiumIHXwwAh4/tSXSQ9Btws4ZP +eLfihAb4ogHOsrJ8ZO+lZMyQOrEyzDK/y/1LpFVlHYEP51XS5h4u4XVivXGzsZ+r +tQoXaCS6n19dyyNeusehZx/BxxQrdV9OYEkgb3BC+05AWogdHXTP4prGdMtpSttd +gcxTuHwx9RUv/d6CsQ8DyKyjTv82hd3yuXQVl1829NwDbM7HJ8eq0uZPmez2ewbx +Ze9CxjKoOLfYSQ4k0DfcIFqz8CSqTVIz5aNLLXiY6NXPhS9B9/bXkRNAXzUgMrG4 +GmmP8XLYjBn9g8V+fAad67N0dUWDeAPzz3OXjp6bxyScgjT6OMlp55xXaE5HWW4a +aE9epjKjLuOD7LYdmv0GI1HhSrOnlqznB3TCwJgKMw6/37uGZnpsX0JoMs947ZIm +pcN1kNNR3e4aAFcpBwj2OSjds+G/DI3/WOXJj3aaRI4nBRr2/IB3TVhzLOizLTNQ +Q/IKL5Iy5doINK/iyjb/G/JLH1/TkhW9zEheiKUY6TiXeR3p +=fdmt +-----END PGP PUBLIC KEY BLOCK----- + +pub 379CE192D401AB61 +uid Bintray (by JFrog) + +sub 0CFE993CDBE1D0A2 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +E/XhP4QkRJrZI1F/ +=Jm2n +-----END PGP PUBLIC KEY BLOCK----- + +pub 0729A0AFF8999A87 +uid Kotlin Release + +sub 6005789E24E5AD1E +sub 6A0975F8B1127B83 +sub 3FF44D37464BBB7E +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +BedOSN7DqsnvIUfFaQ== +=bvfg +-----END PGP PUBLIC KEY BLOCK----- + +pub 66B50994442D2D40 +uid Square Clippy + +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsFNBGDoYisBEACqUDZnT4h6ma6XIzdC6KR++uDbR2VKdhCuv0Og/sHEKkm6ZbG0 +OFB8tAaQx/WlsoQyf3DlLfUEOGDai875Aqor3fbM+E1hrZbQNfsOySKEE52k7PYe +0qGWlnAzINuQaEuZwNw+pjZqPraMlwc/hwzJB8yFNHCv25pCFohK7KXvFGr5Fc6y +NHBp6pM3pnDQ1kbkloDr32YZY2LdrfdkRqwa9STNMcZtM724aaInValFpVGEHolF +dklo9MIsMI6mVHlxi6UwFSSLltUfTXGYY+rt2Q2sLNnEKzK1GvVhK996vrNWCvpr +cdtbTzGE3WK4f2knhqzlaX99OLmkM1ah+p2EkK7HgWM9oEO7SYpNxKe/F/QfRNRS +4W0aokPsEtfKCD7vQ3cRWQXdqFwvksilv+b6pcSrwfAsaCzVuhB3lcIra4MevJcH +ZEbPrfGMi5/MIVtLayglLHSPoZtjQBhlqo8w3nuADR/aFlIUZ6NGOwaz5yXIGVEs +6E1wiuILRAd7ecJ3Zyr/URHjawfHfKMM2tNCJKl48cScBMY61FJ1EmYzwhDw+at5 +D4pCk75eM5/t6VdYQ1cDWm7J3LGXEANMU5aSZMqgVnb4SQEmRxkW7oq3Z+GIkQQf +Sj4OK6Oi4cUpM7b0m7Cbcsoqb6nD27VKD3J5KTYEq3e+78h0VRjhoi0Z+QARAQAB +tCdTcXVhcmUgQ2xpcHB5IDxvcGVuc291cmNlQHNxdWFyZXVwLmNvbT4= +=Vcde +-----END PGP PUBLIC KEY BLOCK----- + +pub B6D3AB9BCC641282 +sub 700E4F39BC05364B +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +2bX9MtjSsKhYeVDZhwUHbX5VuRtS+X0IIFhu1Q== +=xPkk +-----END PGP PUBLIC KEY BLOCK----- + +pub 72475FD306B9CAB7 +sub 1723844CF9A045EC +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsBNBE7+huMBCADW9rfqKBXOqUSLCK5Klag5WqLFxAOddqEM7wTx/42XaIKjDiAW +gmFnV4XBKm/7Z4fwWq7+ku6NDYUjBpI4vcQ2hYJJ4SRWZHT5wWzOmqgznf+/Qwug +P7Ss3EUTRGX3LnhKhKN656XQhM0PutdsHQlUKjvnl2JOaKerEhbHCRxga/U/WWOT +KdobRO+x8v1scsrnUG83J7sTSaja0McmgUhKrhJqrgSk1Tod45SxprxOyp0cgATY +xjHrf2rkafBn7K7aFDe8a73iCJPWS77gxTZCZ72xkcnMLR0m7QI8TzFa4lRjTovA +QcTpr7jwjmyjA1+68peL6VHdVr0cdXm34mTVABEBAAHOwE0ETv6G4wEIANLmAn1+ +tkX0pSiu6NJ0rkaZlMbvkxeFAstHdQ5zOoSWvJV+52DAd+h8HKZy6I89/BI1alYt +7KWALGzj1I6s1+HavaYKWftk7UvAM6hEh8PzFQD5NNziptDOjTG3oztZ0SK6Et3F +Qaczyzh9GyPC83vC8Dr48a+Bp5Ygpo/5LbuNloptVIapHftW6PUmRuxlXVXgFdc5 +vSDI2xPqz8dzLSjBa1mRUEiAFqdi6L0na6iyBEyEd4QlQ7TnDp6EKgCSvaS3OPRB +EOaWOZsaOIcSw5w7tkO7YlDIjbltVQKTbVLUIR0h9njGaJXlGPYvDFvssIMR766Z +z5bb/uPlG1HtFYUAEQEAAcLAdgQYAQIACQUCTv6G4wIbDAAhCRByR1/TBrnKtxYh +BAFUeeEFU0FDG0VFq3JHX9MGucq3IAgIAIdFSkB0cMKL+mA1dtR9P4dL7/d+G68D +VsSD8+OllWtMSPn5gNMGF4PtTk0Acu66iR1qCtCNzOqo2b72iqO+8lFLXcnteoH/ +0sSj1MFzMk4PfKIzr6u6K7wxdJLROfbLc2so1LN760e8Q4f5sacIgjetNiZNu7wg +k3YNAB27vwrCvgrta5KpamvZ0NDtDaNCIhiXQyudf2ZbhgYYQe98UPo6oAH/4Nam +mxtGcr9jfubcPgJafbKg7H8gNdfQeqt8SqGiaqPvYfs0NL6WazTLqYdBA3mxsUfV +TIjthffHWnAJv0K/EE8kY+ONuK5AkitlW2bb2pXsMpWOdeMYNpVf0oc= +=WUy8 +-----END PGP PUBLIC KEY BLOCK----- + +pub 5B05CCDE140C2876 +uid Matthias Sohn + +sub 9D29AE4A6B50E01F +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=Ll5p +-----END PGP PUBLIC KEY BLOCK----- + +pub 7EB97D110DFADD60 +uid Niall Gallagher (www.npgall.com) + +sub DC0B7E986BD7398F +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsBNBE9/RAsBCADI/pVIFcoLmbq4LCKkqeN4i5xgGKsuQsDAf/ndFkILDUA2FaPN +7cI3EvZacWnWUA0QkkKNKpajU2OjjQlu4IyBosJht3VMtD0BJ2nL8eIDvwO6L8TS +2RRGMnMaDUc91NnoxKs/7VlQ2ySk6Cm6lH3t8KVkwaJdU59lAH1ey9UKhYyvRQuT +htenl2R63lyyDe1ZLMAlmQXi4RcCWOO+L1emChNv0q0Fsir+7go9ZNYUi6pmIEva +jKXM8bo/VtRIHrS73DsH7BVVCURYoBWexZWlRdb86KSE993dRXLvFPy5JzlRM+eu +mUY3CMKxx3nLaDN5qepf1nGzMW88xjq4z4rhABEBAAG0M05pYWxsIEdhbGxhZ2hl +ciAod3d3Lm5wZ2FsbC5jb20pIDxuaWFsbEBucGdhbGwuY29tPs7ATQRPf0QLAQgA +68HLImPvBSPnMtjUHczE+gccsVWzLEsjVYSBcOUi1j67KQHbTPcHAqzYJl19t4FA +N/yU1oOjuu/4GKVni27y8NGSavzY5elTZ22lqUqgqT6DjoOG2BTLHuOiNRIMqBmD +Gy41mEq62C9I107pqJnnbARmde4646kDiaf2vkF1BsnBx0Dp93re2eJq4rkAf803 +fDvA8iyk5uDFiGg3f70JAu7ZCAKczglD0WUjIiO5Jxncz2sWiO2OuVgdsTuZf+9T +0aODKua60Z7CLn4ZK4ZpdibbOEp66XLeaGuy5HPInTTsr4UnT2kvor/AmmPKOryp +9oBFnPvf5+wREwlQN2h/PwARAQABwsGbBBgBAgAPBQJPf0QLAhsuBQkHhh+AAUAJ +EH65fREN+t1gwF0gBBkBAgAGBQJPf0QLAAoJENwLfphr1zmPJtcH/RJ5ba5m0Obq +BGbcJpJwhEjpB6tCOufdzvvJGAMMAuH0Vs5kXrASIJPyVgJ2ab4txg6U3DKIfxnE +IGjfdH9okl/oHRYrI/EDMN0PnIkE1JidhVOEOj3UWaoLUS8vvobKq0XP8B6J+P4q +NA5L3cPlBBtH7yqzVNavi6ljJcsJH3g7L5vJDQyw+xxfOvQq66y4lcO8ptAqB+nw +oHfSsfRKQQgT+Xlp4lG+acf+Kc0bLjWWUnBRgJfkhbGPVYHQ/QfnxbuLvlqohive +HEV+d/PxCwUHq4EtLC9d8V3ADCZgb3v9YE03abItwg7tnQBd/LuJ4qdOEbjAWI4c +crfZTmD74BkWIQSpeJNC9ZitWxF17zV+uX0RDfrdYGx7CACw7LqreqNnAHAONQdz +j4yr1nBp6Fngtq70SPKs49nDWRIJZzutzGVNs9r7bFSu/fzZlzsqi8gyYSizhEnW +BoV9e+t4YrMI6uWwDiSddzCn2fLCNkfYd36nuX78QHZgD32syCVeX/k1+zmTYjVt +Op85vZ45d17mnwCSHV7G+4jImZF/+lF5ED/x1coIT+ob4pmQk6Hwf2AP/ydfyf/l +B+boV/SIUXeZ0Esz1B0Frfr+qjAFhDO7blgUfQ0qLOIXRjavSl3g1CGgCKsZ1qZU +99YrO8eFnxdaGSWvVV77df02pkg5xdDHWusPcEvovBUm0dx9DG5PchEOeOdhdkBQ +5UCV +=MD5j +-----END PGP PUBLIC KEY BLOCK----- + +pub BCF4173966770193 +uid IntelliJ IDEA Sign Key + +sub C9F04E6E2DC4F7F8 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQENBFKneXIBCACtnX3ZQmPujf6ocvdnhsBheze71DSl34TfebyW2Qt+g9NhMxo4 +DaJy+iFNnsaMwLZRr6k/qf+ISE3A4opWAQlbk+Wb5s6DPPA2cHH6W4GdkxtuJzqt +tFn6YtkFhA15Aahr/vz31NBjUJlBmO4PwvkyxiF/MYP6TQ/AHar4xP1RxSYEPcCi +dIQczQ8nXzya4OqOyTfibeGz/eiHHuwTLHi3Rd2kihQnlRQdhE1rmm8uTyzFe1H+ +P7WW7kQgygW6yxQ3J+DXrG8kG+nbe57ZY1oyv3F/fOBxzn/kuoKHZ3JJEMJmTIrT +Lr1ngCZApgteAynRHk4t/SYZiyoyqZCuBcwHABEBAAG0RUludGVsbGlKIElERUEg +U2lnbiBLZXkgPGludGVsbGlqLWlkZWEtc2lnbi1rZXktbm9yZXBseUBqZXRicmFp +bnMuY29tPrkBDQRSp3lyAQgAvc8Q7O0gVSJsHoVgSQ5tWGwNsKcfD3I7kwC8BYHr +Q6F/UnhP1ArreNnn8KKpwOvD65pv0j5G7P9KAbIVLRRcCTB9MgJR2FPmRTNmYbKi +Pa6X6IUM/25R0SBKDJddqSvEFsE/M1ozHz4bIhdFUXJFMfv7WBaA9Cx03WwZg6Bn +5/xMzMC/qzG7QlXOMpcABtd2JlPImH13qHWNLkhyKW7y9HCfdBz9nOy0FGT54ttv +r3BL1gahSXNi8MHP7m2I3C8dSuIpzrNVPgR2eByvSYpZN28P4Cy9l99TRcr6/FuA +y5FaL/nWpv5WAraAV4Cx5Xpr4PXTn27b7k+feH8W/+9EAQARAQABiQElBBgBAgAP +BQJSp3lyAhsMBQkSzAMAAAoJELz0FzlmdwGTSqAIAJ0/yTJRlWp+dwDZGxAffw0V +iEHPkwAQ4iEKburA8LpcbTwJRl+k9d1RvFkZSWITq+F+Putlu9QooeVwcM+ht1Mm +oah/aO3Yx+yMnXwljR7FJa5VOY2aoALeCyIx8QYiqNAVaid+bQ53gC924u5zRM+T +J+vSChtqSBi+EOOTt5C+ALVB8qWTqEcD84AVbvvippCzKsA2sV69FrsIFAShvpXo +3xpXW83GCXxrp8nM9M0E46Y/SarvGTqfKRC6phNUXKp9c3SnVttPEcGhb9+92LOL +vMxKy4GRZS18bXDI3vS6gRDNJDCqBYIhp13Os9k+ZpnwK3PPIHv4l1I0i0EHZKk= +=WJEa +-----END PGP PUBLIC KEY BLOCK----- + +pub 436902AF59EDF60E +uid Sebastian Sampaoli + +sub D94994D14B55169B +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xjMEY4fp+xYJKwYBBAHaRw8BAQdArb04PVwQKvEhtUEmEu7/aASZivOWgEkZBqX0 +Tovwvq+0J1NlYmFzdGlhbiBTYW1wYW9saSA8c3NhbXBhb2xpQGVxdW8uZGV2Ps44 +BGOH6fsSCisGAQQBl1UBBQEBB0CSPWzZfBjKWyPW+D6RDRLFz5xlO9/30yGD/VhA +EPXybAMBCAfCfQQYFgoAJhYhBB0sfvitoPeUtYx8Y0NpAq9Z7fYOBQJjh+n7AhsM +BQkDwmcAAAoJEENpAq9Z7fYOTMMBAKfZb2ahnfGNBt8Hrbu1j99580a2IaFQddAk +xXZy2unHAPYyfxDLPkbTR7Mm4k8Cva8PCcXotDow4bDLm9rhwVkJwn0EGBYKACYW +IQQdLH74raD3lLWMfGNDaQKvWe32DgUCY4fp+wIbDAUJA8JnAAAKCRBDaQKvWe32 +DkzDAQCn2W9moZ3xjQbfB627tY/fefNGtiGhUHXQJMV2ctrpxwD2Mn8Qyz5G00ez +JuJPAr2vDwnF6LQ6MOGwy5va4cFZCQ== +=VAP1 +-----END PGP PUBLIC KEY BLOCK----- + +pub 0555B3BA1CA4ECF9 +uid Andrea Peruffo + +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsBNBFeI2igBCADSyC1+7+GrBt5easeGer72OC8yrqjO/Wv6o7AYWbs3f6SRmzEi +myc1sh8gBt1NbpkhIDuxdlqSOiYU4uHn246FuEEOPFyp3SHnTkEcI3J/5JzRLpKB +p6qdA2uXSPFtyMZWiMJS84eEeuzgs2J22ankAIRhC4HsV2TWkKEE5r0TnKBAP1pW +p16sXlDaUNf5JXIVOjILwFx22hVc/ZEx/3i/MmY02ZbZTDYDHvDC/v8zyv8aXIft +aKJEuV3H+jHZXbum2KMVVKokptVAr1boq6vTth0MfHDMibBHkm0bYNTSV5dUEoQO +ZlDSAKhjJlZHRzqy3Yp6hZyOA0ELYSI31HJNABEBAAG0LUFuZHJlYSBQZXJ1ZmZv +IDxhbmRyZWEucGVydWZmbzE5ODJAZ21haWwuY29tPg== +=b3AU +-----END PGP PUBLIC KEY BLOCK----- + +pub 1DA784CCB5C46DD5 +uid Rafael Winterhalter + +sub 7999BEFBA1039E8B +sub A7E989B0634097AC +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +pIXjPlQ0i6kV0h8KapE1Uo005JYgeg== +=/SKc +-----END PGP PUBLIC KEY BLOCK----- + +pub 0CC0B712FEE75827 +uid AssertJ + +sub A9E4161147556D82 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +sMY= +=vnKw +-----END PGP PUBLIC KEY BLOCK----- + +pub 3D12CA2AC19F3181 +uid Tatu Saloranta (cowtowncoder) + +sub 575D6C921D84AC76 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +96Um/Inf +=Evfn +-----END PGP PUBLIC KEY BLOCK----- + +pub 199C76080F8A18BE +uid Open Source + +sub E3461D2D16725F94 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsFNBGKGKVgBEADXgUTpCCKTmM6wl10V5B4SJhAfF2ycw2FfVPPBXhtj2buTFq9r +sejQ5ZQfg5VnMpZIZBTxXLZk4u5wJkqQqcmvYHc1Y0Dec4PiWDH7Yk0sX8OSo154 +uoehtvsaa5yJx+NqXaepuKWqpDu7XbUH/am6kYH+JtqLUo9hcSxzRDX+GOT+yYkN +SNbv+0oed5FD1tCRMZLmce7JoztIO+YRdFxjHbECHbX76PROWMXg7twmWdXGRe4u +z6Cjq8Flo1aa9jkiuH/bKm0VeiozrQwu7hVR15mfEU3B+Tvb8j8iVUBJm46nfudE +t12ikwdWNZGY7x/PJ+nFo4HPRbnThTxaqS0jykUkdWVzKZPtvK9J2EHzO1Ht8xKU +piPButSoAuoW07gFcjsrK52Jw40Nb6+frECNxdEuPeUbJ7o6kftuEdQRV0O18oVx +B+hbDmyItXjpMQzYMXXK/MWJhRGecdU6M1v4aKU2pytRiaAuftfSbz/Vqd6DnPHM +zENtxsF7s7x/o53Sux1lbM8tjdOxpv2KSEloej0SDXF1VB5A9qaMhMXRxZXILSA/ +XeP3CEQDrt57FiZaXafSKjBJW7df1mAU6z140LXFoYScHj5y1tc7xXzZu1j6Yggw +Zp6WfS+mQoa8TW48Rne3S/kGpzEljFW9ZzKh8hAbR8zlJEtJbUk6GuQKsQARAQAB +tCVPcGVuIFNvdXJjZSA8b3BlbnNvdXJjZUBwYWxhbnRpci5jb20+zsFNBGKGKVgB +EAC1hV6/bq6zcIONya2kEF9ED54I6JZ+J4go4NwWunyDnCYoe2lUcgFkYKa/l6v1 +fX1yh0zumzffH0F91TAwqOqcW/a6FKxSIniiYkA0WNTkEaYaWOHo8nudn5CYjt72 +wY41J4IOr+n7bCKQkKxNr+/gMlDi6i3+DCMra5/12l+wwBchknQUaz5Mi/r+/TDc +a+FWZqQIgIGbIMkPQCw5mHbpjRnOKM3G6jVY5bAqg+dWz/ABluYClypTK7tnbGYa +FlM9BVpknLwbixS9WyCEkU3TtOYB8yaMeK+NAtqVAXl7IKrokx9/4+/E3KYaAoEk +zTZY2gsm6cVelpbiB7PwumO1jNRcdEddf1pGzdb4BbDp119HXKZtmaDLbfddyboB +Eur3g76N+IoGrIeNH8yG5h/iJZGPyu76aWMk50PTpMY6IG+oFHdtm/YsH8R4XTJ6 +IKktPeuVq0mS3gVU+PjLIZWQ4DU8Gt4PAyzsBJ+zlxxfo7WbPkXIITFVRvFlMXVg +f3eH+nW79Evt71WufrESEg38m6cg8LyY7Xp9rK7ynV9t7OQ5P19Qhq8ornYIdosC +9zCS2X4chaiXV2un1hxKO5H9+d39EIguM4l2uv/aTYfgrzT45CoXNjyrGtR3LAoN +nh1bD6fhfifty+mjgMSlKIdMXSFfW4n61RCIN6a+CB/fKQARAQABwsF2BBgBCgAg +FiEEsu98BnWvkgjVpqIGGZx2CA+KGL4FAmKGKVgCGwwACgkQGZx2CA+KGL7f3w/+ +MxEH3/rhiPQK1EyBkhF6moGEq5IhzpjnEbqKw8QVBqg9zCKWAaMGGNVJXfpXhgBv +Oo4nLDxW3W0nTP7Og/dXepnfC17gDYrTYWMyyXPiKAgOIbWFJ+LGAjYaVOIf9juk +HMon0YYc6JcmFf+mQDXOJ9UYoYOEpKQVC3+cFIWgFofRfNrmgj7gN/vdAUVudJcX +Otyhcy+krnFP+DQzSwqvNomPZtIi8xHBQ8PfpbYqGOZBLe4ONPEKuzoO/YxzUhpR +4w7K6VnAad6702+ef59P++ol+y2PZ2Kz4A33VV4SgR3NDlqYfcH01mOvGSxxUG4f +/kWu1qiWBYWaJLcfYuDq7fg/FNw0/E+LgpUNfOdDdpqBck3ZxIkgXL/5IGBvyZ8s +3ZjvSAKvu54IUYWU948KjaAdIqrBuUUo5GUB3Eo9vk8fgIOnoEqUsx5inXoVz7sz +VHKEXeUTGIt8EgJ5doUxwnv52AZU8PLfFJLYbNB9Amp/pq4rtwSozUhEog3rv/vI +sGDqAhtjHiMlmGTEKx2VZeB1lzejRVeCGLiWGtIwsO9F6bqAZ9RTQuOngvbvGXUn +KWeRiAiXthjafbL5MFAlQNVdKAAX2Cr7o4894cuqZneL8+sXlj5fqwTtGcup15LA +nXPLp9bA3LBZwLif3+1Jvej20plpz9FtkgzaV6isTJg= +=rjU5 +-----END PGP PUBLIC KEY BLOCK----- + +pub F6D4A1D411E9D1AE +uid Christopher Povirk + +sub B5CB27F94F97173B +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQENBE89LqsBCAC/C7QToaRF8eZgGOxcvp9aG+mFFCMjaRAb4Mh59OYdmUb6ZjfO +9388HPebGbPNR8SHYs0dBIuWY4ZJ7oUTYPswasL8vB0iPFdyHhvkCca+yk0b8ZBM +DmFlISm9HkYpoVjcFUp1oivyeJ5LRTJTd5JGEd/SWFRbB4TimdKXBzej9fIm2zVl +KInEMMd8HnSYE6nm3aNkbyiqhx81bFvl8x6X3ZMWcKs+TAVXdP9uLVvWowUwcApk +xpee442Ld1QfzMqdDnA6bGrp8LN8PZF9AXQ9Z6LTQL3p9PIq/6LPueQjpJWM+2j8 +BfhbW/F2kyHRwVNkjaa68A544shgxJcrxWzJABEBAAG0J0NocmlzdG9waGVyIFBv +dmlyayA8Y3Bvdmlya0Bnb29nbGUuY29tPrkBDQRPPS6rAQgAuYRnTE225fVwuw1T +POrQdXPAOLDkiq49bLfcxwRJe+RozKrJC1iKxb751jTozEEJLe5Xj7WcojqgDsuT +jzaLHDNvDCzRFvwfkJ4scMTAZd+2GYsC8N3Gg0JRgC2lU4wZxsanLnVMbdX2L0lZ +7WnH6S+GJ5f0Et8PM/g+V2Gj2UraBhGGak8OBQ6NhmCJBcyYg8Bh90cgD9V1hMRM +LSW7gB1vnpLM7C8Yymd3etdZSIltmDuVb3uG9s4Uwq51s2MEKsXsuFYCHTz0xT2u ++6e7Puaq5V0218QGR1Wupkl29iIUF57hFR7f6oYKkecvPKc4Yev6Ii0Mbvc1H19k +LOXUrwARAQABiQEfBBgBAgAJBQJPPS6rAhsMAAoJEPbUodQR6dGunSQH/A+4/Zbr +2jB46q1JEN/UV4U3MBQiNvCOSD9tOPMnBvVzJ53HutvGGkmafbtbwDZaN+YMs6fi +itBMqjF/eQ/pJ54aFguTPGMFrlFyjz2n/pffkHLpVHgs8V5M4ALITttwCOo8Vv7u +3VjO+ea5kiCm9MqJySrUP2Dv4lPVB32eoEUqWDxoyeACihW+Utdo8TBDVd+R8w36 +W3CUSvujW2z9jMNTF+VoVWDQWc3up7Nqb+ztW9wrjqs73nJCv9bLPahUPNzfh742 +v9vak3TkwMcDR1eZv+KvA8GXSZM6ACALzTmqRHXjGF3UZ4vowQDfiTzZKr87eBaE +FoHco7Lnn+W+8qk= +=9+x+ +-----END PGP PUBLIC KEY BLOCK----- + +pub DDF3944950267CD1 +uid Jean-Baptiste Giraudeau + +sub 76947357924D7C43 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=Q1Om +-----END PGP PUBLIC KEY BLOCK----- + +pub 78178478013521D0 +uid Ktfmt Team + +sub FA84183FDD6A6B98 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsBNBF6RvwcBCADIVU7oxOiljoWxNTkZ00PKVwyqhahYpN/4lamULtECCS+HAF+J +DsNy/6QCl7lKAGrSyn9dvsI56KEkGvUJfpQrpRlg+uIQDMxS8JF7p9n49DNc8Q88 +XuCaiv7pv9hhCN3Mn5qcuzTR2gGP7ToZ4fQW9W/PSJBSOeO6JK6xXNyiKcyEoXp/ +jGSRqqbDkAT4OYEUy9RfG9BeJEGUbDK4RIaH5Bo0bdahq3mfdlKYXMwRWGV9D3KN +4iLE/26h3y6tQZS5zHQGjIIJedaKGWEiMsF+b7Jjf5OEC//FoH1IS7nDz2GK9BjW +iELtSnmyDIDiFAvMY0pGsn8AQFn4JxEP3TMTABEBAAG0GUt0Zm10IFRlYW0gPGt0 +Zm10QGZiLmNvbT7OwE0EXpG/BwEIAPuROTIEOMOtp07cZ0bYwuPEsX40TJNFPOxg +ak9Mx9RSfzhSNnQ0HaxaGc7O+HelsE6xeWtivbuHWjveWUvoxvkjaoYQ9WVtDN/s +Bh2kwxS26BkvlxbbA25ZDgjk+M0xCqwkB0WX2O5PoV17+KJUhrxU9ySKe4ROCTnT +zLIgfTvlaL1nzsJd/NWDN5RhzBKe9Uv9pcxZAmZySDXmn6z62B55TXyeyvzQZWaH +acHb4DYdCE7tPkfVY+7kV+LvaLOsWsBf5v+Eo4yQb1EFc4Yd/jgMTq8GUAnN8isS +HeQ14Sb1r3mHSPA+/8Q/SGZ5s+NJc13/RS2Q8OhiOE007JO2nDEAEQEAAcLAfAQY +AQgAJhYhBGSBkJluwJMKbX1JqXgXhHgBNSHQBQJekb8HAhsMBQkDwmcAAAoJEHgX +hHgBNSHQXSsH/jmg51oPLs8Qu0USx4aHVgmD0F3//9xssxx3/SW5l6iR8UPKoxUy +2uUOAZ8xSrDa8arNxfrSf1h5WRrJ0GqiKMJm8eeVDuLaFnGYX1LuMgC2qCrfNlQ0 +9DdFEHYHnxyEoyjBPWgqcZpa/bYMTiOjbHz+HEQs7gUBGEEuWh2zezp5MX6a50zB +D7whEN9qwzVz1fxdAwb5Xl+iXqQZ+mYvQo+TBqbM/KNcDb3a6hv904Fcdzy0Seb3 +aXWb3uzaQDSJEEJxxEgWjUG9uEuS+eMD4TJqrsfg6TqN6ykXvdbXTHO2cD0DFFZN +zO5quWpqxTLMSgNswFB4mjvd0mS3bUK4DhM= +=3R74 +-----END PGP PUBLIC KEY BLOCK----- + +pub D364ABAA39A47320 +uid Liam Miller-Cushon (Error Prone releases) + +sub 3F606403DCA455C8 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +xquhnpl2HvE= +=A/Aj +-----END PGP PUBLIC KEY BLOCK----- + +pub E3822B59020A349D +uid Kotlin Libraries Release + +sub 60EB70DDAAC2EC21 +sub 3D5839A2262CBBFB +sub 9351716690874F25 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQGNBF/RX/MBDADSqelDQKobURExWUKALq86yTPMxMasxmDlccKFpk5xjWrryL7z +qg4Fnb7IK5fKDtcnTANtOv2hlIli1h131+SmjJdD3qhfly7QoszOpr5izDS+FOCj +xUibkhupBvnRGtY2TetYRffoIzsGHA7npx/ydYsZiwV8QWqqfsoNm/gsvfizT+U+ +h7ujVQYO3r+GP4Apx1QF8Y0c8pqs981ma00Sa2yvTu3HhHYFaxPhHIyi+rmzFg3l +o7ysbTp+qbJrNJAYk86Gx7PV91IJPyvxbOMSakoc54C6/zYDTtAnCg7NMy1i9MPk +yk4AKewZQEDJuEYtJA2R5afYjzciGN/ChuvKy02t3LxVCTaY1EP+Fo1g3/2XocF5 +Vio8bj1R1fcwnC2FwZN2quN1HRxNacFJ4HHGn6dCDx35HNa0P3KWcEW0g2bKy5Dt +DjHYG6oD7vcdjztXdiQxle6qYJTJyZ8tXSVwyUdHWXQ8rUqAuowGB2vQ63Qy00Vl +IkDanr6teGpd7P0AEQEAAbQ1S290bGluIExpYnJhcmllcyBSZWxlYXNlIDxrdC1s +aWJyYXJpZXNAamV0YnJhaW5zLmNvbT65AY0EX9FgagEMAMXU3etJiP9HbJB3DE9h +RisbaHYiXbvZSKIU9B3zrB+qgadHOC2BTbSBkutFNYreQ5ttsymNXn4mPANMYqbM +9rKGfz31z0Jg7UjLn5eDmAtgyTpd7bI0CMfx2fOGS91QfHb4ojCCjFMYSDdlQYbN +Y5UzcLdS7dBX5J7gMesoQXENpvtMR/tS3o7nCyai2HU5w6hYQzDKPTJLc1ZfYOzR +LEHstYH2z0yiJadVJHzngKBtIHOIlgasYkx3OznEiPACl2rnGNq7SoSg74Az9xF/ +k7WT6KRJ5LiCH1mGgQQzy5lZnt72tpAAAup5I447tz101GEox68pjWKFBeV5PL/6 +2ftSTA0JwhGHPFxZazdmFHYLw9TQBBcHTE7WHYOgwJNfz7+pkIRDyF6NH5RE1CQQ +STtWWNPFQHrQRx64nhzWeIUZDwD4VgXK7Y+eZfgpULElRzlGH8gocErzL5R3h+aL +k423kBB1FL3rvnsTVVzThMoM+mEyj9r6azP/VWZuNXN5ZwARAQABiQG8BBgBCgAm +AhsMFiEEvJAM0vyanZBuy6SL44IrWQIKNJ0FAmNRxJUFCQdCyysACgkQ44IrWQIK +NJ3iywv+O9lQth7PnYaS4GYk58MGlSI6dvxdlLDOOCQKz9skHEfQrAgePjzfrpGm +5+aFsO0XwYrFp24YcDaime06Yd4MuyxD7eR0ZTayxP4bARg/MqDbNNI6Gvtc6H4r +Zep6Pg0Elps9E6CE/tnm/qElQHcOWiDEgW5KDHVtgxTbPkh4FyaYfp1XYTJsmexY +CGBAICsNVutVNK8bUUMYigh3ALivwWJa5goG5EYwJdMTeuTAzLqFMmhlbrmCef52 +zJza/LZBaRB2vbRB/6cQnwhRwEiK5BkwJvLhw70vVlrtcCfiNWObIcZJi/QpfoMe +0UwwMtUQMphE1fM7KIvXoh2nvuLsz4HA8cKT1TEsnS1o8Djp4yQ4PEQ+VdzTe0yv +hNQPwxk8pz7bkU+O6QfeviFFLvY89pU/KhzecymWZ/m+8wTlgMSvy9v1MBbS9UrE +TeWL9RBk+Ehn0arbDsd0ywLEnWH46MgMDzPwOJ41oxX1OTtIv+StFXgBTUOYqye5 +sgnJAl4SiQG8BBgBCgAmAhsMFiEEvJAM0vyanZBuy6SL44IrWQIKNJ0FAmb5wZkF +CQrqyC8ACgkQ44IrWQIKNJ2TDgv/aP12Uw2WRNFqjs1PsLDpxmxVZw3lLCwvtrDi +Dh5i2DqnKG8wR0oDhNqmzQr0nCbJ147aa348tgG2+PuNnkdPNidoudcGN3nt2uff +U1BnrIxCadbC6u+5otmoSk8MncMIIEqMC51bU8GEhYIl3YkJGvZhSjQmHlsyMdLS +RKwcPWb1iwJ+1hdN0sAs2nXY+rWi8Pl9C0M55C9+m9pivAz1lrn7nWYNBIRVzBLg +XY7wz1Eu2vj2OsgWLBqT9mG3Qlo0gs8lR7HG14MbVLN8Kkj/VKf8PRFm0YYCO+SB +gYQc7UrYyJrHDWcPXlpTTUjz2xExJPcJzZgpsuPFOuov1oGKovj/gOEyATwWw1Pg +z7q3jtvnw2nn4ju+geK/sVg7BcYnjDenBfPzZQle1kskB8hahYZOyqWOx9dHjv2v ++/oBRPfUh/afQOuKWy3grp50VUHi9b4r4yegdtIuoTUuAMSUTtLx67t7IIMvZpX/ +HeZsoj/vIQSuYEeV8PL+9ySFwVsyiQG8BBgBCgAmFiEEvJAM0vyanZBuy6SL44Ir +WQIKNJ0FAl/RYGoCGwwFCQPCZwAACgkQ44IrWQIKNJ378QwAwfS77614YnTacy5a +4EEnVZJywUun8sOhRS8fXdceKvSWrooaKlU3eH3QbnYJ1EcF4vBSXCMkjNsxJsOA ++wdQ9tp9qGFyAf5mSQHcNeZBsqbOgDNoqGb8NTx1Wt8oUxPauoqSF6rthjSzZFje +0ax4qMUeBa8CZdKl9L3vQHU3kxmptFhcdCmdysowODQ7TMTpDjZgmmq5g0cLDkiQ +LwQnJWEkDU9oRFG9uwXlFhFOnNp577Td89Au5i2LLRTl5L9Bh+x9srDH3aoUUTbg ++QlSRZqYZv29gED2ryG4szfg5JSBVulif4NWqjLHmKHEY8/JNrht6D+LQwA+6+3f +tZZoVYbSi+9FDwNUncAKdI6rxs2lkB5y2PZ5cQ4Yt4nDErHFFokandxK1s9Lz7cb +3sNJtXV2ylykDNbChMjR51kQDigxqiQhj5HU4UGVnoumXOU9OT8QuWjt9GY2STLn +Uzah3h2Hla8r9MJSXxEFNL4AZXRA9nL5snQLVLt9g20dvWx0uQGNBF/RYJUBDADM +PdnbVSrdKOMZVwuiqth7m2wT6c0WnP3G31ANtrUI8yqG+0kGGiqNepA3AfyXiEc/ +17/6qGyod9tGqTNkRTjCw0cDfXE3fX0hRoErxFJAky76McyBrlhrUOalFqfyDB9t +vsl85kGXMBYqDNgwb1OgRPOoepvw/l+j9x1qwZUE3b+VbftNvsYMXr9DmOtt4C1K +XbdfHt7R44f7vIJpvRdq8SlVx9xg3PoG5GElhXEsUkwE+8WRcBMvuBX9Sft00JC5 +MDypRYKILjkJN1xLJm3tRwYN3RC9TMdZl1YMfIjkHKBMyjhdBh9yhVCme1YtnhM1 +ix2Cf8cc+5yixBJbrPcEIuuUUzjAzj3G3ExQBT2/Hbp6nOzJwE7lOW8vrbjFagk7 +/G5Jhf3Djb9cGr+vKE3AmIXwAzQm0I0vFyYBxHJL0ZdQi7VKbaoNO1U0MWYVEXul +9KLFGbK1+/bs61Qv8B4I0IBcTIcH1XViR9Vum+Hu+txQyIGENUZsDd9Rnh3Pq5EA +EQEAAYkDcgQYAQoAJgIbAhYhBLyQDNL8mp2Qbsuki+OCK1kCCjSdBQJjUcSeBQkH +QssJAcDA9CAEGQEKAB0WIQTn3HX8JPs8jf6Ahq09WDmiJiy7+wUCX9FglQAKCRA9 +WDmiJiy7+6R1DADBM8b80HP2HNUcs6wjzRUDCLxld1dipakdVH0lJXJ+im0Drr2Q +lzSGNvznDLL4df/tOkLhn0wlcAceSRKEqiaFPZyLP4372oBot0/klZ1pNUoHMEeA +iUVEFDOB23m5HCoi/Pij5FMVBsxodW53hyerWmeqEKf3GQ0p4TQPhXDhk+l4sboM +yNlBSbbpkYQHHeZfshUnAMLdF6yvL5o0pVNPOEg+Jo9k5XE7FbM/YdYuO3dhGf1p +FiFIqfdRmqBCP2lbZZIS23GEYyvKxlwFI94Lio0s3UVjis/bB9k2is9kR+K1zkoF +/1l+yRkyMsmFppZz68jp4hzFwB8J7kruHdfIXwu1w2z5wceCy4/QdOSNLde8ptmM +xYG+vIH6Kyr4XV2TOOR8WV1mGpJWnWRAhtmeWLazSZlLFGKrNlVc+R0donFmuFhw +xL3tpQVkCGBJ20uyPlN1alYSJHplL0jBvp6TrazKT+yJO33A2nLWDCDW3vZA8Zpf +5S5+8eJE6DPo4w8JEOOCK1kCCjSd3T8MAIBp+da3/Io+DGrDK5q+EU6VgdxptLvv +bbFqd1QV5Af3vg/jbi++r92YQIEH/DGFRyJ+0XtBX6LLRb8bVucs/VZPFByNJd45 +1fa424s/350SDd7CSMmt2lylB9kFSiCFu/4X8iqywlq/QP2WNyNgF+WOqBjdQVei +Rro9zMCowwo0GsJkVzFJBN9iCeAEP6TitDOVghG5JS7Rpc2n1BIiI329UAQnz2Ck +8vnkmhKnf68d4TnjTB4ySREEeFRAqYWVq08o8Dnx1dtI39RS5cE9+J35lZvfzRz9 +cFQp0WWiWYaYMIjFUnIQItyThZQsuVwIOmUVoFuIvIkwYwvZ6vE7HU2y+IpTXc0j +oJc0rczANLc3X6NuFTWEOdTvNOkej+axncEG70diQespDPa5b/Z0nr18UiNGlVFH +i4HDkyb6gGCfzJOMvmWlg8ZE/sF06RZj8EGePXftm/ckIosOh0cY11WMHXlANlvb +mGzb7NiDKVeUGNDvkoQ7y3HGMcay4JG1oYkDcgQYAQoAJgIbAhYhBLyQDNL8mp2Q +bsuki+OCK1kCCjSdBQJm+cGZBQkK6sgEAcDA9CAEGQEKAB0WIQTn3HX8JPs8jf6A +hq09WDmiJiy7+wUCX9FglQAKCRA9WDmiJiy7+6R1DADBM8b80HP2HNUcs6wjzRUD +CLxld1dipakdVH0lJXJ+im0Drr2QlzSGNvznDLL4df/tOkLhn0wlcAceSRKEqiaF +PZyLP4372oBot0/klZ1pNUoHMEeAiUVEFDOB23m5HCoi/Pij5FMVBsxodW53hyer +WmeqEKf3GQ0p4TQPhXDhk+l4sboMyNlBSbbpkYQHHeZfshUnAMLdF6yvL5o0pVNP +OEg+Jo9k5XE7FbM/YdYuO3dhGf1pFiFIqfdRmqBCP2lbZZIS23GEYyvKxlwFI94L +io0s3UVjis/bB9k2is9kR+K1zkoF/1l+yRkyMsmFppZz68jp4hzFwB8J7kruHdfI +Xwu1w2z5wceCy4/QdOSNLde8ptmMxYG+vIH6Kyr4XV2TOOR8WV1mGpJWnWRAhtme +WLazSZlLFGKrNlVc+R0donFmuFhwxL3tpQVkCGBJ20uyPlN1alYSJHplL0jBvp6T +razKT+yJO33A2nLWDCDW3vZA8Zpf5S5+8eJE6DPo4w8JEOOCK1kCCjSdel8L/iqV +iQokXhTDBf5TJNe1MbwwQXY4CgGhwgOCX+EqSQJvksh8AI5YE69FaDzIH2MCfHBf +yLqSE9e/VUDUZrweoYDikTXoTMJKSImUZn48XIs8+KMM0ICC31ra3r42IH5Mkm5O +BxmBQeDHOg27LuaeJSj7vden9h306Ls52aYgrXXtM9udW7wVHuIiIk8tSehMVS/D +pW2algb/E43fOZm3zpetxqIfFo6ah61ZvM+b8W8PAfcQJuJ7kKb9NqMWmyPtY07o +SiOy6re5LGrMzYPl0UpSzdwecy6cU1HKPhZDjXkqfQo+QSEDwhAQo+gnBb1tApid +1kcZSjDOWEe46LqFkbn2m/CDLoy4WxZzOtowtmQ2tLzWBY9g9c8COMS6SZlmk5zB +xHV8ZRZEIlKLdnk6kJkTQVb7SYSpI9SNlJNy7+8Jg6OkfLo/8yJK+TH+TLULIbeH +dxz00PADgthL3QlIGo6wb5B8RdARFg1wCSy3+nlJ6D2rITlAt8bsPiO2zZL5pYkD +cgQYAQoAJhYhBLyQDNL8mp2Qbsuki+OCK1kCCjSdBQJf0WCVAhsCBQkDwmcAAcAJ +EOOCK1kCCjSdwPQgBBkBCgAdFiEE59x1/CT7PI3+gIatPVg5oiYsu/sFAl/RYJUA +CgkQPVg5oiYsu/ukdQwAwTPG/NBz9hzVHLOsI80VAwi8ZXdXYqWpHVR9JSVyfopt +A669kJc0hjb85wyy+HX/7TpC4Z9MJXAHHkkShKomhT2ciz+N+9qAaLdP5JWdaTVK +BzBHgIlFRBQzgdt5uRwqIvz4o+RTFQbMaHVud4cnq1pnqhCn9xkNKeE0D4Vw4ZPp +eLG6DMjZQUm26ZGEBx3mX7IVJwDC3Resry+aNKVTTzhIPiaPZOVxOxWzP2HWLjt3 +YRn9aRYhSKn3UZqgQj9pW2WSEttxhGMrysZcBSPeC4qNLN1FY4rP2wfZNorPZEfi +tc5KBf9ZfskZMjLJhaaWc+vI6eIcxcAfCe5K7h3XyF8LtcNs+cHHgsuP0HTkjS3X +vKbZjMWBvryB+isq+F1dkzjkfFldZhqSVp1kQIbZnli2s0mZSxRiqzZVXPkdHaJx +ZrhYcMS97aUFZAhgSdtLsj5TdWpWEiR6ZS9Iwb6ek62syk/siTt9wNpy1gwg1t72 +QPGaX+UufvHiROgz6OMPCq4L/1H/p4L1+i4k08Z86OcDq9tQ7FKcU6ExZfBljbw5 +EB9UsbdiUy+7CA2D9pu6Dpv2dO9H7H3/+m2Y4RPaMiL5qgax6Ksh7H9crsSfyi7f +3omIwrZ0B8DEGlwAGIUR9H9a6SqeENgcAlAaNxkNjNnZo2W9e1EvdkaamxtHeQMb +eLnTvVU41MpP1DaE4D49R/cVoZxEfpozEq6ZvzcIsbfvOOFhlln/SzSbrxHXWLMZ +gvt8ukvCZtpiuG+MpMnXXoEYav42DSxogDB0b7/bX42eyFXZyz/tzpORcgBuKPIU +aoWSLOEczSTqneFZw1laODg8ejHLOA3NhID/jrxYWenpP6TeWnf23aLXoVyc9voS +aHf2gzLKG9Wg5SDz5THaxRUKvlY3kudA15AOQ1NkVvD10FCTDLB6WaA7hfhRslbM +n6YyZj51SYQAH7LxDlQlco7Luvqiy4mnguLprBc1QREoTIQAM32yLptzBtggHQfl +bMW74dKTLoW6+aNn4F9nqCJ88LkBjQRf0WFpAQwAvOX8TNMbEwy74JXe3QzREJwm +x6T2pNeJPLlnOYITG2N75vJGr3cRwAJ+eye8nQM2MN9h2uTqoo7mMtl4zXAaORHj +225m+qsdGUFV9+a6/rO3glwPQYCJHCSNVcL/Gsrr2iRSUOnyisBc1IV1/50znKN1 +q5FvOSC2UBAQ7QGUrR6LNH/x/JmTOKZqOmza8gjhk222LIKYyBo4a2rYbPXKMIvl +EPE1pcK5cH1GnkSrOnTWlnMId0Yg384xOqLf0FF22/crmN3tKWnGRwYsiJ/8gCSS +PvdzoeymAZ4Qvxj/eQlkKUxSQA9hNctSrn/xIs3cbjb/CDTxAqk8r8JHR1g/S6aI +8sG5fUeF5BZkTvsDIIzatm0gQPwZAE/yAKBW/Uh7zjBCzuan8fflcXhjwd7buB5q +1QmaG4VXpUMRSyAbDOYaoDTnVJHX53DQRGzbydryvCFCDkWN1Qc015osGm4XD0Rx +3c4KM5yYiQW6YjpuibI+NWSWSRVeZ07H7vyIbt/bABEBAAGJAbwEGAEKACYCGyAW +IQS8kAzS/JqdkG7LpIvjgitZAgo0nQUCY1HEsQUJB0LKSAAKCRDjgitZAgo0nTrN +C/96FX2PR27w1/LD3eiDBxZLwri5bFVrVc9599Sf4J0WMh81HCuunYK+I0Z2/nRI +PFQyxZFr9EN55MI2rYk9pTZxsd75oHQwCPf5ZDgU67HW0c0fRkcbtSInuZSQKmDr +IhNZvJpy0r7/CGsUMcj3tbxaEsP8YSzgkj03wLkEtB51vHrUGhyYhNWpG7VSzBYV +rKGrBglOvY0xIOPOzkP9Ig2b/1AbCzd8Quiijm3mWZONfNFmB2p9aao3qPOMlnBR +vIcI7HNJ5RIMT8IKaHS1iSQmhEHmXZanyE92sPDDqvKVjv3CSjRiMCRIvHCvsTq0 +N6E5pfMv2J+2Hw8rk9WKURK1kD0goJCFaLa82a+AFHpWtJWU/eGzD/1kylMvmW6d ++MMa25MIHbAs/bgWDUwo+oSm5Kl2VKW62n72SrJaL/Cc6qMN9lC/AeKqK9Qzo/Qm +7JdwWmZ7hKDsWpWbBZNUiNYXLcVhDeGA7bPjhccnCmHxql5L5XwT6bmrim65znko +TE2JAbwEGAEKACYCGyAWIQS8kAzS/JqdkG7LpIvjgitZAgo0nQUCZvnBmQUJCurH +MAAKCRDjgitZAgo0nYBPC/0Yp2Qb7SSR/oNSjr5Gmj9Y0+qmyPBxKNO5Ey5pD+bX +KMX/esrvzsH8zMWLD8JUfeI2X1Y0ACIWtwGX/vSjtGb3SSmp6pb7YeHxr1yIBZK2 +NHmS1tlOzpcbBET23SO4x6l6FSj8go0e/CV6P3t89c74DOHe1jjGskWWj1rZyuGc +3i0eQwQcwuc9H22LDQv43VNVGDH5WafsysruuuNPFzokM5tNq/khb5OrpYNuQY/b +K85KNg+cuYUuh2Xjj/Kuf097lkAG2KkflD/3dTRzikhVPvvRbR/B7HPHaZRqs94c +sN/RYYGs4e4I7v25KFGa4TT1ggcesdmE14MrQ3t3i0RuC4DACQB06eU2gnG+LLrR ++7r/GPlyUFTpTI+ZNidU7Jwt7SV9KW05y2EWtRZloJdVWSwjNRzV1rcuCoP50byb +uD/i8w8EoCIe0lFul5OyZ6rTIAq25k1Sop/EloouXXUbAXGFojQ5n5dlo2GiTpmd +xTCOP2Z6QwHhUyRpmFPtwlaJAbwEGAEKACYWIQS8kAzS/JqdkG7LpIvjgitZAgo0 +nQUCX9FhaQIbIAUJA8JnAAAKCRDjgitZAgo0nWDBC/0XgPo/WkB7doUDCzjFMdxl +qBhSU7Jo7Nn1rC8TU8Xquu3Zrqso/ga0Gt2fQuE6uvaLRvrdbt2rSA9Pnp/1w6zG +TKWMB4lQChtUrVa4T7MQxsKkrnH5PhXBggc75Y2hRGGUK33i3xAZk4QK5JHm3rfO +qK+GIc4SHxV4Ou9940w3SByOkIUzNHRSYrhpj7NAXpjqqb5qcDJDmWnlBge1XDVa +JY4w7kJztOUz6s7kCDCn64T1O+T0N/LhvIi3m8enJ9/S5qFdO56zotFMA9BFTOV0 +NXdPDfhkv6+F/47lYwBMCj2+sV+Z/zNRf+sJmeyHIsHQQJMM9kiw02w8vdAR0Drf +pMLq2B1eiQZ5FQIxA9ncw1dLXLUg4bAtPsbmXFvnXoae0KpqPlNUH7s9u503WH2a +1HE7GhWL3LhT4r9isgW8GVozuvw4IzQcbOMsBHH40I8g9s2RvktFBoLuJjZEbrYQ +V72Rx/4Y+SMSO5UvaWZB2hyjnNuFUlXDeEwOqVCgfBI= +=9e+M +-----END PGP PUBLIC KEY BLOCK----- + +pub 4DB7BC57DFDBCEA4 +uid Timothy Wall + +sub 25EB2A6CB1459233 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsBNBFBm+zUBCACsrBpO6mOsZ/B6PdPPV/Hj87m2GHeEYEHt2o2l8X2BdbZKbVW1 +FIKnpYe3+TsFCe/qNxlR6vk0Jpy3ChD3nW/J0rmU0ju1SZnS7rdSMj3AI5M5xxpy +Vn03vCbYyFWw4Bj9avYmiz8kC7yImfGfTLv5XPmlHhUQaxW8+s+393n1mHZsIZTt ++luPftSLCkcmKGHn+PUkFaHHD+q+TTaG98nDkkaCXS0JwXzujYDJDQgV+6HB6PO3 +gJJW4QcUHWa5uUY4CfqGcYGBvzlfII2psyKFIHqrx1uHxbhjLlIwif6I+Q9OFcdq +qq4JgVnWti2dEBgOVunb5S0KnN40VcH0v3VVABEBAAG0IVRpbW90aHkgV2FsbCA8 +dHdhbGxAdXNlcnMuc2YubmV0Ps7ATQRQZvs1AQgAumH3wbBy7RYBaRjaWjN90OKc +pXuJ0MTIzkgC/JtNexIVtzFdrfmHPOEZESYyLVk0E5YU5i3ux+K9ARi+bWrst3s1 +iiPfebeNCRU0lmxI7fih/r+PxcTTdJnHAoZUNBK1ZzjlTgXacradjS1LGFX5+52g +TgFVNlYXvI3qPKQFb+Vfz3x4LwOI10ipnqZK61D/FC96JD0osEFJkmFvI5n00Vww +XXRoeefN44Guvs58nf6MNi9ZA11iQlK2a8CswAuHJTndkQejVq5D1+ejVVmt27mH +5RhG1xoNZ6FSkha+Y3ImTpxQMJzdbkOtMzj1S2VIt8ZcrV/6dt+yCAskTFW/ewAR +AQABwsBfBBgBAgAJBQJQZvs1AhsMAAoJEE23vFff286kd/gH/2Wz5zWkcvk8ReH1 +Ke9vYH2gee0qtXIrCjtV1WBOTy0NLm0S4Bx/uFjbFUbqNK0nKjTix4mAe9KrVJwN +47mXVGxG5N79KkiS8lj+YM8WOUIe5tkDovzEfqFukzgpHBY3CXjiojugxVv6cEe1 +GLnEEOYJlezZj02HS0D1eEeIdu7aV6f6xPFAo2q94aavz8cC01IXrnccUfuDtBJE +VqdZmVoc/5tUZf/dU2m5ga62U7yaVbiimP2NXIL2tzGLgyUaT73E3e+EXzfcpJaO +rBqbcs+2HPfAjBm/km/0EC3ET0r2Vqoq40hP3fQqLSC/LYK6Vbuc/l5M0I1QxhJ1 +njCEin0= +=U1nj +-----END PGP PUBLIC KEY BLOCK----- + +pub 39B48E1BADDB933F +uid GradleUp (GradleUp sonatype key) + +sub 8F97B35AA6D60AA4 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsBNBGE/hA0BCAC+MEPPNI9edKJ8TTplIvVa4o5Umd89fWtwhkxOaenN6y07L9iV +rI2RISRdv73Kc+K+Qb1Vlom4Fa9R4+NAibhb/QRsn1LkA02Z6JIF9w78JN9DBesS +090TiQwZMzgljJaLVIxzCZk6T9XlZQC3bXmkyZkYS/a9NMa7JnXrPua06JKpH9vZ +cM6L4TUb0p6Tw7RsdBHKBj895XqIVlqJXfNEpcOZ2LCMUcVaOJFS/dAXSrTmNdT1 +z1eoeoob/CbHIzH3STWVCXnXOw9APOry+aPpBHAD9g+1Q1BEj8pSmEnByjeO6yHN +UMbFTUtM77oVAbLx6rHL7jzfgUQdVPr8PgU3ABEBAAG0NUdyYWRsZVVwIChHcmFk +bGVVcCBzb25hdHlwZSBrZXkpIDxtYXJ0aW5AbWJvbm5pbi5uZXQ+zsBNBGE/hA0B +CADaDvPtymFgLSJLHPCRIUATJNwKu06QIE1nJ9EiCzHn6HfKm9EvY48g8ovfziQi +bleP7MKllhUXm/ZAN8/ufg3/kRD0KI4aFyToiJtvBOweSfOj/USgC2nSDh7BcZXn +dVkSafrjsrFMdk2sFDiTNi+Qv+BULC3m1ciG0AQyGYQIiGMZnKpTDP6aHZUZTFTB +h9JRXWhjTG4xO3WadRKYAUN879tp73KMACuaI0tK99fLEN/bMMmd9cxBTpZztDnd +PnVlLVyFZGTmjdJKCMcLC/gnixiRpLoy7qXzj9z/nrlZ3QcAPgGKtM+AO37Zsbbn +Qox+Yao0o+GvycRCtNT4OcaTABEBAAHCwHYEGAEIACAWIQRIV9HOBOePqyoXLo85 +tI4brduTPwUCYT+EDQIbDAAKCRA5tI4brduTP5/RB/9YiKJTWHr0PRVtV8STKvFm +gMVw+RF+eig5vZ/MKq0svyfeFLf7i/XfndEG4X85G169tvNI7MG8d362NdpSwEdJ +ekiQh4+i5oE5ZdnNDvPXr2pVAKDhyuyPuMUmA0Zf+JWDQ5vfzgpcxos3Y3i2D1D5 +92BDms675Ob18NvjjAMNR9bf0vEmjlv/k5oWUe0lYEDOBnImGgEIPqEOOvKrXZFT +klXcR/JI0sUwvNWLfAsyi3HtnR8r9n26tyo0wCBVWO+zXjvI7xhvpS6bvI1CfeQ0 +04CuCUoP619vciqXdyso5jTobWTXxKvMHgrbw0XAZVlL53qp1OUWi1pA2/eQRMdY +=Sqth +-----END PGP PUBLIC KEY BLOCK----- + +pub 6329ADE2B25B244B +uid Paul de Vrieze + +sub 3FACB47A6AE68B7C +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsBNBGB9fcABCADNbbtAiTtnUYkhQPik50gYwTuP4QIQjTVeQDBIcwRIjhGMUVov +PD+Tf41NTy9VKlbuQeFIPrx+MzT0V3B+c7KSFXEyi36LzeACDpcDjR3Dzh+cAKGg +acaxk0lsfARgcnCtayPY+rUaZyuJDd/681onRm52GqpkNbCQ4Ikij153VguPcKM3 +vPCmckEHtrcbZZbgsH14A9+AQfL599QDJ5XkQv4g3KXVgBAODJrVjjRiVbTNSqJu +gTQsEe1JDSSDv7vYiDmWBdtC1Qbw0IRpuxPLnF0CzNO4gBbWQF+1YN6p5cxpPaae +Q1qMDePS2nLJfcuCEFrIwBG3fGzvmJzh9FHpABEBAAG0KFBhdWwgZGUgVnJpZXpl +IDxwYXVsLmRldnJpZXplQGdtYWlsLmNvbT7OwE0EYH19wAEIANt8dkaPfHGJS38o +m9vEKcS9XJckGHv79xnppCfSEw+S8vjjCR6UZ59YRJRT+8fhSCIE4+yqBpKAXV+p +ElskkJlidvSA+Yu1O+VeZvXhNpGdWMse8obUULf1+JbxaNCmhCUbXoqCZ0MDJvep +ulFOmMTHs4Vh3P6DcgKNpyvOSiEfspY9GwxBbWfirYwjg+wdw/RW00F49vtSL3ax +R9p5DYDWDEhLIuC/yvbDxKeTvICzTB2uQhysONzYUeoqtucE63//gXvdftv34S8w +JgB/3a3S9NzbrAsgRi8QwEole+lKToyNh6CuN+KzYeA4XcvwGIwU5bAAKkY2CRuo +pqSEqhEAEQEAAcLBrAQYAQgAIBYhBAXxpdpXAdQVvvxn/GMpreKyWyRLBQJgfX3A +AhsuAUAJEGMpreKyWyRLwHQgBBkBCAAdFiEEbvTCO4JEqDcAI8Q/P6y0emrmi3wF +AmB9fcAACgkQP6y0emrmi3y7fAf/Zgb+4gbdTycXSG+JmUGzfapgpXtjnNKd5sWG +BW7mGkvfyKIaML3NUKUYz+BQicF9rxnPNm74PM9vl2W3ejY0LXGllk8nJHQTqbNr +YSLMGDTZk9oH3DtaFFImu/XF2etU3OFruqp9WBbr95YCz7TaqsNKfiK8U8PBAShn +8BcmN9The1XpypVxXdBAiKkX8rZQ31T0eaw/JF1esjMEa741gybgz70Y9oxI8xiO +7zIj1fr9n3aNns8jmZ3InFI1IA5FI1zg0wAXKAdFbW5crf9osD1WkwIyO21XLWkh +7goj1A/I/JQAxWZiL7dUpbmtKngVJOaJlSPfbW4zhvsneusYJkkQB/96/b/zyT9V +LXKqwatZF6JXJmG9tEZD6EOEXYV1xfdKMEV6aaiFMN75O6iTTdXs+DBsHeBGUhd7 +YvoF2OBVTNKwyAQw8Vtt3edx0LJPZZLk2JoVyQDKW3hmZS8fq+WZg6wgL3PFY227 +jzXHWuZ/FPtJRBa/QXJLV8DeQDPGM42ds5nzWk/AegT+nw8jsgznVubRkdjhBT7C +oVADwp4ucWwH/q/05xBqQnv4WdA8QZirLrRqjhQJiA+sMkIHC7b83Q7KrEpSbUGz +rXfNOAUjWjYEM11ek3EKUScDr+hyP7IW6pqf6Le1rHjDQt3PT7zL4LogfL3Rt6GP +Fu69UuSeTPOL +=LH1+ +-----END PGP PUBLIC KEY BLOCK----- + +pub BEDE11EAF1164480 +sub 4BE257B370130000 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsDNBFv1EEwBDAC61jyEM99KH18hI3zlfuqvGoNjTLIh0wge5vXAH8VxMR0ndOID +HYSBT2+L6OeiqKlyhCgF1km48F/dMzyJdTASkNO1Ni+B2Ric1sBxjsSPufkjl4en +yMOl/FuQOB2myht1fCXhlynmOoiRia5J6xzCsCNVGOVYfSru8vpoT9QKcD1OlwoD +WhfyBx/bXsoRvD1CMjQdalcGxv1aJRWfhRumXQwhMPZlFeARAzeDmWNpglqrMnuG +/VADZXZsbLv8VWaequ4wEWiwTOeA6YYElx648OTSv7NjMM7iyPPPWbbUvkVbA3Em +lLBLlGYZTx2nI0B/322SsREcEDwaBzO53GStIzP1XvaRosM/98/Y9ITwB+Oh7ZwZ +dYmmabxN6F5O3v+TNndEW7wgP0lkbsOWZ6YNmFhvoEtd1RxZiSNov5CxokYUrug1 +cS+/vsa9oIecUwxYOG2D1v/pwYhQnr3qasYz4nEEBWHnnkhyr1BbUSuen7w2SiK+ +64cQn6V9aeZYi6cAEQEAAc7AzQRb9RBMAQwA7UCAsQ8KxX8nYO4Sy2pzlh9W5FMP +wGluuokPA2A6g2Fz3vF62RqeaE4HrRQMpijQCsN3JTJVwDid41X84XCMItkdAxMj +mn5zeF/yCcRuHe2Ci/+ae5BzrBaKE/VWRAkaZSZWJ1MoDdpSxJhLHNFnVrwTkM/S +eSNUBk9ZDEC+43b0hciefX9bFlc6XPHgV+yr5ohhwcNcrZ/gbAhhN3/xIVmvKoib +mb+ZIajhiCP1OOH+GpZAPT93w9qZWq3+2gvP4ZZ7bO+8N8Gmz24GL3/0eYI6aMUM +wWGjy5J+iRiFjb6E+Iv/zToyZFWm2VOuOUqy5t4u+Vyk5bl0hATpJICmKa5OFtQw +G5Uvfztk6rujjat90xv8yzsBvoEUqKqzIzjHdN36qop5hLMnBljdLdFY+Rk9CHdF +7MW8Nf0YWbP/3uUk19utGW686Lolt8gvBQc4B5N7VtNoXFCKM/I3ufgnHQvDlf8p +gdJOcyx/a90V/DpUI1ANlwg6IsmFZXbBQw7tABEBAAHCwPwEGAEKACYWIQTjqflQ +eehM4gH3z2C+3hHq8RZEgAUCW/UQTAIbDAUJA8JnAAAKCRC+3hHq8RZEgEy+C/4l +sgrKCmq2Nc7eTdN1AxwMkj28XQFmkqO8orfJm1hAtVK1KRizkX52RNeRN6QX3pX9 +s1e3DjJi3Hpa1UWqeicPA0kKTi2ytUlxR/iZDkaQkLyCCZtWnGHr/eRBdOjblprl +5O+v/tcyrmQGC04TqOntMumuk7JNjZ0QAVkZUxdmfi9bHaF5W5vlcaFYT5gdWpkO +Q0YaWXXw5ynh6Ookjhq0g4pZNjl2rdWWyTC59YIvC9THx0+vuyN7xnSWIb8J1IjE +EYvPqRfpd8s1Vf2AA0JRPjUG2UV8MZqu8k8x4iC2gbdji/vyg/ycdlRT/ULyNprz +1nTLMfhBT0Wmy8B5lFVme3URmld8T90RPln6Dy+c+IKb/79z3FPujuSbipXzx3Qv +GwVYyP80JFn7CJluOl/u8vxi2EVFN6aVqdzwoswFE3+0W0AfbpHUUT4oeBW5OBTJ +5i1Qb0DT6WXk3Y2j1Z08xxhY1RITnc2C33wjXAW0h+qq7/7Yq3w3/7ncv9sWIzU= +=+T4J +-----END PGP PUBLIC KEY BLOCK----- + +pub 6A65176A0FB1CD0B +uid Paul King + +sub EA8543C570FAF804 +sub CA890A5FA09CFD80 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=g/bF +-----END PGP PUBLIC KEY BLOCK----- + +pub 72FEFD1572EB75E1 +uid Spockframework Robot + +sub E95B8FF73F6B84E3 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsBNBFt1xhcBCADDofPZYtlG1I5NRG67j5Fn8KArIzKK9L3bH3MfJC+XYYPY2N11 +ckiF3JQ0kXH3BPL6r0+dOQm/9SGJYsRVRYYoz2HEf/bzLSxFvKeEdEsWh66IcEzp +xlxV7rXc3oeGCZ+EvobG7JVoRyyLegx/VareBwtBhW39lLGfBjGBzFuXEMVG4H4U +v304N7D4sEIBYWT8c2z5Q5/Iviiyu/VgHxczDn0H6Sl1kXP1vVhWff+OBlbO7JAF +TcW4ET3K/ASWL/CirLbyyVkO8DO5pQyuJqci7pJFWWp/56CpJBmxuyQRc4SEpPjC +ZUOs335j1+MxAJh6z1L/xZHF9OV0GgT8cs67ABEBAAG0M1Nwb2NrZnJhbWV3b3Jr +IFJvYm90IDxkZXZAZm9ydW0uc3BvY2tmcmFtZXdvcmsub3JnPs7ATQRbdcYXAQgA +xh+deGqkK22ydYsUjGkRe8BGN9QQfdY3KfuTIugU9nQBTtXetx2wGD2T0Oz0vLnG +FEVVR3wDOWvLBJ4BD9tJX76JeHf3Eurj3g8ctBMbla7GDwfDbW0p7vT2I7Mlryvo +I7XSyP0l8KfnNaKWo5tzFw2MpyYY7BN+giWbyCJV+10w2B7XMSwlDddNm0w1I0ec +rcCn8ju0gFPH+nYB2AUo4vvejC2pAgFemWZGv0AesSLCri+zHCHfdLf0ex8TcoKZ +VYkQin0JuK00aaidv7lwW1rGEQSGeamZekBu5Bw2yMGA6JZchR5ynuJOQ8ygX98L +MmAHMdXHfghX9cHOLhm5mQARAQABwsB8BBgBCAAmFiEEdulOj/CrWvO2+DZpcv79 +FXLrdeEFAlt1xhcCGwwFCQPCZwAACgkQcv79FXLrdeGvyggAvNhz/LfzuQKaEkSc +xaJ5Ww5xhDilQuPbJNhT2lhFCbEd0EjALxmRvE+WMVm+Cs+yd1Gce5VlS7/BNJWM +7JTRr1QDueirU+nmwj7DPEpJgx3cI9rPFytA8SmeokWJUOZrU0BddNARLNImcKei +B/SeaDiy+BVs1qY5+ZqwGKvPAJuEUOgvTUbYd6EWCYnxGttZtrAa/Dx2kShNOgNz +kLBXkjgSJxFIbaRjrOFvsH/wcSG3Teyv5g/kOXb6stVtoUi9RoyQCEe9JbxeH4pA +j4u9f5+Fcg4SfYIub6ONQy61an6LPty07DADRtYREyn+rmgzopI9KSB2iSZiwhrt +1RHXCQ== +=mM4w +-----END PGP PUBLIC KEY BLOCK----- diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml new file mode 100644 index 00000000..05bc92bd --- /dev/null +++ b/gradle/verification-metadata.xml @@ -0,0 +1,158 @@ + + + + false + true + armored + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +