From 5c5bdf0cfaaede7f26087f354d4610026d25d6b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9lios=20GILLES?= Date: Sat, 24 Oct 2026 20:56:52 +0200 Subject: [PATCH] Fix ECJ -proc option without explicit processors -proc: was only added inside the block guarding explicit annotation processors and processor paths. With none (or only) and none of those options set, the option was therefore silently dropped and ECJ still discovered processors from META-INF/services on the classpath. Move the -proc handling after that conditional block, while keeping it in the Java 6+ branch. Behavior without proc is unchanged, and explicit processor arguments keep their existing order. Add regression tests using real ECJ compilations for -proc:none (invalid service provider must not be loaded) and -proc:only (sources must not be compiled). --- .../compiler/eclipse/EclipseJavaCompiler.java | 6 +- .../eclipse/EclipseJavaCompilerTest.java | 60 +++++++++++++++++++ 2 files changed, 63 insertions(+), 3 deletions(-) diff --git a/plexus-compilers/plexus-compiler-eclipse/src/main/java/org/codehaus/plexus/compiler/eclipse/EclipseJavaCompiler.java b/plexus-compilers/plexus-compiler-eclipse/src/main/java/org/codehaus/plexus/compiler/eclipse/EclipseJavaCompiler.java index bee72a0fc..d0abe0fec 100644 --- a/plexus-compilers/plexus-compiler-eclipse/src/main/java/org/codehaus/plexus/compiler/eclipse/EclipseJavaCompiler.java +++ b/plexus-compilers/plexus-compiler-eclipse/src/main/java/org/codehaus/plexus/compiler/eclipse/EclipseJavaCompiler.java @@ -198,10 +198,10 @@ public CompilerResult performCompile(CompilerConfiguration config) throws Compil args.add("--processor-module-path"); args.add(getPathString(processorModulePathEntries)); } + } - if (config.getProc() != null) { - args.add("-proc:" + config.getProc()); - } + if (config.getProc() != null) { + args.add("-proc:" + config.getProc()); } } diff --git a/plexus-compilers/plexus-compiler-eclipse/src/test/java/org/codehaus/plexus/compiler/eclipse/EclipseJavaCompilerTest.java b/plexus-compilers/plexus-compiler-eclipse/src/test/java/org/codehaus/plexus/compiler/eclipse/EclipseJavaCompilerTest.java index 470eb57c2..fe65573fe 100644 --- a/plexus-compilers/plexus-compiler-eclipse/src/test/java/org/codehaus/plexus/compiler/eclipse/EclipseJavaCompilerTest.java +++ b/plexus-compilers/plexus-compiler-eclipse/src/test/java/org/codehaus/plexus/compiler/eclipse/EclipseJavaCompilerTest.java @@ -1,16 +1,27 @@ package org.codehaus.plexus.compiler.eclipse; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.List; import java.util.stream.Stream; +import org.codehaus.plexus.compiler.CompilerConfiguration; +import org.codehaus.plexus.compiler.CompilerResult; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import static java.util.Arrays.asList; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; class EclipseJavaCompilerTest { + @TempDir + Path tempDir; + @ParameterizedTest @MethodSource("sources") void testReorderedSources(List expected, List inputSources) { @@ -19,6 +30,55 @@ void testReorderedSources(List expected, List inputSources) { assertEquals(expected, resorted); } + @Test + void procNoneDisablesAnnotationProcessorDiscoveryWithoutExplicitProcessors() throws Exception { + Path sourceDirectory = tempDir.resolve("src"); + Path sourceFile = sourceDirectory.resolve("demo/Example.java"); + Files.createDirectories(sourceFile.getParent()); + Files.writeString(sourceFile, "package demo;\n\npublic class Example {}\n"); + + Path outputDirectory = tempDir.resolve("classes"); + Files.createDirectories(outputDirectory); + Path serviceFile = outputDirectory.resolve("META-INF/services/javax.annotation.processing.Processor"); + Files.createDirectories(serviceFile.getParent()); + Files.writeString(serviceFile, "demo.MissingProcessor\n"); + + CompilerConfiguration config = new CompilerConfiguration(); + config.setSourceVersion("17"); + config.addSourceLocation(sourceDirectory.toString()); + config.setOutputLocation(outputDirectory.toString()); + config.setProc("none"); + + CompilerResult result = new EclipseJavaCompiler().performCompile(config); + + assertTrue(result.isSuccess(), () -> "Compilation failed: " + result.getCompilerMessages()); + assertTrue(Files.exists(outputDirectory.resolve("demo/Example.class")), "Sources should still be compiled"); + } + + @Test + void procOnlyIsPassedToEcjWithoutExplicitProcessors() throws Exception { + Path sourceDirectory = tempDir.resolve("src"); + Path sourceFile = sourceDirectory.resolve("demo/Only.java"); + Files.createDirectories(sourceFile.getParent()); + Files.writeString(sourceFile, "package demo;\n\npublic class Only {}\n"); + + Path outputDirectory = tempDir.resolve("only-classes"); + Files.createDirectories(outputDirectory); + + CompilerConfiguration config = new CompilerConfiguration(); + config.setSourceVersion("17"); + config.addSourceLocation(sourceDirectory.toString()); + config.setOutputLocation(outputDirectory.toString()); + config.setProc("only"); + + CompilerResult result = new EclipseJavaCompiler().performCompile(config); + + assertTrue(result.isSuccess(), () -> "Compilation failed: " + result.getCompilerMessages()); + assertFalse( + Files.exists(outputDirectory.resolve("demo/Only.class")), + "-proc:only should run annotation processing without compiling sources"); + } + static Stream sources() { List expectedOrder = asList("module-info.java", "plexus/A.java", "plexus/B.java", "eclipse/A.java");