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 getScanner(Accumulator acc) { + return TreeVisitor.noop(); + } + + @Override + public TreeVisitor getVisitor(Accumulator acc) { + return new TreeVisitor() { + private final TreeVisitor gradleVisitor = gradleVisitor(acc); + private final TreeVisitor 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 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 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/" + } + ] +}