From 861f89f7c100fa01ad3283aa1e58c285ab9e12c6 Mon Sep 17 00:00:00 2001 From: Abdullah <89297042+AzazelSensei@users.noreply.github.com> Date: Mon, 24 Aug 2026 08:54:53 +0000 Subject: [PATCH] Fail clearly when configureLocator has no project POM #275 configureLocator ran outside the execute try/finally and called project.getFile().getParentFile() without a null check. Move it inside the guarded block and throw MojoExecutionException when the project has no POM file. --- .../AbstractProcessRemoteResourcesMojo.java | 11 +++++++---- .../remote/RemoteResourcesMojoTest.java | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/apache/maven/plugin/resources/remote/AbstractProcessRemoteResourcesMojo.java b/src/main/java/org/apache/maven/plugin/resources/remote/AbstractProcessRemoteResourcesMojo.java index 15d3ce3..b5974fc 100644 --- a/src/main/java/org/apache/maven/plugin/resources/remote/AbstractProcessRemoteResourcesMojo.java +++ b/src/main/java/org/apache/maven/plugin/resources/remote/AbstractProcessRemoteResourcesMojo.java @@ -424,10 +424,9 @@ public void execute() throws MojoExecutionException { } } - configureLocator(); - ClassLoader origLoader = Thread.currentThread().getContextClassLoader(); try { + configureLocator(); validate(); List resourceBundleArtifacts = downloadBundles(resourceBundles); @@ -495,8 +494,12 @@ private void configureLocator() throws MojoExecutionException { } } - locator.addSearchPath( - FileResourceLoader.ID, project.getFile().getParentFile().getAbsolutePath()); + File projectFile = project.getFile(); + if (projectFile == null) { + throw new MojoExecutionException( + "The current project has no POM file; cannot configure the resource locator."); + } + locator.addSearchPath(FileResourceLoader.ID, projectFile.getParentFile().getAbsolutePath()); if (appendedResourcesDirectory != null) { locator.addSearchPath(FileResourceLoader.ID, appendedResourcesDirectory.getAbsolutePath()); } diff --git a/src/test/java/org/apache/maven/plugin/resources/remote/RemoteResourcesMojoTest.java b/src/test/java/org/apache/maven/plugin/resources/remote/RemoteResourcesMojoTest.java index 583732b..49ee41f 100644 --- a/src/test/java/org/apache/maven/plugin/resources/remote/RemoteResourcesMojoTest.java +++ b/src/test/java/org/apache/maven/plugin/resources/remote/RemoteResourcesMojoTest.java @@ -41,6 +41,7 @@ import org.apache.maven.execution.DefaultMavenExecutionRequest; import org.apache.maven.execution.DefaultMavenExecutionResult; import org.apache.maven.execution.MavenSession; +import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.resources.remote.stub.MavenProjectBuildStub; import org.apache.maven.plugin.resources.remote.stub.MavenProjectResourcesStub; import org.apache.maven.plugin.testing.AbstractMojoTestCase; @@ -91,6 +92,21 @@ public void testNoBundles() throws Exception { mojo.execute(); } + public void testConfigureLocatorRequiresProjectFile() throws Exception { + final MavenProjectResourcesStub project = createTestProject("default-null-pom"); + final ProcessRemoteResourcesMojo mojo = lookupProcessMojoWithDefaultSettings(project); + + setupDefaultProject(project); + project.setFile(null); + + try { + mojo.execute(); + fail("expected MojoExecutionException when the project has no POM file"); + } catch (MojoExecutionException e) { + assertTrue(e.getMessage().contains("no POM file")); + } + } + public void testCreateBundle() throws Exception { List resources = Arrays.asList("FILTER.txt.vm", "ISO-8859-1.bin.vm", "PROPERTIES.txt.vm", "SIMPLE.txt", "UTF-8.bin.vm");