diff --git a/plexus-compilers/plexus-compiler-eclipse/pom.xml b/plexus-compilers/plexus-compiler-eclipse/pom.xml
index 3374608d..a0e6fe68 100644
--- a/plexus-compilers/plexus-compiler-eclipse/pom.xml
+++ b/plexus-compilers/plexus-compiler-eclipse/pom.xml
@@ -36,6 +36,11 @@
junit-jupiter-api
test
+
+ org.junit.jupiter
+ junit-jupiter-params
+ test
+
org.hamcrest
hamcrest
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 04673009..b4674197 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
@@ -262,6 +262,8 @@ public CompilerResult performCompile( CompilerConfiguration config )
return new CompilerResult( true, messageList );
}
+ allSources = resortSourcesToPutModuleInfoFirst( allSources );
+
// Compile
try
{
@@ -476,6 +478,29 @@ public void worked( int i, int i1 )
}
}
+ static List resortSourcesToPutModuleInfoFirst( List allSources )
+ {
+ ArrayList resorted = new ArrayList<>();
+
+ for ( String mi : allSources )
+ {
+ if ( mi.endsWith( "module-info.java" ) )
+ {
+ resorted.add( mi );
+ }
+ }
+
+ for ( String nmi : allSources )
+ {
+ if ( !nmi.endsWith( "module-info.java") )
+ {
+ resorted.add( nmi );
+ }
+ }
+
+ return resorted;
+ }
+
static boolean processCustomArguments( CompilerConfiguration config, List args )
{
boolean result = false;
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
new file mode 100644
index 00000000..095efe64
--- /dev/null
+++ b/plexus-compilers/plexus-compiler-eclipse/src/test/java/org/codehaus/plexus/compiler/eclipse/EclipseJavaCompilerTest.java
@@ -0,0 +1,60 @@
+package org.codehaus.plexus.compiler.eclipse;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+
+import java.util.List;
+import java.util.stream.Stream;
+
+import static java.util.Arrays.asList;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class EclipseJavaCompilerTest
+{
+ @ParameterizedTest
+ @MethodSource( "sources" )
+ void testReorderedSources( List expected, List inputSources )
+ {
+ List resorted = EclipseJavaCompiler.resortSourcesToPutModuleInfoFirst( inputSources );
+
+ assertEquals( expected, resorted );
+ }
+
+ static Stream sources()
+ {
+ List expectedOrder = asList(
+ "module-info.java",
+ "plexus/A.java",
+ "plexus/B.java",
+ "eclipse/A.java"
+ );
+
+ List moduleInfoAlreadyFirst = asList(
+ "module-info.java",
+ "plexus/A.java",
+ "plexus/B.java",
+ "eclipse/A.java"
+ );
+
+ List moduleInfoSomewhereInTheMiddle = asList(
+ "plexus/A.java",
+ "module-info.java",
+ "plexus/B.java",
+ "eclipse/A.java"
+ );
+
+ List moduleInfoAsLast = asList(
+ "plexus/A.java",
+ "plexus/B.java",
+ "eclipse/A.java",
+ "module-info.java"
+ );
+
+ return Stream.of(
+ Arguments.arguments( expectedOrder, moduleInfoAlreadyFirst ),
+ Arguments.arguments( expectedOrder, moduleInfoSomewhereInTheMiddle ),
+ Arguments.arguments( expectedOrder, moduleInfoAsLast )
+ );
+ }
+}