diff --git a/.github/workflows/migrations.yml b/.github/workflows/migrations.yml
new file mode 100644
index 0000000..6175191
--- /dev/null
+++ b/.github/workflows/migrations.yml
@@ -0,0 +1,53 @@
+---
+name: Update the Old GroupId migrations CSV
+
+on:
+ workflow_dispatch: {}
+ schedule:
+ - cron: 0 11 * * WED
+
+jobs:
+ update-migrations:
+ runs-on: ubuntu-latest
+ steps:
+ # Checkout and build parser
+ - name: Checkout
+ uses: actions/checkout@v4
+ - uses: actions/setup-java@v4
+ with:
+ cache: 'gradle'
+ distribution: 'temurin'
+ java-version: '17'
+ - name: Setup Gradle
+ uses: gradle/gradle-build-action@v2
+ - name: Run build with Gradle Wrapper
+ run: ./gradlew build deps
+
+ # Update migrations
+ - name: Checkout oga-maven-plugin
+ uses: actions/checkout@v4
+ with:
+ repository: jonathanlermitage/oga-maven-plugin
+ path: oga-maven-plugin
+ - name: Update migrations
+ run: java -classpath "build/deps/*:build/libs/*" org.openrewrite.java.dependencies.oldgroupids.ParseDefinitionMigrations oga-maven-plugin src/main/resources/migrations.csv
+
+ # Create pull request
+ - name: Timestamp
+ run: echo "NOW=$(date +'%Y-%m-%dT%H%M')" >> $GITHUB_ENV
+ - name: Create Pull Request
+ id: cpr
+ uses: peter-evans/create-pull-request@v5
+ with:
+ base: main
+ branch: migrations/${{ env.NOW }}
+ title: "[Auto] Old GroupId migrations as of ${{ env.NOW }}"
+ body: |
+ [Auto] Old GroupId migrations as of ${{ env.NOW }}.
+ commit-message: "[Auto] Old GroupId migrations as of ${{ env.NOW }}"
+ labels: enhancement
+ - name: Check outputs
+ if: ${{ steps.cpr.outputs.pull-request-number }}
+ run: |
+ echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}"
+ echo "Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}"
diff --git a/build.gradle.kts b/build.gradle.kts
index d64a26f..a3e89ea 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -55,3 +55,7 @@ tasks {
into("build/deps")
}
}
+
+license {
+ exclude("**/*.json")
+}
diff --git a/src/main/java/org/openrewrite/java/dependencies/RelocatedDependencyCheck.java b/src/main/java/org/openrewrite/java/dependencies/RelocatedDependencyCheck.java
new file mode 100644
index 0000000..528b1d7
--- /dev/null
+++ b/src/main/java/org/openrewrite/java/dependencies/RelocatedDependencyCheck.java
@@ -0,0 +1,252 @@
+/*
+ * Copyright 2024 the original author or authors.
+ *
+ * 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
+ *
+ * https://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.openrewrite.java.dependencies;
+
+import com.fasterxml.jackson.databind.MappingIterator;
+import com.fasterxml.jackson.dataformat.csv.CsvMapper;
+import lombok.Value;
+import org.openrewrite.*;
+import org.openrewrite.groovy.GroovyIsoVisitor;
+import org.openrewrite.groovy.tree.G;
+import org.openrewrite.internal.StringUtils;
+import org.openrewrite.internal.lang.Nullable;
+import org.openrewrite.java.MethodMatcher;
+import org.openrewrite.java.dependencies.oldgroupids.Migration;
+import org.openrewrite.java.tree.Expression;
+import org.openrewrite.java.tree.J;
+import org.openrewrite.marker.SearchResult;
+import org.openrewrite.maven.MavenIsoVisitor;
+import org.openrewrite.xml.XPathMatcher;
+import org.openrewrite.xml.tree.Xml;
+
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+public class RelocatedDependencyCheck extends ScanningRecipe {
+ @Override
+ public String getDisplayName() {
+ return "Find relocated dependencies";
+ }
+
+ @Override
+ public String getDescription() {
+ //language=markdown
+ return "Find Maven and Gradle dependencies and Maven plugins that have relocated to a new `groupId` or `artifactId`. " +
+ "Relocation information comes from the [oga-maven-plugin](https://github.com/jonathanlermitage/oga-maven-plugin/) " +
+ "maintained by Jonathan Lermitage, Filipe Roque and others.";
+ }
+
+ @Value
+ public static class Accumulator {
+ Map migrations;
+ }
+
+ @Value
+ static class GroupArtifact {
+ String groupId;
+ @Nullable
+ String artifactId;
+ }
+
+ @Value
+ static class Relocation {
+ GroupArtifact to;
+ String context;
+ }
+
+ @Override
+ public Accumulator getInitialValue(ExecutionContext ctx) {
+ try {
+ MappingIterator objectMappingIterator = new CsvMapper()
+ .readerWithSchemaFor(Migration.class)
+ .readValues(RelocatedDependencyCheck.class.getResourceAsStream("/migrations.csv"));
+ Map migrations = new HashMap<>();
+ while (objectMappingIterator.hasNext()) {
+ Migration def = objectMappingIterator.next();
+ GroupArtifact oldGav = new GroupArtifact(def.getOldGroupId(), StringUtils.isBlank(def.getOldArtifactId()) ? null : def.getOldArtifactId());
+ GroupArtifact newGav = new GroupArtifact(def.getNewGroupId(), StringUtils.isBlank(def.getNewArtifactId()) ? null : def.getNewArtifactId());
+ migrations.put(oldGav, new Relocation(newGav, StringUtils.isBlank(def.getContext()) ? null : def.getContext()));
+ }
+ return new Accumulator(migrations);
+ } catch (IOException e) {
+ throw new UncheckedIOException(e);
+ }
+ }
+
+ @Override
+ public TreeVisitor, ExecutionContext> getScanner(Accumulator acc) {
+ return TreeVisitor.noop();
+ }
+
+ @Override
+ public TreeVisitor, ExecutionContext> getVisitor(Accumulator acc) {
+ return new TreeVisitor() {
+ private final TreeVisitor, ExecutionContext> gradleVisitor = gradleVisitor(acc);
+ private final TreeVisitor, ExecutionContext> mavenVisitor = mavenVisitor(acc);
+
+ @Override
+ public @Nullable Tree visit(@Nullable Tree tree, ExecutionContext ctx) {
+
+ if (!(tree instanceof SourceFile)) {
+ return tree;
+ }
+ SourceFile s = (SourceFile) tree;
+ if (gradleVisitor.isAcceptable(s, ctx)) {
+ s = (SourceFile) gradleVisitor.visitNonNull(s, ctx);
+ } else if (mavenVisitor.isAcceptable(s, ctx)) {
+ s = (SourceFile) mavenVisitor.visitNonNull(s, ctx);
+ }
+ return s;
+ }
+ };
+ }
+
+ private TreeVisitor, ExecutionContext> gradleVisitor(Accumulator acc) {
+ MethodMatcher dependencyMatcher = new MethodMatcher("DependencyHandlerSpec *(..)");
+ return new GroovyIsoVisitor() {
+ @Override
+ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) {
+ J.MethodInvocation mi = super.visitMethodInvocation(method, ctx);
+ if (dependencyMatcher.matches(mi)) {
+ List methodArguments = mi.getArguments();
+ Expression firstMethodArgument = methodArguments.get(0);
+ if (firstMethodArgument instanceof J.Literal) {
+ J.Literal literal = (J.Literal) firstMethodArgument;
+ mi = searchInLiteral(literal, mi);
+ } else if (firstMethodArgument instanceof G.GString) {
+ G.GString gString = (G.GString) firstMethodArgument;
+ List strings = gString.getStrings();
+ if (!strings.isEmpty() && strings.get(0) instanceof J.Literal) {
+ mi = searchInLiteral((J.Literal) strings.get(0), mi);
+ }
+ } else if (firstMethodArgument instanceof G.MapEntry) {
+ mi = searchInGMapEntry(methodArguments, mi);
+ }
+
+ }
+ return mi;
+ }
+
+ private J.MethodInvocation searchInLiteral(J.Literal literal, J.MethodInvocation mi) {
+ String gav = (String) literal.getValue();
+ assert gav != null;
+ String[] parts = gav.split(":");
+ if (gav.length() >= 2) {
+ mi = maybeAddComment(acc, mi, parts[0], parts[1]);
+ }
+ return mi;
+ }
+
+ private J.MethodInvocation searchInGMapEntry(List methodArguments, J.MethodInvocation mi) {
+ String groupId = null;
+ String artifactId = null;
+ for (Expression e : methodArguments) {
+ if (!(e instanceof G.MapEntry)) {
+ continue;
+ }
+ G.MapEntry arg = (G.MapEntry) e;
+ if (!(arg.getKey() instanceof J.Literal)) {
+ continue;
+ }
+ J.Literal key = (J.Literal) arg.getKey();
+ Expression argValue = arg.getValue();
+ String valueValue = null;
+ if (argValue instanceof J.Literal) {
+ J.Literal value = (J.Literal) argValue;
+ if (value.getValue() instanceof String) {
+ valueValue = (String) value.getValue();
+ }
+ } else if (argValue instanceof J.Identifier) {
+ J.Identifier value = (J.Identifier) argValue;
+ valueValue = value.getSimpleName();
+ } else if (argValue instanceof G.GString) {
+ G.GString value = (G.GString) argValue;
+ List strings = value.getStrings();
+ if (!strings.isEmpty() && strings.get(0) instanceof G.GString.Value) {
+ G.GString.Value versionGStringValue = (G.GString.Value) strings.get(0);
+ if (versionGStringValue.getTree() instanceof J.Identifier) {
+ valueValue = ((J.Identifier) versionGStringValue.getTree()).getSimpleName();
+ }
+ }
+ }
+ if (!(key.getValue() instanceof String)) {
+ continue;
+ }
+ String keyValue = (String) key.getValue();
+ if ("group".equals(keyValue)) {
+ groupId = valueValue;
+ } else if ("name".equals(keyValue)) {
+ artifactId = valueValue;
+ }
+ }
+ if (groupId != null) {
+ mi = maybeAddComment(acc, mi, groupId, artifactId);
+ }
+ return mi;
+ }
+
+ };
+ }
+
+ private static TreeVisitor, ExecutionContext> mavenVisitor(Accumulator acc) {
+ final XPathMatcher dependencyMatcher = new XPathMatcher("//dependencies/dependency");
+ return new MavenIsoVisitor() {
+ @Override
+ public Xml.Tag visitTag(Xml.Tag tag, ExecutionContext ctx) {
+ tag = super.visitTag(tag, ctx);
+ Optional optionalGroupId = tag.getChildValue("groupId");
+ Optional optionalArtifactId = tag.getChildValue("artifactId");
+ if (dependencyMatcher.matches(getCursor())) {
+ if (optionalGroupId.isPresent()) {
+ String groupId = optionalGroupId.get();
+ String artifactId = optionalArtifactId.orElse(null);
+ tag = maybeAddComment(acc, tag, groupId, artifactId);
+ }
+ } else if (isPluginTag()) {
+ if (optionalArtifactId.isPresent()) {
+ String groupId = tag.getChildValue("groupId").orElse("org.apache.maven.plugins");
+ String artifactId = optionalArtifactId.get();
+ tag = maybeAddComment(acc, tag, groupId, artifactId);
+ }
+ }
+ return tag;
+ }
+
+ };
+ }
+
+ private static T maybeAddComment(Accumulator acc, T tree, String groupId, @Nullable String artifactId) {
+ Relocation relocation = acc.getMigrations().get(new GroupArtifact(groupId, artifactId));
+ if (relocation != null) {
+ String commentText = String.format("Relocated to %s%s%s",
+ relocation.getTo().getGroupId(),
+ Optional.ofNullable(relocation.getTo().getArtifactId()).map(a -> ":" + a).orElse(""),
+ relocation.getContext() == null ? "" : " as per \"" + relocation.getContext() + "\"");
+ return SearchResult.found(tree, commentText);
+ }
+ if (artifactId == null) {
+ return tree;
+ }
+ // Try again without artifactId
+ return maybeAddComment(acc, tree, groupId, null);
+ }
+}
+
+
diff --git a/src/main/java/org/openrewrite/java/dependencies/oldgroupids/Migration.java b/src/main/java/org/openrewrite/java/dependencies/oldgroupids/Migration.java
new file mode 100644
index 0000000..98b9a1f
--- /dev/null
+++ b/src/main/java/org/openrewrite/java/dependencies/oldgroupids/Migration.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2024 the original author or authors.
+ *
+ * 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
+ *
+ * https://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.openrewrite.java.dependencies.oldgroupids;
+
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import org.openrewrite.internal.lang.Nullable;
+
+@Data
+@AllArgsConstructor
+@JsonPropertyOrder({"oldGroupId", "oldArtifactId", "newGroupId", "newArtifactId", "context"})
+public class Migration {
+ String oldGroupId;
+ @Nullable
+ String oldArtifactId;
+ String newGroupId;
+ @Nullable
+ String newArtifactId;
+ @Nullable
+ String context;
+}
diff --git a/src/main/java/org/openrewrite/java/dependencies/oldgroupids/ParseDefinitionMigrations.java b/src/main/java/org/openrewrite/java/dependencies/oldgroupids/ParseDefinitionMigrations.java
new file mode 100644
index 0000000..fce5a73
--- /dev/null
+++ b/src/main/java/org/openrewrite/java/dependencies/oldgroupids/ParseDefinitionMigrations.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright 2024 the original author or authors.
+ *
+ * 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
+ *
+ * https://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.openrewrite.java.dependencies.oldgroupids;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.MapperFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectWriter;
+import com.fasterxml.jackson.dataformat.csv.CsvFactory;
+import com.fasterxml.jackson.dataformat.csv.CsvMapper;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import lombok.Data;
+import org.openrewrite.internal.lang.Nullable;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+
+public class ParseDefinitionMigrations {
+ public static void main(String[] args) throws IOException {
+ if (args.length != 2) {
+ System.err.println("Usage: ParseDefinitionMigrations ");
+ System.exit(1);
+ }
+ File repo = new File(args[0]);
+ if (!repo.isDirectory() || !repo.canRead()) {
+ System.err.println("oga-maven-plugin repo " + repo + " not readable");
+ System.exit(1);
+ }
+ File csv = new File(args[1]);
+ if (!csv.createNewFile() && !csv.canWrite()) {
+ System.err.println("CSV " + csv + " not writable");
+ System.exit(1);
+ }
+
+ parseDefinitionMigrations(repo, csv);
+ }
+
+ static void parseDefinitionMigrations(File repo, File csv) throws IOException {
+ ObjectMapper objectMapper = getObjectMapper();
+
+ Path uc = repo.toPath().resolve("uc");
+ File official = uc.resolve("og-definitions.json").toFile();
+ File unofficial = uc.resolve("og-unofficial-definitions.json").toFile();
+
+ List definitions = objectMapper.readValue(official, Definitions.class).getMigration();
+ List proposed = objectMapper.readValue(unofficial, UnofficialDefinitions.class).getMigration();
+
+ List migrations = new ArrayList<>(definitions.size() + proposed.size());
+ for (DefinitionMigration d : definitions) {
+ migrations.add(getMigration(d.getOldGav(), d.getNewGav(), d.getContext()));
+ }
+ for (ProposedMigration p : proposed) {
+ migrations.add(getMigration(p.getOldGav(), p.getProposal().get(0), p.getContext()));
+ }
+
+ ObjectWriter objectWriter = getObjectWriter();
+ objectWriter.writeValue(csv, migrations);
+ }
+
+ private static Migration getMigration(String oldGav1, String newGav1, String context) {
+ String[] oldGav = oldGav1.split(":");
+ String[] newGav = newGav1.split(":");
+ return new Migration(
+ oldGav[0], oldGav.length > 1 ? oldGav[1] : null,
+ newGav[0], newGav.length > 1 ? newGav[1] : null,
+ context);
+ }
+
+ private static ObjectMapper getObjectMapper() {
+ return new ObjectMapper()
+ .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
+ .registerModule(new JavaTimeModule());
+ }
+
+ private static ObjectWriter getObjectWriter() {
+ CsvFactory factory = new CsvFactory();
+ factory.configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false);
+ CsvMapper csvMapper = CsvMapper.builder(factory)
+ .disable(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY)
+ .build();
+ return csvMapper.writer(csvMapper.schemaFor(Migration.class));
+ }
+}
+
+/**
+ * Mirrors Definitions.kt
+ */
+@Data
+class Definitions {
+ List migration;
+}
+
+@Data
+class DefinitionMigration {
+ @JsonProperty("old")
+ String oldGav;
+ @JsonProperty("new")
+ String newGav;
+ @Nullable
+ String context;
+}
+
+@Data
+class UnofficialDefinitions {
+ List migration;
+}
+
+@Data
+class ProposedMigration {
+ @JsonProperty("old")
+ String oldGav;
+ List proposal;
+ @Nullable
+ String context;
+}
diff --git a/src/main/resources/migrations.csv b/src/main/resources/migrations.csv
new file mode 100644
index 0000000..f7a6592
--- /dev/null
+++ b/src/main/resources/migrations.csv
@@ -0,0 +1,547 @@
+acegisecurity,,org.acegisecurity,,
+activation,activation,javax.activation,activation,
+ant,ant,org.apache.ant,ant,
+antlr,antlr,org.antlr,antlr,
+asm,,org.ow2.asm,,"The group id of ASM 4.0 is ""org.ow2.asm"", which is changed
+from 3.X. See https://gitlab.ow2.org/asm/asm/-/issues/316288"
+aspectj,,org.aspectj,,
+axis,,org.apache.axis,,
+bcel,bcel,org.apache.bcel,bcel,
+bouncycastle,,org.bouncycastle,,
+bsh,bsh,org.beanshell,bsh,
+c3p0,c3p0,com.mchange,c3p0,
+cactus,cactus-ant,cactus,cactus-ant-13,
+clover,clover,com.cenqua.clover,clover,
+cobertura,,"net.sourceforge.cobertura",,
+com.actionbarsherlock,library,com.actionbarsherlock,actionbarsherlock,
+com.aoindustries,ao-web-page,com.semanticcms,semanticcms-core-model,
+com.aoindustries,ao-web-page-servlet,com.semanticcms,semanticcms-core-servlet,
+com.aoindustries,ao-web-page-taglib,com.semanticcms,semanticcms-core-taglib,
+com.aoindustries,ao-web-sitemap-servlet,com.semanticcms,semanticcms-core-sitemap,
+com.aoindustries,semanticcms-core-model,com.semanticcms,semanticcms-core-model,
+com.aoindustries,semanticcms-core-servlet,com.semanticcms,semanticcms-core-servlet,
+com.avanza.astrix,astrix-provider,com.avanza.astrix,astrix-core,
+com.cloudbees.thirdparty,vijava,com.vmware,vijava,
+com.code-spotter,codespotter-maven-plugin,com.coverity,ondemand-maven-plugin,
+com.coronaide.lockdown,,"org.starchartlabs.lockdown",,
+com.datastax.cassandra,cassandra-driver-core,com.datastax.oss,java-driver-core,
+com.datastax.dse,dse-java-driver-core,com.datastax.oss,java-driver-core,
+com.datastax.dse,"dse-java-driver-core-shaded",com.datastax.oss,java-driver-core-shaded,
+com.datastax.dse,"dse-java-driver-mapper-processor",com.datastax.oss,"java-driver-mapper-processor",
+com.datastax.dse,"dse-java-driver-mapper-runtime",com.datastax.oss,"java-driver-mapper-runtime",
+com.datastax.dse,"dse-java-driver-query-builder",com.datastax.oss,"java-driver-query-builder",
+"com.deliveredtechnologies",rulebook,"com.deliveredtechnologies",rulebook-core,
+com.energizedwork,"jfconfig-factories-jdkclock",uk.cogfin,"jfconfig-factories-jdkclock",
+com.energizedwork,jfconfig,uk.cogfin,jfconfig,
+com.enioka.jqm,jqm-api-client-hibernate,com.enioka.jqm,jqm-api-client-jdbc,
+com.facebook.android,facebook-marketing,com.facebook.android,facebook-core,
+com.github.dblock,oshi-core,com.github.oshi,oshi-core,
+com.github.dblock,oshi-dist,com.github.oshi,oshi-dist,
+com.github.dblock,oshi-json,com.github.oshi,oshi-json,
+com.github.dblock,oshi-parent,com.github.oshi,oshi-parent,
+com.github.fge,btf,"com.github.java-json-tools",btf,
+com.github.fge,jackson-coreutils,"com.github.java-json-tools",jackson-coreutils,
+com.github.fge,json-patch,"com.github.java-json-tools",json-patch,
+com.github.fge,json-schema-avro,"com.github.java-json-tools",json-schema-avro,
+com.github.fge,json-schema-core,"com.github.java-json-tools",json-schema-core,
+com.github.fge,"json-schema-processor-examples","com.github.java-json-tools","json-schema-processor-examples",
+com.github.fge,json-schema-validator,"com.github.java-json-tools",json-schema-validator,
+com.github.fge,msg-simple,"com.github.java-json-tools",msg-simple,
+com.github.fge,uri-template,"com.github.java-json-tools",uri-template,
+com.github.nayuki,qrcodegen,io.nayuki,qrcodegen,
+com.github.s4u,jfatek,org.simplify4u,jfatek,
+com.github.s4u,jfatek,org.simplify4u,jfatek,
+com.github.s4u.plugins,pgpverify-maven-plugin,org.simplify4u.plugins,pgpverify-maven-plugin,
+com.github.s4u.plugins,sitemapxml-maven-plugin,org.simplify4u.plugins,sitemapxml-maven-plugin,
+"com.github.spring-data-dynamodb",spring-data-dynamodb,com.github.derjust,spring-data-dynamodb,
+com.github.wnameless,json-flattener,"com.github.wnameless.json",json-flattener,
+com.google.api-ads,adwords-lib,com.google.api-ads,ads-lib,
+com.google.api-ads,dfa-lib,com.google.api-ads,ads-lib,
+com.google.api-ads,dfp-lib,com.google.api-ads,ads-lib,
+com.google.apis,google-api-services-sql,com.google.apis,"google-api-services-sqladmin",
+"com.google.inject.extensions",guice-multibindings,com.google.inject,guice,"Since Guice 4.2, multibindings support has moved to Guice core, see https://github.com/google/guice/wiki/Multibindings"
+com.googlecode.flyway,flyway-core,org.flywaydb,flyway-core,
+com.googlecode.jmockit,jmockit,org.jmockit,jmockit,
+com.googlecode.openpojo,openpojo,com.openpojo,openpojo,
+"com.google.code.reflection-utils",reflection-utils,"com.github.ekryd.reflection-utils",reflection-utils,
+com.graphql-java,"graphiql-spring-boot-autoconfigure","com.graphql-java-kickstart","graphiql-spring-boot-autoconfigure",
+com.graphql-java,"graphiql-spring-boot-starter","com.graphql-java-kickstart","graphiql-spring-boot-starter",
+com.graphql-java,graphql-java-servlet,"com.graphql-java-kickstart",graphql-java-servlet,
+com.graphql-java,graphql-java-tools,"com.graphql-java-kickstart",graphql-java-tools,
+com.graphql-java,"graphql-spring-boot-autoconfigure","com.graphql-java-kickstart","graphql-spring-boot-autoconfigure",
+com.graphql-java,"graphql-spring-boot-starter-test","com.graphql-java-kickstart","graphql-spring-boot-starter-test",
+com.graphql-java,"graphql-spring-boot-starter","com.graphql-java-kickstart","graphql-spring-boot-starter",
+com.graphql-java,graphql-spring-boot-test,"com.graphql-java-kickstart",graphql-spring-boot-test,
+com.graphql-java,"graphql-spring-boot-test-autoconfigure","com.graphql-java-kickstart","graphql-spring-boot-test-autoconfigure",
+com.graphql-java,"voyager-spring-boot-autoconfigure","com.graphql-java-kickstart","voyager-spring-boot-autoconfigure",
+com.graphql-java,"voyager-spring-boot-starter","com.graphql-java-kickstart","voyager-spring-boot-starter",
+com.hotels.beans,bean-utils-library,com.hotels.beans,bull-bean-transformer,
+com.ibatis,ibatis-common,com.ibatis,ibatis2-common,
+com.ibatis,ibatis-dao,com.ibatis,ibatis2-dao,
+com.ibatis,ibatis-sqlmap,com.ibatis,ibatis2-sqlmap,
+com.indeed,java-dogstatsd-client,com.datadoghq,java-dogstatsd-client,"This project has merged with datadog/java-dogstatsd-client and now lives in a new home at: http://datadog/java-dogstatsd-client"
+"com.jayway.maven.plugins.android.generation2",maven-android-plugin,"com.jayway.maven.plugins.android.generation2",android-maven-plugin,
+com.jayway.restassured,rest-assured,io.rest-assured,rest-assured,
+com.kakawait,"cas-security-dynamic-service-resolver",com.kakawait,"spring-security-cas-extension",
+com.lowagie,itext,com.itextpdf,itextpdf,
+com.mageddo.togglefirst,toggle-first-core,com.mageddo,feature-switch,
+com.mageddo.togglefirst,toggle-first-repo-jdbc,com.mageddo,feature-switch,
+com.marklogic,java-client-api,com.marklogic,marklogic-client-api,
+com.mattprovis,fluentmatcher-core,com.mattprovis,"fluentmatcher-maven-plugin",
+com.mattprovis,"fluentmatcher-maven-plugin-test",com.mattprovis,"fluentmatcher-maven-plugin",
+com.mattprovis,fluentmatcher-parent,com.mattprovis,"fluentmatcher-maven-plugin",
+com.microsoft.azure,azure-eventhubs,com.azure,"azure-messaging-eventhubs",
+com.microsoft.azure,azure-eventhubs-eph,com.azure,"azure-messaging-eventhubs-checkpointstore-blob",
+com.microsoft.azure,azure-keyvault,com.azure,azure-keyvault,
+com.microsoft.azure,azure-keyvault-core,com.azure,"azure-security-keyvault-keys",
+com.microsoft.azure,"azure-keyvault-cryptography",com.azure,"azure-security-keyvault-keys",
+com.microsoft.azure,"azure-keyvault-extensions",com.azure,"azure-keyvault-extensions",
+com.microsoft.azure,azure-keyvault-webkey,com.azure,"azure-security-keyvault-keys",
+com.microsoft.azure,azure-management,com.microsoft.azure,azure-svc-mgmt,
+com.microsoft.azure,azure-management-compute,com.microsoft.azure,azure-svc-mgmt-compute,
+com.microsoft.azure,azure-management-media,com.microsoft.azure,azure-svc-mgmt-media,
+com.microsoft.azure,azure-management-network,com.microsoft.azure,azure-svc-mgmt-network,
+com.microsoft.azure,"azure-management-scheduler",com.microsoft.azure,azure-svc-mgmt-scheduler,
+com.microsoft.azure,azure-management-sql,com.microsoft.azure,azure-svc-mgmt-sql,
+com.microsoft.azure,azure-management-storage,com.microsoft.azure,azure-svc-mgmt-storage,
+com.microsoft.azure,"azure-management-websites",com.microsoft.azure,azure-svc-mgmt-websites,
+com.microsoft.azure,"azure-spring-boot-dependencies",com.microsoft.azure,"azure-spring-boot-starter-parent",
+com.microsoft.azure,azure-storage,com.azure,azure-storage,
+com.microsoft.azure,spring-data-documentdb,com.microsoft.azure,spring-data-cosmosdb,
+"com.microsoft.windowsazure.storage","microsoft-windowsazure-storage-sdk",com.microsoft.azure,azure-storage,
+commons-collections,commons-collections,org.apache.commons,commons-collections4,
+commons-compress,commons-compress,org.apache.commons,commons-compress,
+commons-configuration,commons-configuration,org.apache.commons,commons-configuration2,
+commons-email,commons-email,org.apache.commons,commons-email,
+commons-httpclient,commons-httpclient,"org.apache.httpcomponents",httpclient,"HttpComponents Client is a successor of and replacement for Commons HttpClient 3.x. Users of Commons HttpClient are strongly encouraged to upgrade."
+commons-lang,commons-lang,org.apache.commons,commons-lang3,
+commons-math,commons-math,org.apache.commons,commons-math,"Check https://issues.apache.org/jira/browse/MATH-339 for more details"
+com.mtvi.plateng.maven,maven-hudson-plugin,org.jvnet.hudson.tools,maven-hudson-plugin,
+com.mysema.maven,maven-apt-plugin,com.mysema.maven,apt-maven-plugin,
+com.mysema.querydsl,,com.querydsl,,
+com.nanohttpd,,org.nanohttpd,,
+com.opentable.components,otj-metrics,com.opentable.components,otj-metrics-jaxrs,
+com.opentable.components,otj-server,com.opentable.components,otj-server-jaxrs,
+com.oracle.substratevm,,org.graalvm.nativeimage,,
+com.semanticcms,"semanticcms-sitemap-servlet",com.semanticcms,semanticcms-core-sitemap,
+com.semanticcms,semanticcms-view-content,com.semanticcms,"semanticcms-core-view-content",
+com.squareup.okhttp,,com.squareup.okhttp3,,"The Maven group ID is now com.squareup.okhttp3, see https://square.github.io/okhttp/changelog_3x/#version-300-rc1"
+com.squareup.retrofit,,com.squareup.retrofit2,,"The Maven group ID is now com.squareup.retrofit2, see https://github.com/square/retrofit/blob/master/CHANGELOG.md"
+com.sun.jersey,,"org.glassfish.jersey.core",,
+com.sun.mail,javax.mail,com.sun.mail,jakarta.mail,
+com.sun.xml,saaj-impl,"com.sun.xml.messaging.saaj",saaj-impl,
+com.typesafe,slick_2.10,com.typesafe.slick,slick_2.10,
+com.typesafe,slick-testkit_2.10,com.typesafe.slick,slick-testkit_2.10,
+com.vladmihalcea,,io.hypersistence,,
+com.wandrell.archetypes,library,"com.wandrell.maven.archetypes",library,
+com.wandrell.maven,archetype-pom,com.bernardomg.maven,archetype-pom,
+"com.wandrell.maven.archetypes",library-archetype,"com.bernardomg.maven.archetypes",library-archetype,
+com.wandrell.maven,base-pom,com.bernardomg.maven,base-pom,
+com.wandrell,persistence-utils,com.wandrell,repository-pattern,
+com.wandrell.tabletop,dice,com.bernardomg.tabletop,dice,
+"com.wandrell.tabletop.dreadball",dreadball-model-api,"com.bernardomg.tabletop.dreadball",dreadball-model-api,
+"com.wandrell.tabletop.dreadball",dreadball-model-default,"com.bernardomg.tabletop.dreadball",dreadball-model-default,
+"com.wandrell.tabletop.dreadball",dreadball-model-json,"com.bernardomg.tabletop.dreadball",dreadball-model-json,
+"com.wandrell.tabletop.dreadball","dreadball-model-persistence","com.bernardomg.tabletop.dreadball","dreadball-model-persistence",
+cz.geek,gooddata-java,com.gooddata,gooddata-java,
+dbunit,dbunit,org.dbunit,dbunit,
+de.cwkr,cwkr-checkstyle,de.cwkr,cwkr-coding-guidelines,
+de.cwkr,cwkr-coding-guidelines,de.cwkr,cwkr-pmd,
+de.cwkr,tracerr,de.cwkr.validation,validation-util,
+de.cwkr.validation,validation-util,de.cwkr,cwkr-util,
+de.stklcode.jvault,connector,de.stklcode.jvault,jvault-connector,
+de.thksystems,tkscommons-crypto,de.thksystems,tkscommons,
+de.thksystems,tkscommons-lang,de.thksystems,tkscommons,
+de.thksystems,tkscommons-xstream,de.thksystems,tkscommons,
+docbook,docbook-xml,org.docbook,docbook-xml,
+docbook,docbook-xsl,org.docbook,docbook-xsl,
+dom4j,dom4j,org.dom4j,dom4j,
+easymock,easymockclassextension,org.easymock,easymockclassextension,
+easymock,easymock,org.easymock,easymock,
+ehcache,ehcache,net.sf.ehcache,ehcache,
+eu.lp0.slf4j,slf4j-android,uk.uuid,slf4j-android,
+fi.jumi,jumi-actors,fi.jumi.actors,jumi-actors,
+fi.jumi,jumi-actors-maven-plugin,fi.jumi.actors,jumi-actors-maven-plugin,
+fi.jumi,thread-safety-agent,fi.jumi.actors,thread-safety-agent,
+fish.payara.arquillian,"arquillian-payara-micro-5-managed",fish.payara.arquillian,"arquillian-payara-micro-managed",
+fish.payara.arquillian,"arquillian-payara-server-4-embedded",fish.payara.arquillian,"arquillian-payara-server-embedded",
+fish.payara.arquillian,"arquillian-payara-server-4-managed",fish.payara.arquillian,"arquillian-payara-server-managed",
+fish.payara.arquillian,"arquillian-payara-server-4-remote",fish.payara.arquillian,"arquillian-payara-server-remote",
+fish.payara.arquillian,"payara-container-4-common",fish.payara.arquillian,payara-container-common,
+fop,fop,org.apache.xmlgraphics,fop,
+freemarker,freemarker,org.freemarker,freemarker,
+fr.inria.atlanmod.neoemf,neoemf-blueprints,fr.inria.atlanmod.neoemf,"neoemf-data-blueprints-core",
+fr.inria.atlanmod.neoemf,neoemf-blueprints-neo4j,fr.inria.atlanmod.neoemf,"neoemf-data-blueprints-neo4j",
+fr.inria.atlanmod.neoemf,neoemf-graph,fr.inria.atlanmod.neoemf,neoemf-data-blueprints,
+fr.inria.atlanmod.neoemf,neoemf-hbase,fr.inria.atlanmod.neoemf,neoemf-data-hbase,
+fr.inria.atlanmod.neoemf,neoemf-map,fr.inria.atlanmod.neoemf,neoemf-data-mapdb,
+fulcrum,,org.apache.fulcrum,,
+geronimo,,org.apache.geronimo,,
+groovy,groovy-1.0-jsr,groovy,groovy,
+hibernate,hibernate,org.hibernate,hibernate,
+htmlunit,htmlunit,net.sourceforge.htmlunit,htmlunit,
+icu4j,icu4j,com.ibm.icu,icu4j,
+icu,icu4j,com.ibm.icu,icu4j,
+info.cukes,,io.cucumber,,
+io.github.benas,random-beans,org.jeasy,easy-random-core,
+"io.github.animatedledstrip","animatedledstrip-kotlin-pi","io.github.animatedledstrip",animatedledstrip-pi,
+io.github.devopsix,hamcrest-mail,org.devopsix,hamcrest-mail,
+"io.github.fast-classpath-scanner",fast-classpath-scanner,io.github.classgraph,classgraph,
+io.github.lukehutch,fast-classpath-scanner,io.github.classgraph,classgraph,
+io.github.openfeign,feign-java8,io.github.openfeign,feign-core,
+io.jenkins.tools,"git-changelist-maven-extension","io.jenkins.tools.incrementals","git-changelist-maven-extension",
+"io.quee.ktx.framework.dependencies","ktx-business-dependencies",io.quee.ktx.radix,ktx-radix-dependencies,
+io.quee.ktx.framework,ktx-business-adapter,io.quee.ktx.radix,ktx-radix-adapter,
+io.quee.ktx.framework,"ktx-business-adapter-shared",io.quee.ktx.radix,"ktx-business-adapter-shared",
+io.quee.ktx.framework,"ktx-business-development-action-usecase",io.quee.ktx.radix,"ktx-radix-development-usecase-action",
+io.quee.ktx.framework,"ktx-business-development-identity",io.quee.ktx.radix,"ktx-radix-development-identity",
+io.quee.ktx.framework,ktx-business-development,io.quee.ktx.radix,ktx-radix-development,
+io.quee.ktx.framework,"ktx-business-development-reactive-usecases",io.quee.ktx.radix,ktx-radix-tool,
+io.quee.ktx.framework,"ktx-business-development-shared",io.quee.ktx.radix,"ktx-radix-development-shared",
+io.quee.ktx.framework,"ktx-business-development-store",io.quee.ktx.radix,"ktx-radix-development-store",
+io.quee.ktx.framework,"ktx-business-development-usecases",io.quee.ktx.radix,"ktx-radix-development-usecase",
+io.quee.ktx.framework,ktx-business-framework,io.quee.api.parent,quee-api-parent,
+io.quee.ktx.framework,ktx-business-framework,io.quee.ktx.radix,ktx-radix,
+io.quee.ktx.framework,ktx-business-port,io.quee.ktx.radix,ktx-radix-port,
+io.quee.ktx.framework,ktx-business-port-logger,io.quee.ktx.radix,ktx-radix-port-logger,
+io.quee.ktx.framework,ktx-business-starter,io.quee.ktx.radix,ktx-radix-starter,
+io.quee.ktx.framework,"ktx-business-starter-logger",io.quee.ktx.radix,ktx-radix-starter-logger,
+io.quee.ktx.framework,ktx-business-tool-http,io.quee.ktx.radix,ktx-radix-tool-http,
+io.quee.ktx.framework,ktx-business-tool,io.quee.ktx.radix,ktx-radix-tool,
+io.quee.ktx.framework,"ktx-business-tool-json-dsl",io.quee.ktx.radix,ktx-radix-tool-json-dsl,
+io.quee.ktx.framework,"ktx-business-tool-test-dsl",io.quee.ktx.radix,ktx-radix-tool-test-dsl,
+io.quee.ktx.framework,ktx-business-tool-test,io.quee.ktx.radix,ktx-radix-tool-test,
+io.sgr,common-dependencies,io.sgr.maven,common-dependencies,
+io.sgr,io.sgr.base,io.sgr.maven,maven-base,
+io.sgr,io.sgr,io.sgr,io.sgr.base,
+io.smallrye,smallrye-config-common,io.smallrye.config,smallrye-config-common,
+io.smallrye,smallrye-config-docs,io.smallrye.config,smallrye-config-docs,
+io.smallrye,smallrye-config,io.smallrye.config,smallrye-config,
+io.smallrye,smallrye-config-parent,io.smallrye.config,smallrye-config-parent,
+io.smallrye,smallrye-config-release,io.smallrye.config,smallrye-config-release,
+io.wcm,io.wcm.testing.aem-mock,io.wcm,"io.wcm.testing.aem-mock.junit4",
+itext,itext,com.lowagie,itext,
+jaas,jaas,javax.security,jaas,
+jaf,activation,javax.activation,activation,
+jarjar,jarjar,com.tonicsystems,jarjar,
+javacc,javacc,net.java.dev.javacc,javacc,
+javamail,javamail,javax.mail,mail,
+javamail,mail,javax.mail,mail,
+javassist,javassist,org.javassist,javassist,
+javax.activation,activation,javax.activation,javax.activation-api,
+javax.activation,javax.activation-api,jakarta.activation,jakarta.activation-api,"Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+javax.annotation,javax.annotation-api,jakarta.annotation,jakarta.annotation-api,"Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+javax.el,el-api,javax.el,javax.el-api,
+javax.el,javax.el-api,jakarta.el,jakarta.el-api,"Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+javax.mail,javax.mail-api,jakarta.mail,jakarta.mail-api,
+javax.mail,mail,javax.mail,javax.mail-api,
+javax.inject,javax.inject,jakarta.inject,jakarta.inject-api,
+javax.json,javax.json-api,jakarta.json,jakarta.json-api,"Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+javax.security.jacc,javax.security.jacc-api,jakarta.security.jacc,"jakarta.security.jacc-api","Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+"javax.security.auth.message","javax.security.auth.message-api","jakarta.security.auth.message","jakarta.security.auth.message-api","Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+javax.mail,javax.mail-api,jakarta.mail,jakarta.mail-api,"Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+javax.xml.ws,jaxws-api,jakarta.xml.ws,jakarta.xml.ws-api,"Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+javax.jws,javax.jws-api,jakarta.jws,jakarta.jws-api,"Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+javax.xml.soap,javax.xml.soap-api,jakarta.xml.soap,jakarta.xml.soap-api,"Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+javax.xml.bind,javax.xml.soap-api,jakarta.xml.soap,jakarta.xml.soap-api,"Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+javax.resource,javax.resource-api,jakarta.resource,jakarta.resource-api,"Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+javax.jms,javax.jms-api,jakarta.jms,jakarta.jms-api,"Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+javax.json.bind,javax.json.bind-api,jakarta.json.bind,jakarta.json.bind-api,"Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+javax.servlet.jsp,javax.servlet.jsp-api,jakarta.servlet.jsp,jakarta.servlet.jsp-api,"Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+javax.servlet.jsp.jstl,"javax.servlet.jsp.jstl-api",jakarta.servlet.jsp.jstl,"jakarta.servlet.jsp.jstl-api","Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+javax.transaction,javax.transaction-api,jakarta.transaction,jakarta.transaction-api,"Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+javax.management.j2ee,"javax.management.j2ee-api",jakarta.management.j2ee,"jakarta.management.j2ee-api","Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+javax.enterprise.deploy,"javax.enterprise.deploy-api","jakarta.enterprise.deploy","jakarta.enterprise.deploy-api","Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+javax.xml.rpc,javax.xml.rpc-api,jakarta.xml.rpc,jakarta.xml.rpc-api,"Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+javax.xml.registry,javax.xml.registry-api,jakarta.xml.registry,jakarta.xml.registry-api,"Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+javax.websocket,javax.websocket-all,jakarta.websocket,jakarta.websocket-all,"Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+javax.websocket-api,"javax.websocket-client-api",jakarta.websocket-api,"jakarta.websocket-client-api","Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+"javax.enterprise.concurrent","javax.enterprise.concurrent-api","jakarta.enterprise.concurrent","jakarta.enterprise.concurrent-api","Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+javax.ejb,javax.ejb-api,jakarta.ejb,jakarta.ejb-api,"Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+"javax.security.enterprise","javax.security.enterprise-api","jakarta.security.enterprise","jakarta.security.enterprise-api","Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+javax.interceptor,javax.interceptor-api,jakarta.interceptor,jakarta.interceptor-api,"Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+javax.faces,javax.faces-api,jakarta.faces,jakarta.faces-api,"Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+javax.persistence,javax.persistence-api,jakarta.persistence,jakarta.persistence-api,"Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+javax.persistence,persistence-api,javax.persistence,javax.persistence-api,
+javax.servlet,javax.servlet-api,jakarta.servlet,jakarta.servlet-api,"Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+javax.servlet,servlet-api,javax.servlet,javax.servlet-api,
+javax.validation,validation-api,jakarta.validation,jakarta.validation-api,"Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+javax.ws.rs,javax.ws.rs-api,jakarta.ws.rs,jakarta.ws.rs-api,"Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+javax.xml,jaxb-api,javax.xml.bind,jaxb-api,
+javax.xml,jaxrpc,javax.xml,jaxrpc-api,
+javax.xml,jaxws-api,javax.xml.ws,jaxws-api,
+javax.xml.bind,jaxb-api,jakarta.xml.bind,jakarta.xml.bind-api,"Java EE new home is Jakarta EE, see https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates"
+javax.xml.soap,saaj-impl,"com.sun.xml.messaging.saaj",saaj-impl,
+jboss,javassist,org.javassist,javassist,
+jca,jca,javax.resource,connector,
+jca,jca,javax.resource,connector-api,
+jcharts,jcharts,net.sf.jcharts,krysalis-jCharts,
+jcifs,jcifs,org.samba.jcifs,jcifs,
+jdbc,jdbc,javax.sql,jdbc-stdext,
+jdbc,jdbc-stdext,javax.sql,jdbc-stdext,
+jdo,jdo,javax.jdo,jdo,
+jdom,jdom,org.jdom,jdom,
+jexcelapi,jxl,"net.sourceforge.jexcelapi",jxl,
+jfreechart,jfreechart,jfree,jfreechart,
+jgrapht,jgrapht,org.jgrapht,jgrapht-jdk1.5,
+jms,jms,javax.jms,jms,
+jsch,jsch,com.jcraft,jsch,
+jspapi,jsp-api,javax.servlet,jsp-api,
+jstl,jstl,javax.servlet,jstl,
+jta,jta,javax.transaction,jta,
+jtds,jtds,net.sourceforge.jtds,jtds,
+jug,jug,org.safehaus.jug,jug,
+junit,junit-dep,junit,junit,
+jwebunit,jwebunit,net.sourceforge.jwebunit,jwebunit,
+jython,jython,org.python,jython,
+kxml2,kxml2,net.sf.kxml,kxml2,
+kxml,kxml,net.sf.kxml,kxml2,
+netbeans,cvslib,org.netbeans,lib,
+net.htmlparser,jericho-html,net.htmlparser.jericho,jericho-html,
+"net.javacrumbs.future-converter",common,"net.javacrumbs.future-converter",future-converter-common,
+"net.javacrumbs.future-converter",java8-guava,"net.javacrumbs.future-converter","future-converter-java8-guava",
+"net.javacrumbs.future-converter",rxjava-java8,"net.javacrumbs.future-converter","future-converter-rxjava-java8",
+"net.javacrumbs.future-converter",spring-guava,"net.javacrumbs.future-converter","future-converter-spring-guava",
+"net.javacrumbs.future-converter",spring-java8,"net.javacrumbs.future-converter","future-converter-spring-java8",
+"net.javacrumbs.future-converter",spring-rxjava,"net.javacrumbs.future-converter","future-converter-spring-rxjava",
+net.java.dev.urlrewrite,urlrewritefilter,org.tuckey,urlrewritefilter,
+net.jockx,littleproxy,xyz.rogfam,littleproxy,
+net.ju-n,net-ju-n-parent,net.nicoulaj,net-ju-n-parent,
+net.ju-n,net-ju-n-parent,net.nicoulaj,parent,
+net.kieker-monitoring,kieker-aspectj,net.kieker-monitoring,kieker,
+net.kieker-monitoring,kieker-emf,net.kieker-monitoring,kieker,
+"net.rakugakibox.spring.boot","logback-access-spring-boot-starter",dev.akkinoc.spring.boot,"logback-access-spring-boot-starter",
+net.simonvt,android-menudrawer,net.simonvt.menudrawer,menudrawer,
+net.simonvt,"android-menudrawer-parent",net.simonvt.menudrawer,menudrawer-parent,
+net.simonvt,"android-menudrawer-sample","net.simonvt.menudrawer.sample",samples,
+net.sourceforge.htmlunit,htmlunit,org.htmlunit,htmlunit,
+"ninja.leaping.configurate",configurate-core,org.spongepowered,configurate-core,
+"ninja.leaping.configurate",configurate-gson,org.spongepowered,configurate-gson,
+"ninja.leaping.configurate",configurate-hocon,org.spongepowered,configurate-hocon,
+"ninja.leaping.configurate",configurate-json,org.spongepowered,configurate-json,
+"ninja.leaping.configurate",configurate-yaml,org.spongepowered,configurate-yaml,
+nl.talsmasoftware,"context-propagation-java8","nl.talsmasoftware.context","context-propagation-java8",
+nl.talsmasoftware,context-propagation,"nl.talsmasoftware.context",context-propagation,
+nl.talsmasoftware,context-propagation-root,"nl.talsmasoftware.context",context-propagation-root,
+opensymphony,quartz-jboss,org.opensymphony.quartz,quartz-jboss,
+opensymphony,quartz-oracle,org.opensymphony.quartz,quartz-oracle,
+opensymphony,quartz,org.opensymphony.quartz,quartz,
+opensymphony,quartz-weblogic,org.opensymphony.quartz,quartz-weblogic,
+org.akashihi.osm,parallelpbf,com.wolt,parallelpbf,
+org.apache.axis,axis,org.apache.axis2,axis2,
+org.apache.commons,commons-io,commons-io,commons-io,
+org.apache.commons,commons-math,org.apache.commons,commons-math3,"Check https://issues.apache.org/jira/browse/MATH-444 for more details"
+"org.apache.httpcomponents",httpclient,"org.apache.httpcomponents.client5",httpclient5,"Maven group id changed to ‘org.apache.httpcomponents.client5’."
+org.apache.maven.its,"maven-core-it-support-old-location",org.apache.maven.its,maven-core-it-support,
+org.apache.maven,"maven-core-it-support-old-location",org.apache.maven,maven-core-it-support,
+org.apache.sis,sis-core,org.apache.sis,core,
+org.apache.sis,sis-parent,org.apache.sis,parent,
+org.apache.sis,sis-webapp,"org.apache.sis.application",sis-webapp,
+org.apache.sling,maven-sling-plugin,org.apache.sling,sling-maven-plugin,
+org.apache.sling,"org.apache.sling.testing.osgi-mock",org.apache.sling,"org.apache.sling.testing.osgi-mock.junit4",
+org.apache.sling,"org.apache.sling.testing.sling-mock",org.apache.sling,"org.apache.sling.testing.sling-mock.junit4",
+org.apache.velocity,velocity,org.apache.velocity,velocity-engine-core,
+org.avaje.ebeanorm,,org.avaje.ebean,,"Past versions of Ebean artifacts where released using the groupId: org.avaje.ebean and prior to that org.avaje.ebeanorm"
+org.avaje.ebean,,io.ebean,,"Past versions of Ebean artifacts where released using the groupId: org.avaje.ebean and prior to that org.avaje.ebeanorm"
+org.codehaus.groovy,,org.apache.groovy,,
+org.codehaus.mojo,sonar-maven-plugin,"org.sonarsource.scanner.maven",sonar-maven-plugin,
+org.codehaus.sonar,sonar-maven3-plugin,org.codehaus.sonar,sonar-maven-plugin,
+org.codehaus.woodstox,wstx-asl,org.codehaus.woodstox,woodstox-core-asl,
+org.codehaus.woodstox,wstx-lgpl,org.codehaus.woodstox,woodstox-core-asl,
+org.codehaus.xfire,bcprov-jdk15,bouncycastle,bcprov-jdk15,
+org.codehaus.xfire,xmlsec,xml-security,xmlsec,
+org.docbook,docbook-xml,net.sf.docbook,docbook-xml,
+org.docbook,docbook-xsl,net.sf.docbook,docbook-xsl,
+"org.eclipse.jetty.websocket",websocket-api,"org.eclipse.jetty.websocket",websocket-jetty-api,
+"org.eclipse.jetty.websocket",websocket-server,"org.eclipse.jetty.websocket",websocket-jetty-server,
+"org.eclipse.jetty.websocket",websocket-client,"org.eclipse.jetty.websocket",websocket-jetty-client,
+"org.eclipse.jetty.websocket","javax-websocket-server-impl","org.eclipse.jetty.websocket",websocket-javax-server,
+"org.eclipse.jetty.websocket","javax-websocket-client-impl","org.eclipse.jetty.websocket",websocket-javax-client,
+org.eu.acolyte,acolyte-core,org.eu.acolyte,jdbc-driver,
+org.eu.acolyte,acolyte-scala_2.10,org.eu.acolyte,jdbc-scala_2.10,
+org.firebirdsql.jdbc,jaybird-jdk17,org.firebirdsql.jdbc,jaybird,
+org.firebirdsql.jdbc,jaybird-jdk18,org.firebirdsql.jdbc,jaybird,
+org.flowable,"flowable-spring-boot-starter-basic",org.flowable,"flowable-spring-boot-starter-process",
+org.flowable,"flowable-spring-boot-starter-rest-api",org.flowable,"flowable-spring-boot-starter-process-rest",
+org.glassfish,jakarta.json,org.eclipse.parsson,parsson,
+org.glassfish,javax.el,org.glassfish,jakarta.el,
+org.glassfish,javax.json,org.glassfish,jakarta.json,
+org.hamcrest,hamcrest-all,org.hamcrest,hamcrest,"One jar containing all classes of all the other jars. There are no new releases of this library since version 1.3. Please use the single hamcrest.jar instead. See https://hamcrest.org/JavaHamcrest/distributables#previous-versions-of-hamcrest"
+org.hamcrest,hamcrest-library,org.hamcrest,hamcrest,"The library of Matcher implementations which are based on the core functionality in hamcrest-core.jar. From Hamcrest version 2.x, all the classes in hamcrest-core.jar were moved into hamcrest.jar. See https://hamcrest.org/JavaHamcrest/distributables#previous-versions-of-hamcrest"
+org.hamcrest,hamcrest-core,org.hamcrest,hamcrest,"This was the core API to be used by third-party framework providers. This includes a foundation set of matcher implementations for common operations. This library was used as a dependency for many third-party libraries, including JUnit 4.x. From Hamcrest version 2.x, all the classes in hamcrest-core.jar were moved into hamcrest.jar. See https://hamcrest.org/JavaHamcrest/distributables#previous-versions-of-hamcrest"
+org.hibernate,hibernate-agroal,org.hibernate.orm,hibernate-agroal,
+org.hibernate,hibernate-ant,org.hibernate.orm,hibernate-ant,
+org.hibernate,hibernate-c3p0,org.hibernate.orm,hibernate-c3p0,
+org.hibernate,"hibernate-community-dialects",org.hibernate.orm,"hibernate-community-dialects",
+org.hibernate,hibernate-core,org.hibernate.orm,hibernate-core,
+org.hibernate,hibernate-entitymanager,org.hibernate,hibernate-core,"Hibernate's JPA support has been merged into the hibernate-core module, making this hibernate-entitymanager module obsolete. See https://hibernate.atlassian.net/browse/HHH-10823"
+org.hibernate,hibernate-envers,org.hibernate.orm,hibernate-envers,
+org.hibernate,hibernate-graalvm,org.hibernate.orm,hibernate-graalvm,
+org.hibernate,hibernate-hikaricp,org.hibernate.orm,hibernate-hikaricp,
+org.hibernate,hibernate-infinispan,org.infinispan,"infinispan-hibernate-cache",
+org.hibernate,hibernate-infinispan,org.infinispan,"infinispan-hibernate-cache-v53",
+org.hibernate,hibernate-jcache,org.hibernate.orm,hibernate-jcache,
+org.hibernate,hibernate-jpamodelgen,org.hibernate.orm,hibernate-jpamodelgen,
+org.hibernate,hibernate-micrometer,org.hibernate.orm,hibernate-micrometer,
+org.hibernate,hibernate-proxool,org.hibernate.orm,hibernate-proxool,
+org.hibernate,"hibernate-search-infinispan",org.infinispan,"infinispan-directory-provider",
+org.hibernate,hibernate-search,org.hibernate,hibernate-search-orm,
+org.hibernate,hibernate-spatial,org.hibernate.orm,hibernate-spatial,
+org.hibernate,hibernate-testing,org.hibernate.orm,hibernate-testing,
+org.hibernate,"hibernate-validator-annotation-processor",org.hibernate.validator,"hibernate-validator-annotation-processor",
+org.hibernate,hibernate-validator-cdi,org.hibernate.validator,hibernate-validator-cdi,
+org.hibernate,hibernate-validator,org.hibernate.validator,hibernate-validator,
+org.hibernate,"hibernate-validator-osgi-karaf-features",org.hibernate.validator,"hibernate-validator-osgi-karaf-features",
+org.hibernate,hibernate-vibur,org.hibernate.orm,hibernate-vibur,
+"org.hibernate.javax.persistence",hibernate-jpa-2.0-api,"org.hibernate.javax.persistence",hibernate-jpa-2.1-api,
+"org.hibernate.javax.persistence",hibernate-jpa-2.1-api,"org.hibernate.javax.persistence",hibernate-jpa-2.2-api,
+"org.hibernate.javax.persistence",hibernate-jpa-2.2-api,javax.persistence,javax.persistence-api,
+org.hibernate.ogm,hibernate-ogm-infinispan,org.hibernate.ogm,"hibernate-ogm-infinispan-embedded",
+org.hibernate.orm,hibernate-infinispan,org.infinispan,"infinispan-hibernate-cache-v53",
+org.codehaus.jackson,jackson-core-asl,"com.fasterxml.jackson.core",jackson-core,
+org.codehaus.jackson,jackson-mapper-asl,"com.fasterxml.jackson.core",jackson-databind,
+org.jboss,javassist,org.javassist,javassist,
+"org.jboss.arquillian.container","arquillian-wlp-managed-8.5","io.openliberty.arquillian","arquillian-liberty-managed",
+"org.jboss.arquillian.container","arquillian-wlp-remote-8.5","io.openliberty.arquillian","arquillian-liberty-remote",
+"org.jboss.arquillian.container","arquillian-wls-managed-10.3","org.jboss.arquillian.container","arquillian-wls-managed-10.3.x",
+"org.jboss.arquillian.container","arquillian-wls-managed-12.1.2","org.jboss.arquillian.container","arquillian-wls-managed-12.1.x",
+"org.jboss.arquillian.container","arquillian-wls-managed-12.1","org.jboss.arquillian.container","arquillian-wls-managed-12.1.x",
+"org.jboss.arquillian.container","arquillian-wls-remote-10.3","org.jboss.arquillian.container","arquillian-wls-remote-10.3.x",
+"org.jboss.arquillian.container","arquillian-wls-remote-12.1.2","org.jboss.arquillian.container","arquillian-wls-remote-12.1.x",
+"org.jboss.arquillian.container","arquillian-wls-remote-12.1","org.jboss.arquillian.container","arquillian-wls-remote-12.1.x",
+org.jboss.forge,forge-parser-java-api,org.jboss.forge,java-parser-api,
+org.jboss.forge,forge-parser-java,org.jboss.forge,java-parser-impl,
+org.jdom,jdom,org.jdom,jdom2,
+org.jdtaus.core.monitor,"jdtaus-core-client-monitoring",org.jdtaus.core.monitor,jdtaus-core-task-monitor,
+org.jdtaus.core.monitor,"jdtaus-core-server-monitoring",org.jdtaus.core.monitor,jdtaus-core-task-monitor,
+org.jooby,,io.jooby,,
+org.jszip.jruby,sass-gems,org.jszip.gems,sass-lang,
+org.jvnet.jaxb2.maven2,maven-jaxb2-plugin,org.jvnet.jaxb,jaxb-maven-plugin,
+org.jvnet.jaxb2.maven2,maven-jaxb20-plugin,org.jvnet.jaxb,jaxb-maven-plugin,
+org.jvnet.jaxb2.maven2,maven-jaxb21-plugin,org.jvnet.jaxb,jaxb-maven-plugin,
+org.jvnet.jaxb2.maven2,maven-jaxb22-plugin,org.jvnet.jaxb,jaxb-maven-plugin,
+org.jvnet.jaxb2.maven2,maven-jaxb23-plugin,org.jvnet.jaxb,jaxb-maven-plugin,
+org.jvnet.jax-ws-commons,jaxws-maven-plugin,com.sun.xml.ws,jaxws-maven-plugin,"The original version of this was developed in the codehaus mojo project, in March 2007, the project was moved to jax-ws-commons, but as of December 2018, the project is moved to Eclipse Foundation and plugin's group id is changed to com.sun.xml.ws."
+org.kitesdk,kite-data-hcatalog,org.kitesdk,kite-data-hive,
+org.kravemir.svg.labels,svg-labels,org.kravemir.svg.labels,lablie,
+org.kravemir.svg.labels,svg-labels-tool,org.kravemir.svg.labels,lablie-tool,
+org.labkey,labkey-client-api,org.labkey.api,labkey-client-api,
+org.mapstruct,mapstruct-jdk8,org.mapstruct,mapstruct,
+org.mortbay.jetty,,org.eclipse.jetty,,
+org.mortbay.jetty,maven-jetty-plugin,org.mortbay.jetty,jetty-maven-plugin,
+org.nuiton.js,nuiton-js-angular,org.nuiton.js,nuiton-js-angularjs,
+org.opendatakit,opendatakit-javarosa,org.getodk,javarosa,
+"org.opendaylight.yangtools",features-test,"org.opendaylight.odlparent",features-test,
+org.osgi,core,org.osgi,org.osgi.core,
+org.osgi,org.osgi.annotation,org.osgi,osgi.annotation,
+org.osgi,org.osgi.compendium,org.osgi,osgi.cmpn,
+org.osgi,org.osgi.core,org.osgi,osgi.core,
+org.osgi,org.osgi.enterprise,org.osgi,osgi.enterprise,
+org.scalatest,scalatest,org.scala-tools.testing,scalatest,
+org.semanticweb.vlog4j,vlog4j-base,org.semanticweb.rulewerk,vlog-java,
+org.semanticweb.vlog4j,vlog4j-client,org.semanticweb.rulewerk,rulewerk-client,
+org.semanticweb.vlog4j,vlog4j-core,org.semanticweb.rulewerk,rulewerk-core,
+org.semanticweb.vlog4j,vlog4j-examples,org.semanticweb.rulewerk,rulewerk-examples,
+org.semanticweb.vlog4j,vlog4j-graal,org.semanticweb.rulewerk,rulewerk-graal,
+org.semanticweb.vlog4j,vlog4j-owlapi,org.semanticweb.rulewerk,rulewerk-owlapi,
+org.semanticweb.vlog4j,vlog4j-parent,org.semanticweb.rulewerk,rulewerk-pom,
+org.semanticweb.vlog4j,vlog4j-parser,org.semanticweb.rulewerk,rulewerk-parser,
+org.semanticweb.vlog4j,vlog4j-rdf,org.semanticweb.rulewerk,rulewerk-rdf,
+org.shaneking,org.shaneking.crypto,org.shaneking,org.shaneking.skava,
+org.shaneking,org.shaneking.ling,org.shaneking,org.shaneking.skava,
+org.shaneking,org.shaneking.sql,org.shaneking,org.shaneking.skava,
+org.slf4j,jcl104-over-slf4j,org.slf4j,jcl-over-slf4j,
+"org.smartdeveloperhub.harvesters.scm.ldp4j",scm-harvester-ldp4j,"org.smartdeveloperhub.harvesters.scm",scm-harvester-frontend,
+"org.smartdeveloperhub.harvesters.scm","scm-harvester-container-ldp4j","org.smartdeveloperhub.harvesters.scm",scm-harvester-container,
+"org.sonarsource.sonarqube",sonar-plugin-api,"org.sonarsource.api.plugin",sonar-plugin-api,
+org.specsy,specsy-junit5,org.specsy,specsy-junit,
+org.truth0,truth,com.google.truth,truth,
+org.truth0,truth-parent,com.google.truth,truth-parent,
+org.koin,,io.insert-koin,,"migration from jcenter to maven central, see https://github.com/InsertKoinIO/koin#maven-central"
+pdfbox,,org.apache.pdfbox,,
+poi,poi-2.5-final,poi,poi,
+poi,poi-contrib-2.5.1-final,poi,poi,
+poi,poi-contrib-2.5-final,poi,poi-contrib,
+poi,poi-contrib,org.apache.poi,poi-contrib,
+poi,poi,org.apache.poi,poi,
+poi,"poi-scratchpad-2.5.1-final",poi,poi,
+poi,poi-scratchpad-2.5-final,poi,poi,
+poi,poi-scratchpad,org.apache.poi,poi-scratchpad,
+postgresql,,org.postgresql,,
+saxon,saxon,net.sf.saxon,saxon,
+servletapi,servlet-api,javax.servlet,servlet-api,
+servletapi,servletapi,javax.servlet,servlet-api,
+springframework,,org.springframework,,
+stax-utils,stax-utils,net.java.dev.stax-utils,stax-utils,
+tagsoup,tagsoup,org.ccil.cowan.tagsoup,tagsoup,
+tk.labyrinth,java-pig,tk.labyrinth,jpig,
+tonic,jarjar,com.tonicsystems,jarjar,
+uk.org.retep.microkernel,core,uk.org.retep.microkernel,spring,
+velocity,,org.apache.velocity,,
+webtest,webtest,com.canoo.webtest,webtest,
+woodstox,wstx-asl,org.codehaus.woodstox,wstx-asl,
+woodstox,wstx-lgpl,org.codehaus.woodstox,wstx-lgpl,
+wutka,dtdparser,com.wutka,dtdparser,
+wutka,jox,com.wutka,jox,
+xerces,xerces,xerces,xercesImpl,
+xfire,saaj-impl,"com.sun.xml.messaging.saaj",saaj-impl,
+xml-apis,xml-apis,xerces,xmlParserAPIs,
+xmlbeans,xmlbeans,org.apache.xmlbeans,xmlbeans,
+xstream,xstream,com.thoughtworks.xstream,xstream,
+pl.project13.maven,git-commit-id-plugin,io.github.git-commit-id,"git-commit-id-maven-plugin","version 5 relocated, see https://github.com/git-commit-id/git-commit-id-maven-plugin#relocation-of-the-project"
+org.codehaus.mojo,dependency-maven-plugin,org.apache.maven.plugins,maven-dependency-plugin,"relocated from Mojo to Apache, see https://maven.apache.org/plugins/maven-dependency-plugin/faq.html#plugin_name"
+org.eclipse.jetty.fcgi,fcgi-client,org.eclipse.jetty.http2,jetty-fcgi-client,"migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty.fcgi,fcgi-server,org.eclipse.jetty.http2,jetty-fcgi-server,"migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty.http2,http2-client,org.eclipse.jetty.http2,jetty-http2-client,"migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty.http2,http2-common,org.eclipse.jetty.http2,jetty-http2-common,"migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty.http2,http2-hpack,org.eclipse.jetty.http2,jetty-http2-hpack,"migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty.http2,"http2-http-client-transport",org.eclipse.jetty.http2,"jetty-http2-client-transport","migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty.http2,http2-server,org.eclipse.jetty.http2,jetty-http2-server,"migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty.http3,http3-client,org.eclipse.jetty.http3,jetty-http3-client,"migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty.http3,http3-common,org.eclipse.jetty.http3,jetty-http3-common,"migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty.http3,"http3-http-client-transport",org.eclipse.jetty.http3,"jetty-http3-client-transport","migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty.http3,http3-qpack,org.eclipse.jetty.http3,jetty-http3-qpack,"migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty.http3,http3-server,org.eclipse.jetty.http3,jetty-http3-server,"migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty.quic,quic-client,org.eclipse.jetty.quic,jetty-quic-client,"migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty.quic,quic-common,org.eclipse.jetty.quic,jetty-quic-common,"migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty.quic,quic-quiche,org.eclipse.jetty.quic,jetty-quic-quiche,"migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty.quic,quic-server,org.eclipse.jetty.quic,jetty-quic-server,"migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+"org.eclipse.jetty.websocket",websocket-core-client,"org.eclipse.jetty.websocket","jetty-websocket-core-client","migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+"org.eclipse.jetty.websocket",websocket-core-common,"org.eclipse.jetty.websocket","jetty-websocket-core-common","migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+"org.eclipse.jetty.websocket",websocket-core-server,"org.eclipse.jetty.websocket","jetty-websocket-core-server","migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+"org.eclipse.jetty.websocket",websocket-jetty-api,"org.eclipse.jetty.websocket","jetty-websocket-jetty-api","migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+"org.eclipse.jetty.websocket",websocket-jetty-client,"org.eclipse.jetty.websocket","jetty-websocket-jetty-client, otherwise org.eclipse.jetty.ee{8,9,10}.websocket","migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+"org.eclipse.jetty.websocket",websocket-jetty-common,"org.eclipse.jetty.websocket","jetty-websocket-jetty-common, otherwise org.eclipse.jetty.ee{8,9,10}.websocket","migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+"org.eclipse.jetty.websocket",websocket-jetty-server,"org.eclipse.jetty.websocket","jetty-websocket-jetty-server, otherwise org.eclipse.jetty.ee{8,9,10}.websocket","migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+"org.eclipse.jetty.websocket",websocket-jakarta-client,"org.eclipse.jetty.ee{8,9,10}.websocket","jetty-ee{8,9,10}-websocket-jakarta-client","migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+"org.eclipse.jetty.websocket",websocket-jakarta-common,"org.eclipse.jetty.ee{8,9,10}.websocket","jetty-ee{8,9,10}-websocket-jakarta-common","migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+"org.eclipse.jetty.websocket",websocket-jakarta-server,"org.eclipse.jetty.ee{8,9,10}.websocket","jetty-ee{8,9,10}-websocket-jakarta-server","migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+"org.eclipse.jetty.websocket",websocket-servlet,"org.eclipse.jetty.ee{8,9,10}.websocket","jetty-ee{8,9,10}-websocket-servlet","migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty,apache-jsp,"org.eclipse.jetty.ee{8,9,10}","jetty-ee{8,9,10}-apache-jsp","migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty,jetty-annotations,"org.eclipse.jetty.ee{8,9,10}","jetty-ee{8,9,10}-annotations","migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty,jetty-ant,removed,removed,"!! Removed - No Replacement !! Migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty,jetty-cdi,"org.eclipse.jetty.ee{8,9,10}","jetty-ee{8,9,10}-cdi","migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty,glassfish-jstl,"org.eclipse.jetty.ee{8,9,10}","jetty-ee{8,9,10}-glassfish-jstl","migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty,jetty-jaspi,"org.eclipse.jetty.ee{8,9,10}","jetty-ee{8,9,10}-jetty-jaspi","migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty,jetty-jndi,"org.eclipse.jetty.ee{8,9,10}","jetty-ee{8,9,10}-jetty-jndi","migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty,jetty-jspc-maven-plugin,"org.eclipse.jetty.ee{8,9,10}","jetty-ee{8,9,10}-jetty-jspc-maven-plugin","migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty,jetty-maven-plugin,"org.eclipse.jetty.ee{8,9,10}","jetty-ee{8,9,10}-jetty-maven-plugin","migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty,jetty-plus,"org.eclipse.jetty.ee{8,9,10}","jetty-ee{8,9,10}-jetty-plus","migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty,jetty-quickstart,"org.eclipse.jetty.ee{8,9,10}","jetty-ee{8,9,10}-jetty-quickstart","migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty,jetty-runner,"org.eclipse.jetty.ee{8,9,10}","jetty-ee{8,9,10}-jetty-runner","migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty,jetty-servlet,"org.eclipse.jetty.ee{8,9,10}","jetty-ee{8,9,10}-jetty-servlet","migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty,jetty-servlets,"org.eclipse.jetty.ee{8,9,10}","jetty-ee{8,9,10}-jetty-servlets","migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty,jetty-webapp,"org.eclipse.jetty.ee{8,9,10}","jetty-ee{8,9,10}-jetty-webapp","migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty,jetty-unixsocket,removed,removed,"!! Removed - Use org.eclipse.jetty:jetty-unixdomain-server !! Migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty,jetty-unixsocket-server,removed,removed,"!! Removed - Use org.eclipse.jetty:jetty-unixdomain-server !! Migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty,jetty-unixsocket-common,removed,removed,"!! Removed - Use org.eclipse.jetty:jetty-unixdomain-server !! Migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty,jetty-osgi-boot,org.eclipse.jetty,"jetty-osgi, otherwise org.eclipse.jetty.ee{8,9,10}","migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+org.eclipse.jetty,jetty-osgi-alpn,org.eclipse.jetty,"jetty-osgi, otherwise org.eclipse.jetty.ee{8,9,10}","migrating from Jetty 11.0.x to Jetty 12.0.x, see https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-migration-11-to-12"
+com.github.tomakehurst,wiremock,org.wiremock,wiremock,"See v3 breaking changes: https://github.com/wiremock/wiremock/releases/tag/3.0.0-beta-11"
+io.reactivex,,io.reactivex.rxjava2,,"See https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0 and https://github.com/ReactiveX/RxJava/pull/4031"
+io.reactivex.rxjava2,,io.reactivex.rxjava3,,"See https://github.com/ReactiveX/RxJava/wiki/What's-different-in-3.0 and https://github.com/ReactiveX/RxJava/pull/6421"
+com.apollographql.apollo,,"com.apollographql.apollo3",,"See https://www.apollographql.com/docs/kotlin/migration/3.0/#package-name--group-id--plugin-id"
+"com.graphql-java-generator",graphql-java-runtime,"com.graphql-java-generator","graphql-java-client-runtime or com.graphql-java-generator","See https://github.com/graphql-java-generator/graphql-maven-plugin-project/blob/master_2.x/CHANGELOG.md#1181"
+com.jcraft,jsch,com.github.mwiede,jsch,"See https://www.matez.de/index.php/2020/06/22/the-future-of-jsch-without-ssh-rsa/"
+com.github.javafaker,javafaker,net.datafaker,datafaker,"This library is a modern fork of java-faker, built on Java 8, with up to date libraries and several newly added Fake Generators. See https://github.com/datafaker-net/datafaker/"
+de.jollyday,jollyday,de.focus-shift,jollyday,"The old jollyday project is no longer maintained. This is a modern fork with jakarta dependencies and based on java 11."
diff --git a/src/test/java/org/openrewrite/java/dependencies/RelocatedDependencyCheckTest.java b/src/test/java/org/openrewrite/java/dependencies/RelocatedDependencyCheckTest.java
new file mode 100644
index 0000000..110361f
--- /dev/null
+++ b/src/test/java/org/openrewrite/java/dependencies/RelocatedDependencyCheckTest.java
@@ -0,0 +1,248 @@
+/*
+ * Copyright 2024 the original author or authors.
+ *
+ * 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
+ *
+ * https://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.openrewrite.java.dependencies;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.openrewrite.DocumentExample;
+import org.openrewrite.InMemoryExecutionContext;
+import org.openrewrite.java.dependencies.RelocatedDependencyCheck.Accumulator;
+import org.openrewrite.java.dependencies.RelocatedDependencyCheck.GroupArtifact;
+import org.openrewrite.java.dependencies.RelocatedDependencyCheck.Relocation;
+import org.openrewrite.test.RecipeSpec;
+import org.openrewrite.test.RewriteTest;
+
+import java.util.Map;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.openrewrite.gradle.Assertions.buildGradle;
+import static org.openrewrite.maven.Assertions.pomXml;
+
+class RelocatedDependencyCheckTest implements RewriteTest {
+ @Test
+ void initialValueParser() {
+ Accumulator initialValue = new RelocatedDependencyCheck().getInitialValue(new InMemoryExecutionContext());
+ Map migrations = initialValue.getMigrations();
+ assertThat(migrations)
+ .containsEntry(new GroupArtifact("commons-lang", "commons-lang"),
+ new Relocation(new GroupArtifact("org.apache.commons", "commons-lang3"), null))
+ .containsEntry(new GroupArtifact("org.codehaus.groovy", null),
+ new Relocation(new GroupArtifact("org.apache.groovy", null), null));
+ }
+
+ @Override
+ public void defaults(RecipeSpec spec) {
+ spec.recipe(new RelocatedDependencyCheck());
+ }
+
+ @Nested
+ class Maven {
+ @Test
+ @DocumentExample
+ void findRelocatedMavenDependencies() {
+ rewriteRun(
+ //language=xml
+ pomXml(
+ """
+
+ 4.0.0
+ org.openrewrite.example
+ rewrite-example
+ 1.0-SNAPSHOT
+
+
+ commons-lang
+ commons-lang
+ 2.6
+
+
+ org.codehaus.groovy
+ groovy
+ 2.5.6
+
+
+
+ """,
+ """
+
+ 4.0.0
+ org.openrewrite.example
+ rewrite-example
+ 1.0-SNAPSHOT
+
+
+ commons-lang
+ commons-lang
+ 2.6
+
+
+ org.codehaus.groovy
+ groovy
+ 2.5.6
+
+
+
+ """
+ )
+
+ );
+ }
+
+ @Test
+ void findRelocatedMavenPlugins() {
+ rewriteRun(
+ //language=xml
+ pomXml(
+ """
+
+ 4.0.0
+ org.openrewrite.example
+ rewrite-example
+ 1.0-SNAPSHOT
+
+
+
+ org.codehaus.groovy
+ groovy-eclipse-compiler
+ 3.3.0-01
+
+
+
+
+ """,
+ """
+
+ 4.0.0
+ org.openrewrite.example
+ rewrite-example
+ 1.0-SNAPSHOT
+
+
+
+ org.codehaus.groovy
+ groovy-eclipse-compiler
+ 3.3.0-01
+
+
+
+
+ """
+ )
+ );
+ }
+
+ @Test
+ void findRelocatedMavenPluginDependency() {
+ rewriteRun(
+ //language=xml
+ pomXml(
+ """
+
+ 4.0.0
+ org.openrewrite.example
+ rewrite-example
+ 1.0-SNAPSHOT
+
+
+
+ org.openrewrite.maven
+ org.openrewrite.maven
+ 5.20.0
+
+
+ commons-lang
+ commons-lang
+ 2.6
+
+
+
+
+
+
+ """,
+ """
+
+ 4.0.0
+ org.openrewrite.example
+ rewrite-example
+ 1.0-SNAPSHOT
+
+
+
+ org.openrewrite.maven
+ org.openrewrite.maven
+ 5.20.0
+
+
+ commons-lang
+ commons-lang
+ 2.6
+
+
+
+
+
+
+ """
+ )
+ );
+ }
+ }
+
+ @Nested
+ class Gradle {
+ @Test
+ void findRelocatedGradleDependencies() {
+ rewriteRun(
+ //language=groovy
+ buildGradle(
+ """
+ plugins {
+ id "java-library"
+ }
+
+ repositories {
+ mavenCentral()
+ }
+
+ def groovyVersion = "2.5.6"
+ dependencies {
+ implementation "commons-lang:commons-lang:2.6"
+ implementation group: "commons-lang", name: "commons-lang", version: "2.6"
+ implementation "org.codehaus.groovy:groovy-all:${groovyVersion}"
+ }
+ """,
+ """
+ plugins {
+ id "java-library"
+ }
+
+ repositories {
+ mavenCentral()
+ }
+
+ def groovyVersion = "2.5.6"
+ dependencies {
+ /*~~(Relocated to org.apache.commons:commons-lang3)~~>*/implementation "commons-lang:commons-lang:2.6"
+ /*~~(Relocated to org.apache.commons:commons-lang3)~~>*/implementation group: "commons-lang", name: "commons-lang", version: "2.6"
+ /*~~(Relocated to org.apache.groovy)~~>*/implementation "org.codehaus.groovy:groovy-all:${groovyVersion}"
+ }
+ """
+ )
+ );
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/org/openrewrite/java/dependencies/oldgroupids/ParseDefinitionMigrationsTest.java b/src/test/java/org/openrewrite/java/dependencies/oldgroupids/ParseDefinitionMigrationsTest.java
new file mode 100644
index 0000000..0ada65e
--- /dev/null
+++ b/src/test/java/org/openrewrite/java/dependencies/oldgroupids/ParseDefinitionMigrationsTest.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2024 the original author or authors.
+ *
+ * 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
+ *
+ * https://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.openrewrite.java.dependencies.oldgroupids;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Path;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class ParseDefinitionMigrationsTest {
+ @Test
+ void parseDefinitionMigrations(@TempDir Path tempDir) throws IOException {
+ Path csv = tempDir.resolve("migrations.csv");
+ ParseDefinitionMigrations.parseDefinitionMigrations(new File("src/test/resources"), csv.toFile());
+ assertThat(csv).hasContent("""
+ acegisecurity,,org.acegisecurity,,
+ activation,activation,javax.activation,activation,
+ com.jcraft,jsch,com.github.mwiede,jsch,"See https://www.matez.de/index.php/2020/06/22/the-future-of-jsch-without-ssh-rsa/"
+ """);
+ }
+}
\ No newline at end of file
diff --git a/src/test/resources/uc/og-definitions.json b/src/test/resources/uc/og-definitions.json
new file mode 100644
index 0000000..b49625d
--- /dev/null
+++ b/src/test/resources/uc/og-definitions.json
@@ -0,0 +1,13 @@
+{
+ "date": "2024/12/05",
+ "migration": [
+ {
+ "old": "acegisecurity",
+ "new": "org.acegisecurity"
+ },
+ {
+ "old": "activation:activation",
+ "new": "javax.activation:activation"
+ }
+ ]
+}
diff --git a/src/test/resources/uc/og-unofficial-definitions.json b/src/test/resources/uc/og-unofficial-definitions.json
new file mode 100644
index 0000000..f3e6869
--- /dev/null
+++ b/src/test/resources/uc/og-unofficial-definitions.json
@@ -0,0 +1,12 @@
+{
+ "date": "2024/01/12",
+ "migration": [
+ {
+ "old": "com.jcraft:jsch",
+ "proposal": [
+ "com.github.mwiede:jsch"
+ ],
+ "context": "See https://www.matez.de/index.php/2020/06/22/the-future-of-jsch-without-ssh-rsa/"
+ }
+ ]
+}