Skip to content

Commit d4ae6ae

Browse files
authored
Fix analyze-exclusions crashes if there is no dependencyManagement element (#1597)
* Fix `analyze-exclusions` crashes if there is no `dependencyManagement element As reported in #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: #1474 * Add tests As requested in #1597 (comment) * Spotless changes * Simplify test
1 parent a99bc57 commit d4ae6ae

2 files changed

Lines changed: 45 additions & 11 deletions

File tree

src/main/java/org/apache/maven/plugins/dependency/exclusion/AnalyzeExclusionsMojo.java

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.apache.maven.RepositoryUtils;
3232
import org.apache.maven.execution.MavenSession;
3333
import org.apache.maven.model.Dependency;
34+
import org.apache.maven.model.DependencyManagement;
3435
import org.apache.maven.model.Exclusion;
3536
import org.apache.maven.plugin.AbstractMojo;
3637
import org.apache.maven.plugin.MojoExecutionException;
@@ -103,14 +104,21 @@ public void execute() throws MojoExecutionException {
103104

104105
Map<Coordinates, Collection<Exclusion>> dependenciesWithExclusions = new HashMap<>();
105106

106-
project.getDependencyManagement().getDependencies().forEach(dependency -> {
107-
Collection<Exclusion> exclusions = getExclusionsForDependency(dependency);
108-
if (!exclusions.isEmpty()) {
109-
dependenciesWithExclusions
110-
.computeIfAbsent(coordinates(dependency), d -> new ArrayList<>())
111-
.addAll(exclusions);
107+
DependencyManagement depMgt = project.getDependencyManagement();
108+
if (depMgt != null) {
109+
List<Dependency> depMgtDependencies = depMgt.getDependencies();
110+
111+
if (depMgtDependencies != null) {
112+
depMgtDependencies.forEach(dependency -> {
113+
Collection<Exclusion> exclusions = getExclusionsForDependency(dependency);
114+
if (!exclusions.isEmpty()) {
115+
dependenciesWithExclusions
116+
.computeIfAbsent(coordinates(dependency), d -> new ArrayList<>())
117+
.addAll(exclusions);
118+
}
119+
});
112120
}
113-
});
121+
}
114122

115123
project.getDependencies().forEach(dependency -> {
116124
Collection<Exclusion> exclusions = getExclusionsForDependency(dependency);

src/test/java/org/apache/maven/plugins/dependency/exclusion/AnalyzeExclusionsMojoTest.java

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,6 @@ void setUp() {
8585
when(project.getArtifactId()).thenReturn("testArtifactId");
8686
when(project.getVersion()).thenReturn("1.0.0");
8787

88-
DependencyManagement dependencyManagement = mock(DependencyManagement.class);
89-
when(dependencyManagement.getDependencies()).thenReturn(Collections.emptyList());
90-
when(project.getDependencyManagement()).thenReturn(dependencyManagement);
91-
9288
lenient().when(mavenSession.getRepositorySession()).thenReturn(new DefaultRepositorySystemSession());
9389
}
9490

@@ -197,6 +193,36 @@ void testThatLogContainProjectName(AnalyzeExclusionsMojo mojo) throws Exception
197193
verify(testLog).warn("projectName defines following unnecessary excludes");
198194
}
199195

196+
/**
197+
* Nullability behavior of {@link MavenProject#getDependencyManagement} is not documented, test mojo with both {@code null}
198+
* and non-{@code null} outputs
199+
*
200+
* @see <a href="https://github.com/apache/maven-dependency-plugin/issues/1474">Issue</a>
201+
*/
202+
@Test
203+
@InjectMojo(goal = "analyze-exclusions")
204+
void testMojoWithProjectDependencyManagementNull(AnalyzeExclusionsMojo mojo) {
205+
// Default behavior specified explicitly for clarity
206+
when(project.getDependencyManagement()).thenReturn(null);
207+
208+
assertThatCode(mojo::execute).doesNotThrowAnyException();
209+
}
210+
211+
/**
212+
* Nullability behavior of {@link MavenProject#getDependencyManagement} is not documented, test mojo with both {@code null}
213+
* and non-{@code null} outputs
214+
*
215+
* @see <a href="https://github.com/apache/maven-dependency-plugin/issues/1474">Issue</a>
216+
*/
217+
@Test
218+
@InjectMojo(goal = "analyze-exclusions")
219+
void testMojoWithProjectDependencyManagementEmpty(AnalyzeExclusionsMojo mojo) {
220+
DependencyManagement dependencyManagement = mock(DependencyManagement.class);
221+
lenient().when(dependencyManagement.getDependencies()).thenReturn(Collections.emptyList());
222+
223+
assertThatCode(mojo::execute).doesNotThrowAnyException();
224+
}
225+
200226
private Dependency dependency(String groupId, String artifactId) {
201227
Dependency dependency = new Dependency();
202228
dependency.setGroupId(groupId);

0 commit comments

Comments
 (0)