diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml index 7909d50..6955abe 100644 --- a/.github/workflows/ci-build.yml +++ b/.github/workflows/ci-build.yml @@ -16,4 +16,4 @@ jobs: distribution: temurin java-version: 17 - uses: gradle/actions/setup-gradle@v5 - - run: "./gradlew build" \ No newline at end of file + - run: "./gradlew build -Psigning.disable" \ No newline at end of file diff --git a/.github/workflows/dependency-submission.yml b/.github/workflows/dependency-submission.yml new file mode 100644 index 0000000..25824cb --- /dev/null +++ b/.github/workflows/dependency-submission.yml @@ -0,0 +1,19 @@ +name: Dependency Submission + +on: [ push ] + +permissions: + contents: write + +jobs: + dependency-submission: + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@v5 + - name: Generate and submit dependency graph + uses: gradle/actions/dependency-submission@v5 + with: + build-scan-publish: true + build-scan-terms-of-use-url: "https://gradle.com/help/legal-terms-of-use" + build-scan-terms-of-use-agree: "yes" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8a1b23a..65fdff7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,9 +13,9 @@ jobs: distribution: temurin java-version: 17 - uses: gradle/actions/setup-gradle@v5 - - run: "./gradlew publishAggregationToCentralPortal -Psign=true" + - run: "./gradlew publishAggregationToCentralPortal" env: SIGNING_KEY: ${{ secrets.SIGNING_KEY }} SIGNING_PASSPHRASE: ${{ secrets.SIGNING_PASSPHRASE }} - MAVEN_CENTRAL_USERNAME: ${{ secrets.MAVEN_CENTRAL_USERNAME }} - MAVEN_CENTRAL_PASSWORD: ${{ secrets.MAVEN_CENTRAL_PASSWORD }} \ No newline at end of file + MAVENCENTRAL_USERNAME: ${{ secrets.MAVEN_CENTRAL_USERNAME }} + MAVENCENTRAL_PASSWORD: ${{ secrets.MAVEN_CENTRAL_PASSWORD }} \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 76ce07d..13be8f7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,105 +1,165 @@ -plugins { - val nmcpVersion = "1.2.0" - - id("com.gradleup.nmcp") version nmcpVersion - id("com.gradleup.nmcp.aggregation") version nmcpVersion - id("java-library") - id("maven-publish") - id("signing") - id("checkstyle") - id("gradlexbuild.module-mappings") -} +import java.util.Properties +import org.gradle.api.internal.project.ProjectInternal +import org.gradle.util.internal.VersionNumber -group = "org.gradlex" version = "0.2" -java { - toolchain.languageVersion = JavaLanguageVersion.of(17) - withSourcesJar() - withJavadocJar() -} - -tasks.compileJava { - options.release = 8 +dependencies { + compileOnly("org.apache.maven:maven-core:3.9.11") { + exclude("com.google.guava", "failureaccess") + exclude("com.google.guava", "guava") + exclude("com.google.inject", "guice") + exclude("javax.inject", "javax.inject") + exclude("org.apache.maven.resolver", "maven-resolver-api") + exclude("org.apache.maven.resolver", "maven-resolver-impl") + exclude("org.apache.maven.resolver", "maven-resolver-spi") + exclude("org.apache.maven.resolver", "maven-resolver-util") + exclude("org.apache.maven.shared", "maven-shared-utils") + exclude("org.apache.maven", "maven-artifact") + exclude("org.apache.maven", "maven-builder-support") + exclude("org.apache.maven", "maven-model-builder") + exclude("org.apache.maven", "maven-plugin-api") + exclude("org.apache.maven", "maven-repository-metadata") + exclude("org.apache.maven", "maven-resolver-provider") + exclude("org.apache.maven", "maven-settings-builder") + exclude("org.apache.maven", "maven-settings") + exclude("org.codehaus.plexus", "plexus-component-annotations") + exclude("org.eclipse.sisu", "org.eclipse.sisu.inject") + exclude("org.eclipse.sisu", "org.eclipse.sisu.plexus") + exclude("org.slf4j", "slf4j-api") + } + testImplementation("io.takari.maven.plugins:takari-plugin-integration-testing:3.1.1") { + exclude("com.google.guava", "failureaccess") + exclude("com.google.guava", "guava") + exclude("com.google.inject", "guice") + exclude("javax.inject", "javax.inject") + exclude("org.apache.maven.resolver", "maven-resolver-api") + exclude("org.apache.maven.resolver", "maven-resolver-impl") + exclude("org.apache.maven.resolver", "maven-resolver-spi") + exclude("org.apache.maven.resolver", "maven-resolver-util") + exclude("org.apache.maven.shared", "maven-shared-utils") + exclude("org.apache.maven", "maven-artifact") + exclude("org.apache.maven", "maven-builder-support") + exclude("org.apache.maven", "maven-model-builder") + exclude("org.apache.maven", "maven-plugin-api") + exclude("org.apache.maven", "maven-repository-metadata") + exclude("org.apache.maven", "maven-resolver-provider") + exclude("org.apache.maven", "maven-settings-builder") + exclude("org.apache.maven", "maven-settings") + exclude("org.codehaus.plexus", "plexus-component-annotations") + exclude("org.eclipse.sisu", "org.eclipse.sisu.inject") + exclude("org.eclipse.sisu", "org.eclipse.sisu.plexus") + exclude("org.slf4j", "slf4j-api") + exclude("org.slf4j", "slf4j-simple") + exclude("io.takari.m2e.workspace", "org.eclipse.m2e.workspace.cli") + } } -tasks.withType().configureEach { - options { - this as StandardJavadocDocletOptions - encoding = "UTF-8" - addStringOption("Xdoclint:all,-missing", "-quiet") - addStringOption("Xwerror", "-quiet") +publishingConventions { + mavenCentral { + displayName("Java Module Dependencies Maven Extension") + description("A Maven extension to use dependencies from module-info.java files.") + } + gitHub("https://github.com/gradlex-org/java-module-dependencies-maven-extension") + developer { + name = "Jendrik Johannes" + email = "jendrik@gradlex.org" } } -dependencies { - compileOnly("org.apache.maven:maven-core:3.9.11") +publishing { repositories.maven(layout.buildDirectory.dir("test-repo")) { name = "testRepo" } } - nmcpAggregation(project(path)) +tasks.test { dependsOn(tasks.named("publishAllPublicationsToTestRepoRepository")) } - testImplementation("org.assertj:assertj-core:3.27.6") - testImplementation("io.takari.maven.plugins:takari-plugin-integration-testing:3.1.1") -} +// update 'unique_modules.properties' +val detachedResolver: ProjectInternal.DetachedResolver = (project as ProjectInternal).newDetachedResolver() -publishing { - publications.create("maven") { - from(components["java"]) - pom { - name = "Java Module Dependencies Maven Extension" - description = "A Maven extension to use dependencies from module-info.java files." - url = "https://github.com/gradlex-org/java-module-dependencies-maven-extension" - licenses { - license { - name = "Apache License, Version 2.0" - url = "http://www.apache.org/licenses/LICENSE-2.0.txt" - } - } - scm { - connection = "scm:git:git://github.com/gradlex-org/java-module-dependencies-maven-extension.git" - developerConnection = "scm:git:git://github.com/gradlex-org/java-module-dependencies-maven-extension.git" - url = "https://github.com/gradlex-org/java-module-dependencies-maven-extension" - } - developers { - developer { - name = "Jendrik Johannes" - email = "jendrik@gradlex.org" - } - } - } - } - repositories.maven(layout.buildDirectory.dir("test-repo")) { - name = "testRepo" +detachedResolver.repositories.ivy { + name = "Modules Properties Repository" + url = project.uri("https://raw.githubusercontent.com/sormuras/modules/main/com.github.sormuras.modules") + metadataSources.artifact() + patternLayout { + artifact("[organisation]/[module].properties") + ivy("[module]/[revision]/ivy.xml") + setM2compatible(true) } } -signing { - if (providers.gradleProperty("sign").getOrElse("false").toBoolean()) { - useInMemoryPgpKeys( - providers.environmentVariable("SIGNING_KEY").getOrNull(), - providers.environmentVariable("SIGNING_PASSPHRASE").getOrNull() - ) - sign(publishing.publications["maven"]) - } -} +val modulePropertiesScope = detachedResolver.configurations.dependencyScope("moduleProperties") +val modulePropertiesPath = + detachedResolver.configurations.resolvable("modulePropertiesPath") { extendsFrom(modulePropertiesScope.get()) } +val dep = + detachedResolver.dependencies.add(modulePropertiesScope.name, "com.github.sormuras.modules:modules:1@properties") +(dep as ExternalModuleDependency).isChanging = true -nmcpAggregation { - centralPortal { - username = providers.environmentVariable("MAVEN_CENTRAL_USERNAME") - password = providers.environmentVariable("MAVEN_CENTRAL_PASSWORD") - publishingType = "AUTOMATIC" // "USER_MANAGED" +val updateUniqueModulesProperties = + tasks.register("updateUniqueModulesProperties") { + skipUpdate = providers.environmentVariable("CI").getOrElse("false").toBoolean() + modulesProperties.from(modulePropertiesPath) + uniqueModulesProperties = + layout.projectDirectory.file( + "src/main/resources/org/gradlex/maven/javamodule/dependencies/unique_modules.properties" + ) } + +sourceSets.main { + resources.setSrcDirs( + listOf( + updateUniqueModulesProperties.map { + it.uniqueModulesProperties + .get() + .asFile + .parentFile + .parentFile + .parentFile + .parentFile + .parentFile + .parentFile + } + ) + ) } -testing.suites.named("test") { - useJUnitJupiter() - targets.configureEach { - testTask { - dependsOn(tasks.named("publishAllPublicationsToTestRepoRepository")) +abstract class UniqueModulesPropertiesUpdate : DefaultTask() { + + @get:Inject abstract val layout: ProjectLayout + + @get:Input abstract val skipUpdate: Property + + @get:InputFiles abstract val modulesProperties: ConfigurableFileCollection + + @get:OutputFile abstract val uniqueModulesProperties: RegularFileProperty + + @TaskAction + fun convert() { + if (skipUpdate.get()) { + return } + + val modulesToRepoLocation = Properties() + modulesToRepoLocation.load(modulesProperties.singleFile.inputStream()) + val modules = + modulesToRepoLocation + .toSortedMap { e1, e2 -> e1.toString().compareTo(e2.toString()) } + .map { entry -> + val split = entry.value.toString().split("/") + val group = split.subList(4, split.size - 3).joinToString(".") + val name = + split[split.size - 3] + // Special handling of "wrong" entries + .replace("-debug-jdk18on", "-jdk18on") + val version = split[split.size - 2] + Module(entry.key.toString(), "$group:$name", version) + } + .groupBy { it.ga } + .values + .map { moduleList -> moduleList.maxBy { VersionNumber.parse(it.version) } } + .sortedBy { it.name } + + val modulesToCoordinates = modules.map { "${it.name}=${it.ga}\n" } + uniqueModulesProperties.get().asFile.writeText(modulesToCoordinates.joinToString("").trim()) } -} -checkstyle { - configDirectory = layout.projectDirectory.dir("gradle/checkstyle") + data class Module(val name: String, val ga: String, val version: String) } diff --git a/gradle/checkstyle/checkstyle.xml b/gradle/checkstyle/checkstyle.xml deleted file mode 100644 index 987e06d..0000000 --- a/gradle/checkstyle/checkstyle.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - diff --git a/gradle/checkstyle/header.txt b/gradle/checkstyle/header.txt deleted file mode 100644 index 4fe8a00..0000000 --- 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 0000000..20fe571 --- /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.gradle.kts b/gradle/plugins/build.gradle.kts deleted file mode 100644 index bc0172f..0000000 --- a/gradle/plugins/build.gradle.kts +++ /dev/null @@ -1,3 +0,0 @@ -plugins { - `kotlin-dsl` -} diff --git a/gradle/plugins/settings.gradle.kts b/gradle/plugins/settings.gradle.kts deleted file mode 100644 index a43c869..0000000 --- a/gradle/plugins/settings.gradle.kts +++ /dev/null @@ -1,3 +0,0 @@ -dependencyResolutionManagement { - repositories.gradlePluginPortal() -} diff --git a/gradle/plugins/src/main/kotlin/gradlexbuild.module-mappings.gradle.kts b/gradle/plugins/src/main/kotlin/gradlexbuild.module-mappings.gradle.kts deleted file mode 100644 index 7d5ab1f..0000000 --- a/gradle/plugins/src/main/kotlin/gradlexbuild.module-mappings.gradle.kts +++ /dev/null @@ -1,39 +0,0 @@ -import gradlexbuild.UniqueModulesPropertiesUpdate -import org.gradle.api.internal.project.ProjectInternal - -plugins { - id("java") -} - -val detachedResolver: ProjectInternal.DetachedResolver = (project as ProjectInternal).newDetachedResolver() -detachedResolver.repositories.ivy { - name = "Modules Properties Repository" - url = project.uri("https://raw.githubusercontent.com/sormuras/modules/main/com.github.sormuras.modules") - metadataSources.artifact() - patternLayout { - artifact("[organisation]/[module].properties") - ivy("[module]/[revision]/ivy.xml") - setM2compatible(true) - } -} -val modulePropertiesScope = detachedResolver.configurations.dependencyScope("moduleProperties") -val modulePropertiesPath = detachedResolver.configurations.resolvable("modulePropertiesPath") { - extendsFrom(modulePropertiesScope.get()) -} -val dep = detachedResolver.dependencies.add(modulePropertiesScope.name, "com.github.sormuras.modules:modules:1") -(dep as ExternalModuleDependency).isChanging = true - -val updateUniqueModulesProperties = tasks.register("updateUniqueModulesProperties") { - skipUpdate.set(providers.environmentVariable("CI").getOrElse("false").toBoolean()) - modulesProperties.from(modulePropertiesPath) - uniqueModulesProperties.set(layout.projectDirectory.file( - "src/main/resources/org/gradlex/maven/javamodule/dependencies/unique_modules.properties") - ) -} - -sourceSets.main { - resources.setSrcDirs(listOf(updateUniqueModulesProperties.map { - it.uniqueModulesProperties.get().asFile.parentFile.parentFile.parentFile.parentFile.parentFile.parentFile - })) -} - diff --git a/gradle/plugins/src/main/kotlin/gradlexbuild/UniqueModulesPropertiesUpdate.kt b/gradle/plugins/src/main/kotlin/gradlexbuild/UniqueModulesPropertiesUpdate.kt deleted file mode 100644 index b169f20..0000000 --- a/gradle/plugins/src/main/kotlin/gradlexbuild/UniqueModulesPropertiesUpdate.kt +++ /dev/null @@ -1,55 +0,0 @@ -package gradlexbuild - -import org.gradle.api.DefaultTask -import org.gradle.api.file.ConfigurableFileCollection -import org.gradle.api.file.ProjectLayout -import org.gradle.api.file.RegularFileProperty -import org.gradle.api.provider.Property -import org.gradle.api.tasks.Input -import org.gradle.api.tasks.InputFiles -import org.gradle.api.tasks.OutputFile -import org.gradle.api.tasks.TaskAction -import org.gradle.util.internal.VersionNumber -import java.util.Properties -import javax.inject.Inject - -abstract class UniqueModulesPropertiesUpdate : DefaultTask() { - - @get:Inject - abstract val layout: ProjectLayout - - @get:Input - abstract val skipUpdate: Property - - @get:InputFiles - abstract val modulesProperties: ConfigurableFileCollection - - @get:OutputFile - abstract val uniqueModulesProperties: RegularFileProperty - - @TaskAction - fun convert() { - if (skipUpdate.get()) { - return - } - - val modulesToRepoLocation = Properties() - modulesToRepoLocation.load(modulesProperties.singleFile.inputStream()) - val modules = modulesToRepoLocation.toSortedMap { e1, e2 -> e1.toString().compareTo(e2.toString()) }.map { entry -> - val split = entry.value.toString().split("/") - val group = split.subList(4, split.size - 3).joinToString(".") - val name = split[split.size - 3] - // Special handling of "wrong" entries - .replace("-debug-jdk18on", "-jdk18on") - val version = split[split.size - 2] - Module(entry.key.toString(), "$group:$name", version) - }.groupBy { it.ga }.values.map { moduleList -> - moduleList.maxBy { VersionNumber.parse(it.version) } - }.sortedBy { it.name } - - val modulesToCoordinates = modules.map { "${it.name}=${it.ga}\n" } - uniqueModulesProperties.get().asFile.writeText(modulesToCoordinates.joinToString("").trim()) - } - - data class Module(val name: String, val ga: String, val version: String) -} \ No newline at end of file diff --git a/gradle/verification-keyring.keys b/gradle/verification-keyring.keys new file mode 100644 index 0000000..1617e53 --- /dev/null +++ b/gradle/verification-keyring.keys @@ -0,0 +1,1711 @@ +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----- + +mQINBFrKW9IBEACkqUvM7hU1WqOOeb1gZ7pUsRliHuoUvYIrd+hdp+qhPmJ0NG0W +YhZK5UtJBmqvtHKRkbwYxUuya9zlBmCfQFf0GpFKJ65JSrPSkZADI3aZ4aUkxIUw +nIRoUHucmr10Xftpebr/zaJk5oR8RdaL5FapapmcZmAaHR9CDWB8XtI318u314jq +M5rKatnAZMERoPugOvvuAOz4bfZKwdfCmZKfYUM/TMSrSinXrGExSW6z4RhtqmpC +E5M/7OoVfvDynVJKqNazqgigpmMNhOyzAhQsiKh1K0akyxTZbjeZKsdYfhCXvq0q +k9+KM/cTllQ54MPnFWiObLkHeK0Waw8bI/vAJ4h4x/XM9iGYpkXv7F2/FVsHQdPe +YJcwD/CkD8KHyiPaRKMeApiUtZsdAHU0L4X/lNmcooea/7ipskruUgwcm+RdLhRZ +P949t1e7nqDZfpEHy90NiFxmlRAPSNqBLwefxY/hwBgog2jabDALJVcLCMosFWPj +MQhFlGSIODiVcW8folGIjzkyNZbNMWkwnl2QnWp/h2TAwYQJOMqcv2MG9o5pyzpx +97Iz1ngq1FlM/gJnGnNUydP2tAjT2L2U3MP1uX/EdRChdgPqdolqYhdFfwCr0Fpf +W527bUZpReHCEiQ29ABSnQ711mO+d9+qM6edRyHUoBWz89IHt8sCunuvNwARAQAB +tB1NYXJjIFBoaWxpcHAgPG1hcmNAanVuaXQub3JnPrkCDQRaylvSARAAnQG636wl +iEOLkXN662OZS6Qz2+cFltCWboq9oX9FnA1PHnTY2cAtwS214RfWZxkjg6Stau+d +1Wb8TsF/SUN3eKRSyrkAxlX0v552vj3xmmfNsslQX47e6aEWZ0du0M8jw7/f7Qxp +0InkBfpQwjSg4ECoH4cA6dOFJIdxBv8dgS4K90HNuIHa+QYfVSVMjGwOjD9St6Pw +kbg1sLedITRo59Bbv0J14nE9LdWbCiwNrkDr24jTewdgrDaCpN6msUwcH1E0nYxu +KAetHEi2OpgBhaY3RQ6QPQB6NywvmD0xRllMqu4hSp70pHFtm8LvJdWOsJ5we3Ki +jHuZzEbBVTTl+2DhNMI0KMoh+P/OmyNOfWD8DL4NO3pVv+mPDZn82/eZ3XY1/oSQ +rpyJaCBjRKasVTtfiA/FgYqTml6qZMjy6iywg84rLezELgcxHHvjhAKd4CfxyuCC +gnGT0iRLFZKw44ZmOUqPDkyvGRddIyHag1K7UaM/2UMn6iPMy7XWcaFiH5Huhz43 +SiOdsWGuwNk4dDxHdxmzSjps0H5dkfCciOFhEc54AFcGEXCWHXuxVqIq/hwqTmVl +1RY+PTcQUIOfx36WW1ixJQf8TpVxUbooK8vr1jOFF6khorDXoZDJNhI2VKomWp8Y +38EPGyiUPZNcnmSiezx+MoQwAbeqjFMKG7UAEQEAAYkCNgQYAQgAIBYhBP9uLAAZ +SMXy84sMw4WRH0JexhtRBQJaylvSAhsMAAoJEIWRH0JexhtR0LEP/RvYGlaokoos +AYI5vNORAiYEc1Ow2McPI1ZafHhcVxZhlwF48dAC2bYcasDX/PbEdcD6pwo8ZU8e +I8Ht0VpRQxeV/sP01m2YEpAuyZ6jI7IQQCGcwQdN4qzQJxMAASl9JlplH2NniXV1 +/994FOtesT59ePMyexm57lzhYXP1PGcdt8dH37r6z3XQu0lHRG/KBn7YhyA3zwJc +no324KdBRJiynlc7uqQq+ZptU9fR1+Nx0uoWZoFMsrQUmY34aAOPJu7jGMTG+Vse +MH6vDdNhhZs9JOlD/e/VaF7NyadjOUD4j/ud7c0z2EwqjDKMFTHGbIdawT/7jart +T+9yGUO+EmScBMiMuJUTdCP4YDh3ExRdqefEBff3uE/rAP73ndNYdIVq9U0gY0uS +NCD9JPfj4aCN52y9a2pS7Dg7KB/Z8SH1R9IWP+t0HvVtAILdsLExNFTedJGHRh7u +aC7pwRz01iivmtAKYICzruqlJie/IdEFFK/sus6fZek29odTrQxx42HGHO5GCNyE +dK9jKVAeuZ10vcaNbuBpiP7sf8/BsiEU4wHE8gjFeUPRiSjnERgXQwfJosLgf/K/ +SShQn2dCkYZRNF+SWJ6Z2tQxcW5rpUjtclV/bRVkUX21EYfwA6SMB811mI7AVy8W +PXCe8La72ukmaxEGbpJ8mdzS2PJko7mm +=Xe8l +-----END PGP PUBLIC KEY BLOCK----- + +pub E2F38302C8075E3D +uid Gradle Inc. + +sub 1B80C80E07BC7190 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQINBGOtCzoBEAC7hGOPLFnfvQKzCZpJb3QYq8X9OiUL4tVa5mG0lDTeBBiuQCDy +Iyhpo8IypllGG6Wxj6ZJbhuHXcnXSu/atmtrnnjARMvDnQ20jX77B+g39ZYuqxgw +F/EkDYC6gtNUqzJ8IcxFMIQT+J6LCd3a/eTJWwDLUwSnGXVUPTXzYf4laSVdBDVp +jp6K+tDHQrLZ140DY4GSvT1SzcgR5+5C1Mda3XobIJNHe47AeZPzKuFzZSlKqvrX +QNexgGGjrEDWt9I3CXeNoOVVZvI2k6jAvUSZb+jN/YWpW+onDeV1S/7AUBaKE2TE +EJtidYIOuFsufSwLURwX0um17M47sgzxov9vZYDucGntZn4zKYcZsdkTTkrrgU7N +RSu90mqdL7rCxkUPsSeEUWFyhleGB108QBa5HiE/Z5T5C94kxD9JV1HAocFraTaZ +SrNr0dBvZH7SoLCUQZ6q3gXebLbLQgDSuApjn523927O1wdnig+xDgAqTP14sw9i +9OfvpNhCSolFL7mjGYKGfzTFo4pj5CzoKvvAXcsWY4HvwslWJvmrEqvo8Ss+YTII +fiRSL4DWurT+42yOoExPwcYNofNwEuyYy5Zr9edsXeodScvy/hlri3JuB3Ji142w +xFCuKUfrAh7hOw6QOXgIFyFXWrW0HH/8IoeJjxvG+6euxkGx8QZutyaY6wARAQAB +tClHcmFkbGUgSW5jLiA8bWF2ZW4tcHVibGlzaGluZ0BncmFkbGUuY29tPrkCDQRj +rQs6ARAA0lHRI+3c947M+BDmwHTV52ZyecwJKhOM2xrVPeLF3QbcQ9RfvuXUzRNG +QlcCS7WZ2L8WF2MBwRAweWVku56Ey/a15IF6Qz+VhlS02CDIhoz5Fbtn1mWe/E7u +CiH0Z5FnVKDENoO2DWfHFVONHGZZOt7UXbe04e9YPiv0SlnaoezStJWrmpWoSvhp +aXndEBKNU36xITYE9CVAsFs7jOKlhw8rO4rRfvsSybD0sEv8AFKr7Fqhs1v9Sq2G +28YCl+L266i9455OCB73CgLm9LnIS7/SkeUKbFU/Ok5jgd1rAAJT3aLFv2oQHNv1 +8ogsb+SRKPGKRKwWeU0oFMu5STQAUtCVFQnlAqvwAGdk0nDsEV/GlwnmAEn0RzmQ +olq1suZzBhp11bONjDCDC/Xfh69+wQghU9xm8PFjk3hpXhPdrHneXQQIzj8kFj/i +L2MRe8zsjbOOkQFZSX4Nxt91cBAUICcC0pf7FGKkh3vULm28SNH4jLEyXWev+X27 +F1ZzGxnuJEA2Ww04MpaLYh3zAjDXn4G9PsgOhcPhB0Hjf7/wLaXKU9MNdgDqZpTc +uPsz0BPAIu94LSXk0aYrqG95NfycLyx3pgdeArcQRohwMmBwoz6kz8kFCIpI/kfJ +nnBv+tEX0phntx1ux6bfdOwTRHHOLOFfbryTxyCXWUv4JrUqeVUAEQEAAYkCNgQY +AQgAIBYhBBvZemoVTngQ7gvIMuLzgwLIB149BQJjrQs6AhsMAAoJEOLzgwLIB149 +GQIQAKQzVDHOR+2bJubwvRe9QmQTtvWqzLomFT/5OqB1myR7ulVjlPXJ/xSp13CB +eh/VnGlf5bIQEcRrLl1sL1tzD+/WyDVwbsTmKzHNnRBl6EUemMk6rPDZkLpnXVnk +wGWtQ1ywJulPyqcrlO2koXyaDXHUjovqSysiSbzPOcxmGHgNnN8A/vuVWqhVeKba +muHZG8DX/SkijzZ99FZtgWghWh8ke2t0yU2Q6z6PqOzI++TpQrEs/1GRTDr+Q5z1 +PHTnj+4mnrV16nsyoVcyenW1IMT4fiEQzn4vi8kke92FIFvyRw38gJHhz5rJkhln +lu4Q7FpYIsATVTiIxKji8obDFfmlx5ydvBdubkIXJzniEyBWEe3/jvw+uGhKto8d +p10NFEVNQgmSNo5XKH1E0jlSw4GivJnHOWK7Nsm3DmIw1bSgrMH08CK8xDhuzBP6 +KR579xs8AZcVCO8aeXeWULCx0RMB71ayN0McSYdnjUxjKYN42XSe/3z2LmeRWbwC +5eQPcNtod5Trst/qKFsIe1+YldZTUkoBn7dZoUkb9zXMoCFZMbDE83TqEw6fhqIa +DOlScluOcSGxB7csvW8grbyyITjkl1yDd02c/Pk9cETneAhbAvBHtmi+smE00g8g +/i1danrgyl+bfzJ3oAOdqBLBVl2su65IPU8GcH+05MAumsm3 +=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----- + +xsFNBGL4BxIBEAC+lX44fd/zrVQPzdKygarBd/X0bBpGakT++Kfk4UBGl3q+wd2G +R9puB9R377ds8hU7U3To8sHguUZo6DbD9Gb/is/WajSb9g92z+rMow3KbqfCYqWr +kaIj27OJgbziFcnMAtvGoFRfaPI/7TOwEw3jT7B87RXeiATX4iL8fzMUmkfZm0Hk +qjnepMQeaz3KzMY4DfBcI45kwzl3EIBFIlk428mhBU5iAAANoyPsimfqEPRCUDjx +vT8g7PvpkBdNZgRS6R9vLxyzKi/f5KswZIMvop/pRXIhAKDhCCyr2GD+T3JoIKp9 +kvS1MQucWeX8+TFWh5qEA3e06Xu0JSdPCEej0BH06EiTMsAOU5bWqgLAO9DVpS32 +I092KAuMJlEPCnz7IGXVkeNY5KYrlsmoKrBO3GF/zsCyiZDvSULkVJcrtBCYOrgq +HRIzvJWQaTJ5V15MD8CZIELyjCGZ8Jy8hdZpaTjYalw0bUq+yRAqMD5slp6A1tnv +jyqVTgU+yRGq2HB90vJ0D3P1w4xRDuNF8c02futO415Yc/qkyh3/5AjGSoocrlfX +cMreJXpQWVsvXn3NsitjsA6XOJpMOgipCDxfvn8SSLl9fWNJf55j7fCkBokF/lIi +81RVQbyjVCOV0OEqHJLP9asPHyAFvUppNWtcvViPxVmb52djnw/x/61WVQARAQAB +tDVUYXR1IFNhbG9yYW50YSAoY293dG93bmNvZGVyKSA8dGF0dS5zYWxvcmFudGFA +aWtpLmZpPs7BTQRi+AcSARAAsKXGqznhDeU87UA073pnPg12bloq5h79U8iZozoV +NIRhjMxJyilOlWZVCIOWEDWJJ1Dnzn/9OaYEJrBIY4yPDQQ9wsrOklUOsDpZAPiq +QyrP3V8MibbWBPhBvyDM48GVtg2xedB5Jk9lSv6BYUUn9D2q/nG1UP5jSwFQu7nm +VgVV5XXs6lb5N7Q2GGXn/U/EJX/ffS1VxYIjM0Ra8yy3HdihBwF+LHuuRU8SHxWG +Aq7IRSCg0YuCFjc0KrT1e5m/eMF2NFcLHuZjBII5onhj4wRmJ3tiVNMWDQcbZctc +t2ng13MTZTa3EvwJHvQKlgGFOGoLaHAnn29abeUN5YtKoNz7FSgyealg3Hm/pIHF +Lh4LcBxQlSAqEFDLL/aeRf5Fi9/PzlnE0dpUOLRnqxNnZpcqhVru5qRC3JAH10qS +aG2ZbVG6fAjuu/YNJZPjiVkpsXXZVcm3VwhWgHjikG9MKEDpEdb6NrSR8hphq9tB +HmvlF/pHS6I1UMGAqiAnb5yuGKR7oaU+XK85OpaIX2aQTzB3aUexUEGXkBFuRG3B +TX6FBMLIG9qpBvoUCC+UO8EWox5Bmht1roWNsRMqB7i0m9tIT+YSNrobcbMFJf/i +Do42bQwo8y8+fUPgA5A2WDPjzd3kdFCQ6mCpcuPSk7s9t8y5bjYzcKqPCtMtOVxg +kDMAEQEAAcLBfAQYAQgAJhYhBCgRjAcMsioBdaLo1D0SyirBnzGBBQJi+AcSAhsM +BQkJZgGAAAoJED0SyirBnzGBkG0P/28WaiFCKz2vOqFxC6tfRPjhU7wilUM4KIYm +ij0uh8dq4Lbz0tmybzvq15QL0QBciPLF+w6tHXnmT9KV3n4nY6X4ys9W4VvFn+0V +OkDinNBMpfP2KglWYoJ9Q8yZRda9pq5GWtFUTS44fOj/2NU+2YawIkdDzb/vixID +bD2y/E7ta8lpfL1hXZaLONFvMZXj9ZwVNfTloXjj1PVWDfNHgQ+Yo9gp9CwsSUHc +jTqVQ9Nz92HGrpPThzlQnflFV9gO1cHpl2+MEQy+fYAH0hsmCx2KgBdVyWzl5IXk +z0bLbcV0SJM7wP4I6ZkJoqDVN1IYjGdRCZGyeNpaBT7+2KZW5gV6DACiRdeNNvrD +lbrAtRVCzEELaWbwv24KG6hKnU84WWvx6ygOOQRaXGkzvNIybaPJImUe4p38F9YA +Rq2IMF4rMYomDyOclcAL2E3DZ1NZw/VZOYsk4MdATQRtYSz2mQbZGGqw5lKNCsmH +9GPJkGZne1NJzh6bXZEfucjQ+cjtvf8Bn7HtSnmXETRoHGEBShsO9hw4mLDhC4os +LBaslDFjyxMECWr3v7TuEmEmNcD+KwNyACFNuBjEBWeuJZYwCkAkVy8AyitrTMh8 +/CPhk/tPm26c+KI5BJsQg8V34FMtd+trRhXRG2mfPB2cU2t9Il7Tlzi71iGEafIb +96Um/Inf +=Evfn +-----END PGP PUBLIC KEY BLOCK----- + +pub 199C76080F8A18BE +uid Open Source + +sub E3461D2D16725F94 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=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----- + +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 +=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 9EB80E92EB2135B1 +uid Slawomir Jaranowski + +sub E3F6790A5A167F5A +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=RJbM +-----END PGP PUBLIC KEY BLOCK----- + +pub CA80D1F0EB6CA4BA +sub 5EAB8AD72016DF52 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=nwzN +-----END PGP PUBLIC KEY BLOCK----- diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml new file mode 100644 index 0000000..b2fa7e0 --- /dev/null +++ b/gradle/verification-metadata.xml @@ -0,0 +1,160 @@ + + + + false + true + armored + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/settings.gradle.kts b/settings.gradle.kts index 9e944d9..c543fe8 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,21 +1,3 @@ -pluginManagement { - includeBuild("gradle/plugins") -} -plugins { - id("com.gradle.develocity") version "4.2.1" -} - -dependencyResolutionManagement { - repositories { - mavenCentral() - } -} +plugins { id("org.gradlex.internal-build-conventions") version "0.8" } rootProject.name = "java-module-dependencies-maven-extension" - -develocity { - buildScan { - termsOfUseUrl = "https://gradle.com/help/legal-terms-of-use" - termsOfUseAgree = "yes" - } -} diff --git a/src/main/java/org/gradlex/maven/javamodule/dependencies/ConfigurationUtil.java b/src/main/java/org/gradlex/maven/javamodule/dependencies/ConfigurationUtil.java index 851ba71..8c78c13 100644 --- a/src/main/java/org/gradlex/maven/javamodule/dependencies/ConfigurationUtil.java +++ b/src/main/java/org/gradlex/maven/javamodule/dependencies/ConfigurationUtil.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.maven.javamodule.dependencies; +import java.util.List; +import java.util.Map; +import java.util.Optional; import org.apache.maven.model.Dependency; import org.apache.maven.model.DependencyManagement; import org.apache.maven.project.MavenProject; @@ -25,27 +13,129 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.List; -import java.util.Map; -import java.util.Optional; - class ConfigurationUtil { private static final Logger LOGGER = LoggerFactory.getLogger(ConfigurationUtil.class); - static void addDependenciesForModuleInfo(String from, List dependencies, ModuleInfo mainModuleInfo, ModuleInfo testModuleInfo, List managed, Map moduleNameToLocal, Map localTestMappings, Map localMappings, Interpolator interpolator) { - mainModuleInfo.get(ModuleInfo.Directive.REQUIRES).forEach(d -> addDependency(from, dependencies, managed, moduleNameToLocal, localTestMappings, localMappings, "compile", d, interpolator)); // should be "runtime" in consumer BOM - mainModuleInfo.get(ModuleInfo.Directive.REQUIRES_TRANSITIVE).forEach(d -> addDependency(from, dependencies, managed, moduleNameToLocal, localTestMappings, localMappings, "compile", d, interpolator)); - mainModuleInfo.get(ModuleInfo.Directive.REQUIRES_STATIC).forEach(d -> addDependency(from, dependencies, managed, moduleNameToLocal, localTestMappings, localMappings, "provided", d, interpolator)); - mainModuleInfo.get(ModuleInfo.Directive.REQUIRES_STATIC_TRANSITIVE).forEach(d -> addDependency(from, dependencies, managed, moduleNameToLocal, localTestMappings, localMappings, "compile", d, interpolator)); // should be "???" in consumer BOM + static void addDependenciesForModuleInfo( + String from, + List dependencies, + ModuleInfo mainModuleInfo, + ModuleInfo testModuleInfo, + List managed, + Map moduleNameToLocal, + Map localTestMappings, + Map localMappings, + Interpolator interpolator) { + mainModuleInfo + .get(ModuleInfo.Directive.REQUIRES) + .forEach(d -> addDependency( + from, + dependencies, + managed, + moduleNameToLocal, + localTestMappings, + localMappings, + "compile", + d, + interpolator)); // should be "runtime" in consumer BOM + mainModuleInfo + .get(ModuleInfo.Directive.REQUIRES_TRANSITIVE) + .forEach(d -> addDependency( + from, + dependencies, + managed, + moduleNameToLocal, + localTestMappings, + localMappings, + "compile", + d, + interpolator)); + mainModuleInfo + .get(ModuleInfo.Directive.REQUIRES_STATIC) + .forEach(d -> addDependency( + from, + dependencies, + managed, + moduleNameToLocal, + localTestMappings, + localMappings, + "provided", + d, + interpolator)); + mainModuleInfo + .get(ModuleInfo.Directive.REQUIRES_STATIC_TRANSITIVE) + .forEach(d -> addDependency( + from, + dependencies, + managed, + moduleNameToLocal, + localTestMappings, + localMappings, + "compile", + d, + interpolator)); // should be "???" in consumer BOM - testModuleInfo.get(ModuleInfo.Directive.REQUIRES).forEach(d -> addDependency(from, dependencies, managed, moduleNameToLocal, localTestMappings, localMappings, "test", d, interpolator)); - testModuleInfo.get(ModuleInfo.Directive.REQUIRES_TRANSITIVE).forEach(d -> addDependency(from, dependencies, managed, moduleNameToLocal, localTestMappings, localMappings, "test", d, interpolator)); - testModuleInfo.get(ModuleInfo.Directive.REQUIRES_STATIC).forEach(d -> addDependency(from, dependencies, managed, moduleNameToLocal, localTestMappings, localMappings, "test", d, interpolator)); - testModuleInfo.get(ModuleInfo.Directive.REQUIRES_STATIC_TRANSITIVE).forEach(d -> addDependency(from, dependencies, managed, moduleNameToLocal, localTestMappings, localMappings, "test", d, interpolator)); + testModuleInfo + .get(ModuleInfo.Directive.REQUIRES) + .forEach(d -> addDependency( + from, + dependencies, + managed, + moduleNameToLocal, + localTestMappings, + localMappings, + "test", + d, + interpolator)); + testModuleInfo + .get(ModuleInfo.Directive.REQUIRES_TRANSITIVE) + .forEach(d -> addDependency( + from, + dependencies, + managed, + moduleNameToLocal, + localTestMappings, + localMappings, + "test", + d, + interpolator)); + testModuleInfo + .get(ModuleInfo.Directive.REQUIRES_STATIC) + .forEach(d -> addDependency( + from, + dependencies, + managed, + moduleNameToLocal, + localTestMappings, + localMappings, + "test", + d, + interpolator)); + testModuleInfo + .get(ModuleInfo.Directive.REQUIRES_STATIC_TRANSITIVE) + .forEach(d -> addDependency( + from, + dependencies, + managed, + moduleNameToLocal, + localTestMappings, + localMappings, + "test", + d, + interpolator)); } - private static void addDependency(String from, List dependencies, List managed, Map moduleNameToLocal, Map moduleNameToLocalTest, Map localMappings, String scope, String moduleName, Interpolator interpolator) { + private static void addDependency( + String from, + List dependencies, + List managed, + Map moduleNameToLocal, + Map moduleNameToLocalTest, + Map localMappings, + String scope, + String moduleName, + Interpolator interpolator) { if (JDKInfo.MODULES.contains(moduleName)) { return; } @@ -87,8 +177,9 @@ private static void addDependency(String from, List dependencies, Li throw new RuntimeException(e); } - Optional version = - managed.stream().filter(v -> v.getGroupId().equals(group) && v.getArtifactId().equals(artifact)).findFirst(); + Optional version = managed.stream() + .filter(v -> v.getGroupId().equals(group) && v.getArtifactId().equals(artifact)) + .findFirst(); if (!version.isPresent()) { LOGGER.warn("Version missing: {}", externalModule); return; @@ -96,7 +187,13 @@ private static void addDependency(String from, List dependencies, Li defineDependency(dependencies, scope, group, artifact, version.get().getVersion(), classifier); } - private static void defineDependency(List dependencies, String scope, String group, String artifactId, String version, String classifier) { + private static void defineDependency( + List dependencies, + String scope, + String group, + String artifactId, + String version, + String classifier) { Dependency dependency = new Dependency(); dependency.setGroupId(group); dependency.setArtifactId(artifactId); diff --git a/src/main/java/org/gradlex/maven/javamodule/dependencies/JDKInfo.java b/src/main/java/org/gradlex/maven/javamodule/dependencies/JDKInfo.java index 4b02629..1562b98 100644 --- a/src/main/java/org/gradlex/maven/javamodule/dependencies/JDKInfo.java +++ b/src/main/java/org/gradlex/maven/javamodule/dependencies/JDKInfo.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.maven.javamodule.dependencies; import java.util.Arrays; @@ -82,6 +67,5 @@ interface JDKInfo { "jdk.unsupported", "jdk.unsupported.desktop", "jdk.xml.dom", - "jdk.zipfs" - ); + "jdk.zipfs"); } diff --git a/src/main/java/org/gradlex/maven/javamodule/dependencies/JavaModuleDependenciesLifecycleParticipant.java b/src/main/java/org/gradlex/maven/javamodule/dependencies/JavaModuleDependenciesLifecycleParticipant.java index d3d3996..120b022 100644 --- a/src/main/java/org/gradlex/maven/javamodule/dependencies/JavaModuleDependenciesLifecycleParticipant.java +++ b/src/main/java/org/gradlex/maven/javamodule/dependencies/JavaModuleDependenciesLifecycleParticipant.java @@ -1,33 +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.maven.javamodule.dependencies; -import org.apache.maven.AbstractMavenLifecycleParticipant; -import org.apache.maven.MavenExecutionException; -import org.apache.maven.execution.MavenSession; -import org.apache.maven.model.Dependency; -import org.apache.maven.project.MavenProject; -import org.codehaus.plexus.interpolation.Interpolator; -import org.codehaus.plexus.interpolation.PropertiesBasedValueSource; -import org.codehaus.plexus.interpolation.StringSearchInterpolator; -import org.codehaus.plexus.interpolation.ValueSource; +import static org.gradlex.maven.javamodule.dependencies.ConfigurationUtil.addDependenciesForModuleInfo; +import static org.gradlex.maven.javamodule.dependencies.ConfigurationUtil.collectManagedDependencies; -import javax.inject.Named; -import javax.inject.Singleton; import java.io.File; import java.io.IOException; import java.nio.file.Files; @@ -36,9 +12,17 @@ import java.util.List; import java.util.Map; import java.util.Properties; - -import static org.gradlex.maven.javamodule.dependencies.ConfigurationUtil.addDependenciesForModuleInfo; -import static org.gradlex.maven.javamodule.dependencies.ConfigurationUtil.collectManagedDependencies; +import javax.inject.Named; +import javax.inject.Singleton; +import org.apache.maven.AbstractMavenLifecycleParticipant; +import org.apache.maven.MavenExecutionException; +import org.apache.maven.execution.MavenSession; +import org.apache.maven.model.Dependency; +import org.apache.maven.project.MavenProject; +import org.codehaus.plexus.interpolation.Interpolator; +import org.codehaus.plexus.interpolation.PropertiesBasedValueSource; +import org.codehaus.plexus.interpolation.StringSearchInterpolator; +import org.codehaus.plexus.interpolation.ValueSource; @Singleton @Named("java-module-dependencies") @@ -49,7 +33,8 @@ public class JavaModuleDependenciesLifecycleParticipant extends AbstractMavenLif @Override public void afterProjectsRead(MavenSession session) throws MavenExecutionException { List projects = session.getAllProjects(); - Map localMappings = loadLocalMappings(session.getRequest().getMultiModuleProjectDirectory()); + Map localMappings = + loadLocalMappings(session.getRequest().getMultiModuleProjectDirectory()); for (MavenProject project : projects) { try { @@ -64,7 +49,7 @@ public void afterProjectsRead(MavenSession session) throws MavenExecutionExcepti collectManagedDependencies(project, managedDependencies); addDependenciesForModuleInfo( - project.getGroupId() + ":" + project.getArtifactId() + ":" +project.getVersion(), + project.getGroupId() + ":" + project.getArtifactId() + ":" + project.getVersion(), project.getDependencies(), moduleInfoCache.getMain(project), moduleInfoCache.getTest(project), @@ -94,12 +79,12 @@ private Map loadLocalMappings(File root) { private Interpolator interpolator(MavenProject project) { StringSearchInterpolator interpolator = new StringSearchInterpolator(); - ValueSource allProperties = new PropertiesBasedValueSource(project.getModel().getProperties()); + ValueSource allProperties = + new PropertiesBasedValueSource(project.getModel().getProperties()); interpolator.addValueSource(allProperties); return interpolator; } @Override - public void afterSessionEnd(MavenSession session) { - } + public void afterSessionEnd(MavenSession session) {} } diff --git a/src/main/java/org/gradlex/maven/javamodule/dependencies/MavenModuleInfoCache.java b/src/main/java/org/gradlex/maven/javamodule/dependencies/MavenModuleInfoCache.java index aa13035..6befb5c 100644 --- a/src/main/java/org/gradlex/maven/javamodule/dependencies/MavenModuleInfoCache.java +++ b/src/main/java/org/gradlex/maven/javamodule/dependencies/MavenModuleInfoCache.java @@ -1,23 +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.maven.javamodule.dependencies; -import org.apache.maven.project.MavenProject; -import org.gradlex.maven.javamodule.dependencies.internal.utils.ModuleInfo; +import static java.nio.charset.StandardCharsets.UTF_8; import java.io.File; import java.io.IOException; @@ -28,8 +12,8 @@ import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream; - -import static java.nio.charset.StandardCharsets.UTF_8; +import org.apache.maven.project.MavenProject; +import org.gradlex.maven.javamodule.dependencies.internal.utils.ModuleInfo; public class MavenModuleInfoCache { private final Map mainModuleInfos = new HashMap<>(); @@ -42,26 +26,32 @@ public void put(MavenProject project) throws IOException { List compileSourceRoots = project.getCompileSourceRoots(); List testCompileSourceRoots = project.getTestCompileSourceRoots(); List altTestCompileSourceRoots = project.getTestCompileSourceRoots().stream() - .map(location -> location + "9").collect(Collectors.toList()); + .map(location -> location + "9") + .collect(Collectors.toList()); Optional mainModuleInfo = compileSourceRoots.stream() .map(src -> new File(src, "module-info.java")) - .filter(File::exists).findFirst(); - Optional testModuleInfo = Stream.concat(testCompileSourceRoots.stream(), altTestCompileSourceRoots.stream()) + .filter(File::exists) + .findFirst(); + Optional testModuleInfo = Stream.concat( + testCompileSourceRoots.stream(), altTestCompileSourceRoots.stream()) .map(src -> new File(src, "module-info.java")) - .filter(File::exists).findFirst(); + .filter(File::exists) + .findFirst(); if (mainModuleInfo.isPresent()) { String content = new String(Files.readAllBytes(mainModuleInfo.get().toPath()), UTF_8); ModuleInfo moduleInfo = new ModuleInfo(content); mainModuleInfos.put(toCoordinates(project), moduleInfo); - mainModuleNameToCoordinates.put(moduleInfo.getModuleName(), toCoordinates(project) + ":" + project.getVersion()); + mainModuleNameToCoordinates.put( + moduleInfo.getModuleName(), toCoordinates(project) + ":" + project.getVersion()); } if (testModuleInfo.isPresent()) { String content = new String(Files.readAllBytes(testModuleInfo.get().toPath()), UTF_8); ModuleInfo moduleInfo = new ModuleInfo(content); testModuleInfos.put(toCoordinates(project), moduleInfo); - testModuleNameToCoordinates.put(moduleInfo.getModuleName(), toCoordinates(project) + ":" + project.getVersion()); + testModuleNameToCoordinates.put( + moduleInfo.getModuleName(), toCoordinates(project) + ":" + project.getVersion()); } } diff --git a/src/main/java/org/gradlex/maven/javamodule/dependencies/SharedMappings.java b/src/main/java/org/gradlex/maven/javamodule/dependencies/SharedMappings.java index 74b3581..3b6b7b3 100644 --- a/src/main/java/org/gradlex/maven/javamodule/dependencies/SharedMappings.java +++ b/src/main/java/org/gradlex/maven/javamodule/dependencies/SharedMappings.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.maven.javamodule.dependencies; import java.io.IOException; @@ -24,7 +9,7 @@ /** * Class copied without modification. */ -final public class SharedMappings { +public final class SharedMappings { public static Map mappings = loadModuleNameToGAProperties(); static Map loadModuleNameToGAProperties() { @@ -37,16 +22,18 @@ public synchronized Object put(Object key, Object value) { return super.put(key, value); } }; - @SuppressWarnings({ "unchecked", "rawtypes" }) + @SuppressWarnings({"unchecked", "rawtypes"}) Map propertiesAsMap = (Map) properties; - try (InputStream coordinatesFile = JavaModuleDependenciesLifecycleParticipant.class.getResourceAsStream("unique_modules.properties")) { + try (InputStream coordinatesFile = + JavaModuleDependenciesLifecycleParticipant.class.getResourceAsStream("unique_modules.properties")) { properties.load(coordinatesFile); } catch (IOException e) { throw new RuntimeException(e); } - try (InputStream coordinatesFile = JavaModuleDependenciesLifecycleParticipant.class.getResourceAsStream("modules.properties")) { + try (InputStream coordinatesFile = + JavaModuleDependenciesLifecycleParticipant.class.getResourceAsStream("modules.properties")) { properties.load(coordinatesFile); } catch (IOException e) { throw new RuntimeException(e); @@ -54,5 +41,5 @@ public synchronized Object put(Object key, Object value) { return propertiesAsMap; } - private SharedMappings() { } + private SharedMappings() {} } diff --git a/src/main/java/org/gradlex/maven/javamodule/dependencies/internal/utils/ModuleInfo.java b/src/main/java/org/gradlex/maven/javamodule/dependencies/internal/utils/ModuleInfo.java index 91a8220..aceb195 100644 --- a/src/main/java/org/gradlex/maven/javamodule/dependencies/internal/utils/ModuleInfo.java +++ b/src/main/java/org/gradlex/maven/javamodule/dependencies/internal/utils/ModuleInfo.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.maven.javamodule.dependencies.internal.utils; import java.io.Serializable; @@ -85,7 +70,8 @@ private boolean parse(String moduleLine, boolean insideComment) { .replace("{", "") .replace("}", "") .replaceAll("/\\*.*?\\*/", " ") - .trim().split("\\s+")); + .trim() + .split("\\s+")); int singleLineCommentStartIndex = tokens.indexOf("//"); if (singleLineCommentStartIndex >= 0) { tokens = tokens.subList(0, singleLineCommentStartIndex); @@ -126,12 +112,6 @@ public boolean equals(Object o) { @Override public int hashCode() { return Objects.hash( - moduleName, - requires, - requiresTransitive, - requiresStatic, - requiresStaticTransitive, - requiresRuntime - ); + moduleName, requires, requiresTransitive, requiresStatic, requiresStaticTransitive, requiresRuntime); } } diff --git a/src/main/resources/org/gradlex/maven/javamodule/dependencies/unique_modules.properties b/src/main/resources/org/gradlex/maven/javamodule/dependencies/unique_modules.properties index f357832..8d230f0 100644 --- a/src/main/resources/org/gradlex/maven/javamodule/dependencies/unique_modules.properties +++ b/src/main/resources/org/gradlex/maven/javamodule/dependencies/unique_modules.properties @@ -6784,6 +6784,7 @@ org.opendaylight.netconf.common=org.opendaylight.netconf:netconf-common org.opendaylight.netconf.common.mdsal=org.opendaylight.netconf:netconf-common-mdsal org.opendaylight.netconf.databind=org.opendaylight.netconf:databind org.opendaylight.netconf.dom.api=org.opendaylight.netconf:netconf-dom-api +org.opendaylight.netconf.rfc8639=org.opendaylight.netconf:rfc8639-impl org.opendaylight.netconf.sal.remote.impl=org.opendaylight.netconf:sal-remote-impl org.opendaylight.netconf.transport.api=org.opendaylight.netconf:transport-api org.opendaylight.netconf.transport.ssh=org.opendaylight.netconf:transport-ssh diff --git a/src/test/java/org/gradlex/maven/javamodule/dependencies/test/ModuleInfoParseTest.java b/src/test/java/org/gradlex/maven/javamodule/dependencies/test/ModuleInfoParseTest.java index 0e4f619..d99920c 100644 --- a/src/test/java/org/gradlex/maven/javamodule/dependencies/test/ModuleInfoParseTest.java +++ b/src/test/java/org/gradlex/maven/javamodule/dependencies/test/ModuleInfoParseTest.java @@ -1,36 +1,22 @@ -/* - * 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.maven.javamodule.dependencies.test; -import org.gradlex.maven.javamodule.dependencies.internal.utils.ModuleInfo; -import org.junit.jupiter.api.Test; - import static org.assertj.core.api.Assertions.assertThat; import static org.gradlex.maven.javamodule.dependencies.internal.utils.ModuleInfo.Directive.REQUIRES; import static org.gradlex.maven.javamodule.dependencies.internal.utils.ModuleInfo.Directive.REQUIRES_RUNTIME; -import static org.gradlex.maven.javamodule.dependencies.internal.utils.ModuleInfo.Directive.REQUIRES_TRANSITIVE; import static org.gradlex.maven.javamodule.dependencies.internal.utils.ModuleInfo.Directive.REQUIRES_STATIC; import static org.gradlex.maven.javamodule.dependencies.internal.utils.ModuleInfo.Directive.REQUIRES_STATIC_TRANSITIVE; +import static org.gradlex.maven.javamodule.dependencies.internal.utils.ModuleInfo.Directive.REQUIRES_TRANSITIVE; + +import org.gradlex.maven.javamodule.dependencies.internal.utils.ModuleInfo; +import org.junit.jupiter.api.Test; class ModuleInfoParseTest { @Test void ignores_single_line_comments() { - var moduleInfo = new ModuleInfo(""" + var moduleInfo = new ModuleInfo( + """ module some.thing { // requires com.bla.blub; requires transitive foo.bar.la; @@ -46,7 +32,8 @@ void ignores_single_line_comments() { @Test void ignores_single_line_comments_late_in_line() { - var moduleInfo = new ModuleInfo(""" + var moduleInfo = new ModuleInfo( + """ module some.thing { // module some.thing.else requires transitive foo.bar.la; }"""); @@ -61,7 +48,8 @@ void ignores_single_line_comments_late_in_line() { @Test void ignores_multi_line_comments() { - var moduleInfo = new ModuleInfo(""" + var moduleInfo = new ModuleInfo( + """ module some.thing { /* requires com.bla.blub; requires transitive foo.bar.la; @@ -79,7 +67,8 @@ void ignores_multi_line_comments() { @Test void ignores_multi_line_comments_between_keywords() { - var moduleInfo = new ModuleInfo(""" + var moduleInfo = new ModuleInfo( + """ module some.thing { /*odd comment*/ requires transitive foo.bar.la; requires/* weird comment*/ static foo.bar.lo; diff --git a/src/test/java/org/gradlex/maven/javamodule/dependencies/test/ModuleNameMappingTest.java b/src/test/java/org/gradlex/maven/javamodule/dependencies/test/ModuleNameMappingTest.java index 3bb6860..7ccfc64 100644 --- a/src/test/java/org/gradlex/maven/javamodule/dependencies/test/ModuleNameMappingTest.java +++ b/src/test/java/org/gradlex/maven/javamodule/dependencies/test/ModuleNameMappingTest.java @@ -1,26 +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.maven.javamodule.dependencies.test; +import static org.assertj.core.api.Assertions.assertThat; + import org.gradlex.maven.javamodule.dependencies.test.fixture.MavenBuild; import org.junit.jupiter.api.Test; -import static org.assertj.core.api.Assertions.assertThat; - class ModuleNameMappingTest { MavenBuild build = new MavenBuild(); @@ -28,7 +13,8 @@ class ModuleNameMappingTest { @Test void can_require_other_local_module() { build.libModuleInfoFile.writeText("module org.example.lib { }"); - build.appModuleInfoFile.writeText(""" + build.appModuleInfoFile.writeText( + """ module org.example.app { requires org.example.lib; }"""); @@ -36,17 +22,17 @@ void can_require_other_local_module() { build.verify(); var result = build.dependencyTree(); - assertThat(result.getLog()).contains( - "[INFO] org.example:app:jar:1.0", - "[INFO] \\- org.example:lib:jar:1.0:compile" - ); + assertThat(result.getLog()) + .contains("[INFO] org.example:app:jar:1.0", "[INFO] \\- org.example:lib:jar:1.0:compile"); } @Test void can_add_custom_mapping_via_properties_file_in_default_location() { var modulesPropertiesFile = build.file(".mvn/modules.properties"); modulesPropertiesFile.writeText("jakarta.mail=com.sun.mail:jakarta.mail"); - build.rootPom.replaceText("", """ + build.rootPom.replaceText( + "", + """ @@ -59,7 +45,8 @@ void can_add_custom_mapping_via_properties_file_in_default_location() { """); - build.appModuleInfoFile.writeText(""" + build.appModuleInfoFile.writeText( + """ module org.example.app { requires jakarta.mail; }"""); @@ -67,21 +54,22 @@ void can_add_custom_mapping_via_properties_file_in_default_location() { build.verify(); var result = build.dependencyTree(); - assertThat(result.getLog()).contains( - "[INFO] org.example:app:jar:1.0", - "[INFO] \\- com.sun.mail:jakarta.mail:jar:2.0.1:compile", - "[INFO] \\- com.sun.activation:jakarta.activation:jar:2.0.1:compile" - ); + assertThat(result.getLog()) + .contains( + "[INFO] org.example:app:jar:1.0", + "[INFO] \\- com.sun.mail:jakarta.mail:jar:2.0.1:compile", + "[INFO] \\- com.sun.activation:jakarta.activation:jar:2.0.1:compile"); result = build.exec(); - assertThat(result.getLog()).contains( - "Module Path: classes,jakarta.mail-2.0.1.jar,jakarta.activation-2.0.1.jar" - ); + assertThat(result.getLog()) + .contains("Module Path: classes,jakarta.mail-2.0.1.jar,jakarta.activation-2.0.1.jar"); } @Test void versions_can_be_imported() { - build.rootPom.replaceText("", """ + build.rootPom.replaceText( + "", + """ @@ -95,7 +83,8 @@ void versions_can_be_imported() { """); - build.appModuleInfoFile.writeText(""" + build.appModuleInfoFile.writeText( + """ module org.example.app { requires org.slf4j; }"""); @@ -103,28 +92,24 @@ void versions_can_be_imported() { build.verify(); var result = build.dependencyTree(); - assertThat(result.getLog()).contains( - "[INFO] org.example:app:jar:1.0", - "[INFO] \\- org.slf4j:slf4j-api:jar:1.7.30:compile" - ); + assertThat(result.getLog()) + .contains("[INFO] org.example:app:jar:1.0", "[INFO] \\- org.slf4j:slf4j-api:jar:1.7.30:compile"); result = build.exec(); - assertThat(result.getLog()).contains( - "Module Path: classes,slf4j-api-1.7.30.jar" - ); + assertThat(result.getLog()).contains("Module Path: classes,slf4j-api-1.7.30.jar"); } @Test void ignores_jdk_modules() { - build.appModuleInfoFile.writeText(""" + build.appModuleInfoFile.writeText( + """ module org.example.app { requires java.desktop; }"""); var result = build.verify(); - assertThat(result.getLog()).doesNotContain( - "[WARNING] Mapping missing in '.mvn/modules.properties': java.desktop" - ); + assertThat(result.getLog()) + .doesNotContain("[WARNING] Mapping missing in '.mvn/modules.properties': java.desktop"); } } diff --git a/src/test/java/org/gradlex/maven/javamodule/dependencies/test/WarningsTest.java b/src/test/java/org/gradlex/maven/javamodule/dependencies/test/WarningsTest.java index 4cc654b..710ba6c 100644 --- a/src/test/java/org/gradlex/maven/javamodule/dependencies/test/WarningsTest.java +++ b/src/test/java/org/gradlex/maven/javamodule/dependencies/test/WarningsTest.java @@ -1,39 +1,27 @@ -/* - * 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.maven.javamodule.dependencies.test; +import static org.assertj.core.api.Assertions.assertThat; + import org.gradlex.maven.javamodule.dependencies.test.fixture.MavenBuild; import org.junit.jupiter.api.Test; -import static org.assertj.core.api.Assertions.assertThat; - class WarningsTest { MavenBuild build = new MavenBuild(); @Test void prints_warning_for_missing_mapping() { - build.appModuleInfoFile.writeText(""" + build.appModuleInfoFile.writeText( + """ module org.my.app { requires commons.math3; }"""); // Manually add dependency so that build does not fail - build.appPomFile.replaceText("", """ + build.appPomFile.replaceText( + "", + """ org.apache.commons diff --git a/src/test/java/org/gradlex/maven/javamodule/dependencies/test/fixture/Directory.java b/src/test/java/org/gradlex/maven/javamodule/dependencies/test/fixture/Directory.java index bbe06f1..a32486f 100644 --- a/src/test/java/org/gradlex/maven/javamodule/dependencies/test/fixture/Directory.java +++ b/src/test/java/org/gradlex/maven/javamodule/dependencies/test/fixture/Directory.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.maven.javamodule.dependencies.test.fixture; import java.io.IOException; diff --git a/src/test/java/org/gradlex/maven/javamodule/dependencies/test/fixture/Io.java b/src/test/java/org/gradlex/maven/javamodule/dependencies/test/fixture/Io.java index 125fcc0..0aaab3f 100644 --- a/src/test/java/org/gradlex/maven/javamodule/dependencies/test/fixture/Io.java +++ b/src/test/java/org/gradlex/maven/javamodule/dependencies/test/fixture/Io.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.maven.javamodule.dependencies.test.fixture; import java.io.IOException; @@ -21,8 +6,7 @@ class Io { - private Io() { - } + private Io() {} static T unchecked(IoSupplier supplier) { try { diff --git a/src/test/java/org/gradlex/maven/javamodule/dependencies/test/fixture/MavenBuild.java b/src/test/java/org/gradlex/maven/javamodule/dependencies/test/fixture/MavenBuild.java index 0c96065..3708a53 100644 --- a/src/test/java/org/gradlex/maven/javamodule/dependencies/test/fixture/MavenBuild.java +++ b/src/test/java/org/gradlex/maven/javamodule/dependencies/test/fixture/MavenBuild.java @@ -1,25 +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.maven.javamodule.dependencies.test.fixture; import io.takari.maven.testing.executor.MavenExecution; import io.takari.maven.testing.executor.MavenExecutionResult; import io.takari.maven.testing.executor.MavenRuntime; - import java.io.File; import java.io.IOException; import java.nio.file.Files; @@ -47,7 +31,8 @@ public MavenBuild() { var appClass = new WritableFile(projectDir.dir("app/src/main/java"), "org/example/app/App.java"); - appClass.writeText(""" + appClass.writeText( + """ package org.example.app; import java.io.File; import java.util.Arrays; @@ -61,7 +46,8 @@ public static void main(String[] args) { } """); - rootPom.writeText(""" + rootPom.writeText( + """ 4.0.0 test-project @@ -95,7 +81,8 @@ public static void main(String[] args) { """); - appPomFile.writeText(""" + appPomFile.writeText( + """ 4.0.0 @@ -125,7 +112,8 @@ public static void main(String[] args) { """); - libPomFile.writeText(""" + libPomFile.writeText( + """ 4.0.0 @@ -167,7 +155,9 @@ public MavenExecutionResult dependencyTree() { public MavenExecution runner() { try { - return builder.withCliOptions("-B", "-U", "-ntp").build().forProject(projectDir.getAsPath().toFile()); + return builder.withCliOptions("-B", "-U", "-ntp") + .build() + .forProject(projectDir.getAsPath().toFile()); } catch (Exception e) { throw new RuntimeException(e); } diff --git a/src/test/java/org/gradlex/maven/javamodule/dependencies/test/fixture/WritableFile.java b/src/test/java/org/gradlex/maven/javamodule/dependencies/test/fixture/WritableFile.java index b2a5e8d..1ef407d 100644 --- a/src/test/java/org/gradlex/maven/javamodule/dependencies/test/fixture/WritableFile.java +++ b/src/test/java/org/gradlex/maven/javamodule/dependencies/test/fixture/WritableFile.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.maven.javamodule.dependencies.test.fixture; import java.nio.file.Files; @@ -29,12 +14,14 @@ public WritableFile(Path file) { } public WritableFile(Directory parent, String filePath) { - this.file = Io.unchecked(() -> Files.createDirectories(parent.getAsPath().resolve(filePath).getParent())) + this.file = Io.unchecked(() -> Files.createDirectories( + parent.getAsPath().resolve(filePath).getParent())) .resolve(Path.of(filePath).getFileName()); } public WritableFile writeText(String text) { - Io.unchecked(() -> Files.writeString(file, text, StandardOpenOption.CREATE, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING)); + Io.unchecked(() -> Files.writeString( + file, text, StandardOpenOption.CREATE, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING)); return this; }