This is an automated email from the ASF dual-hosted git repository.

elharo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-dependency-plugin.git


The following commit(s) were added to refs/heads/master by this push:
     new d4ae6aef Fix `analyze-exclusions` crashes if there is no 
`dependencyManagement` element (#1597)
d4ae6aef is described below

commit d4ae6aef6152a4211206caf808914ad8951f2443
Author: Jack Green <[email protected]>
AuthorDate: Mon Mar 30 14:29:20 2026 +0100

    Fix `analyze-exclusions` crashes if there is no `dependencyManagement` 
element (#1597)
    
    * Fix `analyze-exclusions` crashes if there is no `dependencyManagement 
element
    
    As reported in 
https://github.com/apache/maven-dependency-plugin/issues/1474, when executed on 
a project without a `dependencyManagement` tag defined, an exception is thrown:
    
    ```
    [ERROR] Failed to execute goal 
org.apache.maven.plugins:maven-dependency-plugin:3.10.0:analyze-exclusions 
(default-cli) on project reproducer: Execution default-cli of goal 
org.apache.maven.plugins:maven-dependency-plugin:3.10.0:analyze-exclusions 
failed: Cannot invoke 
"org.apache.maven.model.DependencyManagement.getDependencies()" because the 
return value of 
"org.apache.maven.project.MavenProject.getDependencyManagement()" is null -> 
[Help 1]
    org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute 
goal org.apache.maven.plugins:maven-dependency-plugin:3.10.0:analyze-exclusions 
(default-cli) on project reproducer: Execution default-cli of goal 
org.apache.maven.plugins:maven-dependency-plugin:3.10.0:analyze-exclusions 
failed: Cannot invoke 
"org.apache.maven.model.DependencyManagement.getDependencies()" because the 
return value of 
"org.apache.maven.project.MavenProject.getDependencyManagement()" is null
    {...}
    Caused by: java.lang.NullPointerException: Cannot invoke 
"org.apache.maven.model.DependencyManagement.getDependencies()" because the 
return value of 
"org.apache.maven.project.MavenProject.getDependencyManagement()" is null
        at 
org.apache.maven.plugins.dependency.exclusion.AnalyzeExclusionsMojo.execute 
(AnalyzeExclusionsMojo.java:106)
        at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo 
(DefaultBuildPluginManager.java:126)
        at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 
(MojoExecutor.java:328)
        at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute 
(MojoExecutor.java:316)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute 
(MojoExecutor.java:212)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute 
(MojoExecutor.java:174)
        at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 
(MojoExecutor.java:75)
        at org.apache.maven.lifecycle.internal.MojoExecutor$1.run 
(MojoExecutor.java:162)
        at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute 
(DefaultMojosExecutionStrategy.java:39)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute 
(MojoExecutor.java:159)
        at 
org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject 
(LifecycleModuleBuilder.java:105)
        at 
org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject 
(LifecycleModuleBuilder.java:73)
        at 
org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build
 (SingleThreadedBuilder.java:53)
        at org.apache.maven.lifecycle.internal.LifecycleStarter.execute 
(LifecycleStarter.java:118)
        at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:261)
        at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:173)
        at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:101)
        at org.apache.maven.cli.MavenCli.execute (MavenCli.java:919)
        at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:285)
        at org.apache.maven.cli.MavenCli.main (MavenCli.java:207)
        at jdk.internal.reflect.DirectMethodHandleAccessor.invoke 
(DirectMethodHandleAccessor.java:103)
        at java.lang.reflect.Method.invoke (Method.java:580)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced 
(Launcher.java:255)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launch 
(Launcher.java:201)
        at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode 
(Launcher.java:361)
        at org.codehaus.plexus.classworlds.launcher.Launcher.main 
