diff --git a/.github/workflows/maven-verify.yml b/.github/workflows/maven-verify.yml
index c0219205..1204718f 100644
--- a/.github/workflows/maven-verify.yml
+++ b/.github/workflows/maven-verify.yml
@@ -26,4 +26,3 @@ jobs:
uses: apache/maven-gh-actions-shared/.github/workflows/maven-verify.yml@v4
with:
ff-jdk: "21"
- ff-jdk-distribution: "corretto"
diff --git a/pom.xml b/pom.xml
index 4581fdee..2cfbf0a0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -54,7 +54,7 @@
- ${mavenVersion}
+ 3.6.3
@@ -79,35 +79,14 @@
- 3.6.3
+ 3.9.7
8
- 0.3.5
${project.version}
9.7
- 1.7.32
+ 1.7.36
2024-04-20T15:33:41Z
-
-
-
- org.eclipse.sisu
- org.eclipse.sisu.inject
- ${sisu.version}
-
-
- org.eclipse.sisu
- org.eclipse.sisu.plexus
- ${sisu.version}
-
-
- com.google.inject
- guice
- 5.1.0
-
-
-
-
@@ -144,10 +123,7 @@
org.codehaus.plexus
plexus-utils
-
-
- org.codehaus.plexus
- plexus-xml
+ 3.5.1
@@ -181,25 +157,20 @@
2.0.6.1
- org.apache.maven.shared
- maven-dependency-tree
- 3.2.1
+ org.apache.commons
+ commons-compress
+ 1.26.2
commons-io
commons-io
- 2.13.0
+ 2.16.1
org.vafer
jdependency
2.10
-
- org.apache.commons
- commons-collections4
- 4.4
-
@@ -211,6 +182,7 @@
com.google.inject
guice
+ 5.1.0
test
@@ -228,13 +200,13 @@
org.xmlunit
xmlunit-legacy
- 2.9.1
+ 2.10.0
test
org.mockito
mockito-core
- 2.28.2
+ 3.12.4
test
@@ -255,11 +227,6 @@
3.3.0
test
-
- org.apache.commons
- commons-compress
- 1.26.1
-
diff --git a/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java b/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java
index c11978e5..d8a9c656 100644
--- a/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java
+++ b/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java
@@ -24,7 +24,6 @@
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.File;
-import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
@@ -32,16 +31,19 @@
import java.io.PushbackInputStream;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
+import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.Callable;
@@ -54,8 +56,6 @@
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
-import org.apache.commons.collections4.MultiValuedMap;
-import org.apache.commons.collections4.multimap.HashSetValuedHashMap;
import org.apache.commons.compress.archivers.zip.ExtraFieldUtils;
import org.apache.commons.compress.archivers.zip.X5455_ExtendedTimestamp;
import org.apache.commons.compress.archivers.zip.ZipExtraField;
@@ -137,26 +137,26 @@ public void shade(ShadeRequest shadeRequest) throws IOException, MojoExecutionEx
goThroughAllJarEntriesForManifestTransformer(shadeRequest, resources, manifestTransformer, out);
// CHECKSTYLE_OFF: MagicNumber
- MultiValuedMap duplicates = new HashSetValuedHashMap<>(10000, 3);
+ Map> duplicates = new HashMap<>();
// CHECKSTYLE_ON: MagicNumber
shadeJars(shadeRequest, resources, transformers, out, duplicates, packageMapper);
// CHECKSTYLE_OFF: MagicNumber
- MultiValuedMap, String> overlapping = new HashSetValuedHashMap<>(20, 15);
+ Map, HashSet> overlapping = new HashMap<>();
// CHECKSTYLE_ON: MagicNumber
for (String clazz : duplicates.keySet()) {
Collection jarz = duplicates.get(clazz);
if (jarz.size() > 1) {
- overlapping.put(jarz, clazz);
+ overlapping.computeIfAbsent(jarz, k -> new HashSet<>()).add(clazz);
}
}
// Log a summary of duplicates
logSummaryOfDuplicates(overlapping);
- if (overlapping.keySet().size() > 0) {
+ if (!overlapping.keySet().isEmpty()) {
showOverlappingWarning();
}
@@ -230,7 +230,7 @@ private void shadeJars(
Set resources,
List transformers,
JarOutputStream jos,
- MultiValuedMap duplicates,
+ Map> duplicates,
DefaultPackageMapper packageMapper)
throws IOException {
for (File jar : shadeRequest.getJars()) {
@@ -262,7 +262,7 @@ private void shadeDir(
List transformers,
DefaultPackageMapper packageMapper,
JarOutputStream jos,
- MultiValuedMap duplicates,
+ Map> duplicates,
File jar,
File current,
String prefix,
@@ -308,7 +308,7 @@ private void shadeDir(
new Callable() {
@Override
public InputStream call() throws Exception {
- return new FileInputStream(file);
+ return Files.newInputStream(file.toPath());
}
},
name,
@@ -326,7 +326,7 @@ private void shadeJar(
List transformers,
DefaultPackageMapper packageMapper,
JarOutputStream jos,
- MultiValuedMap duplicates,
+ Map> duplicates,
File jar,
List jarFilters)
throws IOException {
@@ -387,7 +387,7 @@ private void shadeJarEntry(
List transformers,
DefaultPackageMapper packageMapper,
JarOutputStream jos,
- MultiValuedMap duplicates,
+ Map> duplicates,
File jar,
Callable inputProvider,
String name,
@@ -406,7 +406,7 @@ private void shadeJarEntry(
}
}
- duplicates.put(name, jar);
+ duplicates.computeIfAbsent(name, k -> new HashSet<>()).add(jar);
if (name.endsWith(".class")) {
addRemappedClass(jos, jar, name, time, in, packageMapper);
} else if (shadeRequest.isShadeSourcesContent() && name.endsWith(".java")) {
@@ -426,7 +426,7 @@ private void shadeJarEntry(
addResource(resources, jos, mappedName, inputProvider, time, method);
} else {
- duplicates.removeMapping(name, jar);
+ duplicates.computeIfAbsent(name, k -> new HashSet<>()).remove(jar);
}
}
}
@@ -471,7 +471,7 @@ private void showOverlappingWarning() {
logger.warn("See https://maven.apache.org/plugins/maven-shade-plugin/");
}
- private void logSummaryOfDuplicates(MultiValuedMap, String> overlapping) {
+ private void logSummaryOfDuplicates(Map, HashSet> overlapping) {
for (Collection jarz : overlapping.keySet()) {
List jarzS = new ArrayList<>();
diff --git a/src/main/java/org/apache/maven/plugins/shade/mojo/ShadeMojo.java b/src/main/java/org/apache/maven/plugins/shade/mojo/ShadeMojo.java
index 54aaebb5..48a39d99 100644
--- a/src/main/java/org/apache/maven/plugins/shade/mojo/ShadeMojo.java
+++ b/src/main/java/org/apache/maven/plugins/shade/mojo/ShadeMojo.java
@@ -35,6 +35,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.stream.Collectors;
import org.apache.maven.RepositoryUtils;
import org.apache.maven.artifact.Artifact;
@@ -67,12 +68,13 @@
import org.apache.maven.project.ProjectBuildingException;
import org.apache.maven.project.ProjectBuildingRequest;
import org.apache.maven.project.ProjectBuildingResult;
-import org.apache.maven.shared.dependency.graph.DependencyGraphBuilder;
-import org.apache.maven.shared.dependency.graph.DependencyGraphBuilderException;
-import org.apache.maven.shared.dependency.graph.DependencyNode;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.WriterFactory;
import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.collection.CollectRequest;
+import org.eclipse.aether.collection.CollectResult;
+import org.eclipse.aether.collection.DependencyCollectionException;
+import org.eclipse.aether.graph.DependencyNode;
import org.eclipse.aether.resolution.ArtifactRequest;
import org.eclipse.aether.resolution.ArtifactResolutionException;
import org.eclipse.aether.resolution.ArtifactResult;
@@ -400,12 +402,6 @@ public class ShadeMojo extends AbstractMojo {
@Inject
private RepositorySystem repositorySystem;
- /**
- * The dependency graph builder to use.
- */
- @Inject
- private DependencyGraphBuilder dependencyGraphBuilder;
-
/**
* ProjectBuilder, needed to create projects from the artifacts.
*/
@@ -985,7 +981,7 @@ private File shadedTestArtifactFile() {
// We need to find the direct dependencies that have been included in the uber JAR so that we can modify the
// POM accordingly.
private void createDependencyReducedPom(Set artifactsToRemove)
- throws IOException, DependencyGraphBuilderException, ProjectBuildingException {
+ throws IOException, ProjectBuildingException, DependencyCollectionException {
List transitiveDeps = new ArrayList<>();
// NOTE: By using the getArtifacts() we get the completely evaluated artifacts
@@ -1053,7 +1049,7 @@ private void createDependencyReducedPom(Set artifactsToRemove)
private void rewriteDependencyReducedPomIfWeHaveReduction(
List dependencies, boolean modified, List transitiveDeps, Model model)
- throws IOException, ProjectBuildingException, DependencyGraphBuilderException {
+ throws IOException, ProjectBuildingException, DependencyCollectionException {
if (modified) {
for (int loopCounter = 0; modified; loopCounter++) {
@@ -1182,18 +1178,30 @@ private String getId(String groupId, String artifactId, String type, String clas
public boolean updateExcludesInDeps(
MavenProject project, List dependencies, List transitiveDeps)
- throws DependencyGraphBuilderException {
- MavenProject original = session.getProjectBuildingRequest().getProject();
- try {
- session.getProjectBuildingRequest().setProject(project);
- DependencyNode node =
- dependencyGraphBuilder.buildDependencyGraph(session.getProjectBuildingRequest(), null);
- boolean modified = false;
- for (DependencyNode n2 : node.getChildren()) {
- String artifactId2 = getId(n2.getArtifact());
+ throws DependencyCollectionException {
+ CollectRequest collectRequest = new CollectRequest();
+ collectRequest.setRootArtifact(RepositoryUtils.toArtifact(project.getArtifact()));
+ collectRequest.setRepositories(project.getRemoteProjectRepositories());
+ collectRequest.setDependencies(project.getDependencies().stream()
+ .map(d -> RepositoryUtils.toDependency(
+ d, session.getRepositorySession().getArtifactTypeRegistry()))
+ .collect(Collectors.toList()));
+ if (project.getDependencyManagement() != null) {
+ collectRequest.setManagedDependencies(project.getDependencyManagement().getDependencies().stream()
+ .map(d -> RepositoryUtils.toDependency(
+ d, session.getRepositorySession().getArtifactTypeRegistry()))
+ .collect(Collectors.toList()));
+ }
+ CollectResult result = repositorySystem.collectDependencies(session.getRepositorySession(), collectRequest);
+ boolean modified = false;
+ if (result.getRoot() != null) {
+ for (DependencyNode n2 : result.getRoot().getChildren()) {
+ String artifactId2 = getId(RepositoryUtils.toArtifact(n2.getArtifact()));
for (DependencyNode n3 : n2.getChildren()) {
- Artifact artifact3 = n3.getArtifact();
+ // stupid m-a Artifact that has no idea what it is: dependency or artifact?
+ Artifact artifact3 = RepositoryUtils.toArtifact(n3.getArtifact());
+ artifact3.setScope(n3.getDependency().getScope());
String artifactId3 = getId(artifact3);
// check if it really isn't in the list of original dependencies. Maven
@@ -1240,11 +1248,8 @@ public boolean updateExcludesInDeps(
}
}
}
- return modified;
- } finally {
- // restore it
- session.getProjectBuildingRequest().setProject(original);
}
+ return modified;
}
private boolean dependencyHasExclusion(Dependency dep, Artifact exclusionToCheck) {
diff --git a/src/main/java/org/apache/maven/plugins/shade/resource/properties/io/NoCloseOutputStream.java b/src/main/java/org/apache/maven/plugins/shade/resource/properties/io/NoCloseOutputStream.java
index 30b4e486..e5fdcef9 100644
--- a/src/main/java/org/apache/maven/plugins/shade/resource/properties/io/NoCloseOutputStream.java
+++ b/src/main/java/org/apache/maven/plugins/shade/resource/properties/io/NoCloseOutputStream.java
@@ -22,7 +22,7 @@
import java.io.OutputStream;
/**
- * Simple output stream replacing close call by a simpe flush.
+ * Simple output stream replacing close call by a simple flush.
* Useful for output streams nesting streams (like jar output streams) and using a stream encoder.
*/
public class NoCloseOutputStream extends OutputStream {