(Launcher.java:314)
    ```
    
    When executing `analyze-exclusions`, we simply assume 
`getDependencyManagement` returns non-`null`.
    Whereas in other mojos a more cautious approach is taken, e.g.:
    
https://github.com/apache/maven-dependency-plugin/blob/a99bc570747b2623a4f3e5ca5a3dc98e379bd58b/src/main/java/org/apache/maven/plugins/dependency/analyze/AnalyzeDepMgt.java#L118-L123
    
    Updated this mojo (and corresponding test) to suit.
    
    Fixes: https://github.com/apache/maven-dependency-plugin/issues/1474
    
    * Add tests
    
    As requested in 
https://github.com/apache/maven-dependency-plugin/pull/1597#discussion_r3006620619
    
    * Spotless changes
    
    * Simplify test
---
 .../exclusion/AnalyzeExclusionsMojo.java           | 22 +++++++++-----
 .../exclusion/AnalyzeExclusionsMojoTest.java       | 34 +++++++++++++++++++---
 2 files changed, 45 insertions(+), 11 deletions(-)

diff --git 
a/src/main/java/org/apache/maven/plugins/dependency/exclusion/AnalyzeExclusionsMojo.java
 
b/src/main/java/org/apache/maven/plugins/dependency/exclusion/AnalyzeExclusionsMojo.java
index e45c76c4..16450505 100644
--- 
a/src/main/java/org/apache/maven/plugins/dependency/exclusion/AnalyzeExclusionsMojo.java
+++ 
b/src/main/java/org/apache/maven/plugins/dependency/exclusion/AnalyzeExclusionsMojo.java
@@ -31,6 +31,7 @@ import java.util.function.Consumer;
 import org.apache.maven.RepositoryUtils;
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.model.Dependency;
+import org.apache.maven.model.DependencyManagement;
 import org.apache.maven.model.Exclusion;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
@@ -103,14 +104,21 @@ public class AnalyzeExclusionsMojo extends AbstractMojo {
 
         Map<Coordinates, Collection<Exclusion>> dependenciesWithExclusions = 
new HashMap<>();
 
-        project.getDependencyManagement().getDependencies().forEach(dependency 
-> {
-            Collection<Exclusion> exclusions = 
getExclusionsForDependency(dependency);
-            if (!exclusions.isEmpty()) {
-                dependenciesWithExclusions
-                        .computeIfAbsent(coordinates(dependency), d -> new 
ArrayList<>())
-                        .addAll(exclusions);
+        DependencyManagement depMgt = project.getDependencyManagement();
+        if (depMgt != null) {
+            List<Dependency> depMgtDependencies = depMgt.getDependencies();
+
+            if (depMgtDependencies != null) {
+                depMgtDependencies.forEach(dependency -> {
+                    Collection<Exclusion> exclusions = 
getExclusionsForDependency(dependency);
+                    if (!exclusions.isEmpty()) {
+                        dependenciesWithExclusions
+                                .computeIfAbsent(coordinates(dependency), d -> 
new ArrayList<>())
+                                .addAll(exclusions);
+                    }
+                });
             }
-        });
+        }
 
         project.getDependencies().forEach(dependency -> {
             Collection<Exclusion> exclusions = 
getExclusionsForDependency(dependency);
diff --git 
a/src/test/java/org/apache/maven/plugins/dependency/exclusion/AnalyzeExclusionsMojoTest.java
 
b/src/test/java/org/apache/maven/plugins/dependency/exclusion/AnalyzeExclusionsMojoTest.java
index 484f0207..95616bfd 100644
--- 
a/src/test/java/org/apache/maven/plugins/dependency/exclusion/AnalyzeExclusionsMojoTest.java
+++ 
b/src/test/java/org/apache/maven/plugins/dependency/exclusion/AnalyzeExclusionsMojoTest.java
@@ -85,10 +85,6 @@ class AnalyzeExclusionsMojoTest {
         when(project.getArtifactId()).thenReturn("testArtifactId");
         when(project.getVersion()).thenReturn("1.0.0");
 
-        DependencyManagement dependencyManagement = 
mock(DependencyManagement.class);
-        
when(dependencyManagement.getDependencies()).thenReturn(Collections.emptyList());
-        
when(project.getDependencyManagement()).thenReturn(dependencyManagement);
-
         lenient().when(mavenSession.getRepositorySession()).thenReturn(new 
DefaultRepositorySystemSession());
     }
 
@@ -197,6 +193,36 @@ class AnalyzeExclusionsMojoTest {
         verify(testLog).warn("projectName defines following unnecessary 
excludes");
     }
 
+    /**
+     * Nullability behavior of {@link MavenProject#getDependencyManagement} is 
not documented, test mojo with both {@code null}
+     * and non-{@code null} outputs
+     *
+     * @see <a 
href="https://github.com/apache/maven-dependency-plugin/issues/1474";>Issue</a>
+     */
+    @Test
+    @InjectMojo(goal = "analyze-exclusions")
+    void testMojoWithProjectDependencyManagementNull(AnalyzeExclusionsMojo 
mojo) {
+        // Default behavior specified explicitly for clarity
+        when(project.getDependencyManagement()).thenReturn(null);
+
+        assertThatCode(mojo::execute).doesNotThrowAnyException();
+    }
+
+    /**
+     * Nullability behavior of {@link MavenProject#getDependencyManagement} is 
not documented, test mojo with both {@code null}
+     * and non-{@code null} outputs
+     *
+     * @see <a 
href="https://github.com/apache/maven-dependency-plugin/issues/1474";>Issue</a>
+     */
+    @Test
+    @InjectMojo(goal = "analyze-exclusions")
+    void testMojoWithProjectDependencyManagementEmpty(AnalyzeExclusionsMojo 
mojo) {
+        DependencyManagement dependencyManagement = 
mock(DependencyManagement.class);
+        
lenient().when(dependencyManagement.getDependencies()).thenReturn(Collections.emptyList());
+
+        assertThatCode(mojo::execute).doesNotThrowAnyException();
+    }
+
     private Dependency dependency(String groupId, String artifactId) {
         Dependency dependency = new Dependency();
         dependency.setGroupId(groupId);

Reply via email to