diff --git a/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/LocationManager.java b/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/LocationManager.java index a5b2f50..8b8b72b 100644 --- a/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/LocationManager.java +++ b/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/LocationManager.java @@ -262,6 +262,12 @@ public String extract(Path path) throws IOException { .put( entry.getKey(), moduleNameSources.get(entry.getValue().name())); + } else { + result.getPathExceptions() + .put( + entry.getKey(), + new IllegalStateException( + "Module '" + entry.getValue().name() + "' is already on the module path!")); } } else { result.getClasspathElements().add(entry.getKey()); diff --git a/plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/LocationManagerTest.java b/plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/LocationManagerTest.java index acd825d..92444e7 100644 --- a/plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/LocationManagerTest.java +++ b/plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/LocationManagerTest.java @@ -161,6 +161,36 @@ void testIdenticalModuleNames() throws Exception { ResolvePathsRequest request = ResolvePathsRequest.ofPaths(Arrays.asList(pj1, pj2)).setMainModuleDescriptor(mockModuleInfoJava); + when(asmParser.getModuleDescriptor(pj1)) + .thenReturn(JavaModuleDescriptor.newModule("plexus.java").build()); + when(asmParser.getModuleDescriptor(pj2)) + .thenReturn(JavaModuleDescriptor.newModule("plexus.java").build()); + + ResolvePathsResult result = locationManager.resolvePaths(request); + + assertThat(result.getMainModuleDescriptor()).isEqualTo(descriptor); + assertThat(result.getPathElements()).hasSize(2); + assertThat(result.getModulepathElements()).hasSize(1); + assertThat(result.getModulepathElements()).containsKey(pj1); + assertThat(result.getModulepathElements()).doesNotContainKey(pj2); + assertThat(result.getClasspathElements()).isEmpty(); + // duplicate is flagged as an error + assertThat(result.getPathExceptions()).containsOnlyKeys(pj2); + assertThat(result.getPathExceptions().get(pj2)) + .isInstanceOf(IllegalStateException.class) + .hasMessageContaining("Module 'plexus.java' is already on the module path!"); + } + + @Test + public void testIdenticalAutomaticModuleNames() throws Exception { + Path pj1 = Paths.get("src/test/resources/jar.empty/plexus-java-1.0.0-SNAPSHOT.jar"); + Path pj2 = Paths.get("src/test/resources/jar.empty.2/plexus-java-2.0.0-SNAPSHOT.jar"); + JavaModuleDescriptor descriptor = + JavaModuleDescriptor.newModule("base").requires("plexus.java").build(); + when(qdoxParser.fromSourcePath(any(Path.class))).thenReturn(descriptor); + ResolvePathsRequest request = + ResolvePathsRequest.ofPaths(Arrays.asList(pj1, pj2)).setMainModuleDescriptor(mockModuleInfoJava); + when(asmParser.getModuleDescriptor(pj1)) .thenReturn( JavaModuleDescriptor.newAutomaticModule("plexus.java").build()); @@ -173,8 +203,42 @@ void testIdenticalModuleNames() throws Exception { assertThat(result.getPathElements()).hasSize(2); assertThat(result.getModulepathElements()).containsOnlyKeys(pj1); assertThat(result.getModulepathElements()).doesNotContainKey(pj2); - assertThat(result.getClasspathElements()).hasSize(0); - assertThat(result.getPathExceptions()).hasSize(0); + assertThat(result.getClasspathElements()).isEmpty(); + // duplicate is flagged as an error + assertThat(result.getPathExceptions()).containsOnlyKeys(pj2); + assertThat(result.getPathExceptions().get(pj2)) + .isInstanceOf(IllegalStateException.class) + .hasMessageContaining("Module 'plexus.java' is already on the module path!"); + } + + @Test + public void testMainJarModuleAndTestJarAutomatic() throws Exception { + Path pj1 = Paths.get("src/test/resources/jar.tests/plexus-java-1.0.0-SNAPSHOT.jar"); + Path pj2 = Paths.get("src/test/resources/jar.tests/plexus-java-1.0.0-SNAPSHOT-tests.jar"); + JavaModuleDescriptor descriptor = + JavaModuleDescriptor.newModule("base").requires("plexus.java").build(); + when(qdoxParser.fromSourcePath(any(Path.class))).thenReturn(descriptor); + ResolvePathsRequest request = + ResolvePathsRequest.ofPaths(Arrays.asList(pj1, pj2)).setMainModuleDescriptor(mockModuleInfoJava); + + when(asmParser.getModuleDescriptor(pj1)) + .thenReturn(JavaModuleDescriptor.newModule("plexus.java").build()); + when(asmParser.getModuleDescriptor(pj2)).thenReturn(null); + + ResolvePathsResult result = locationManager.resolvePaths(request); + + assertThat(result.getMainModuleDescriptor()).isEqualTo(descriptor); + assertThat(result.getPathElements()).hasSize(2); + assertThat(result.getModulepathElements()).hasSize(1); + assertThat(result.getModulepathElements()).containsKey(pj1); + assertThat(result.getModulepathElements()).doesNotContainKey(pj2); + assertThat(result.getClasspathElements()).isEmpty(); + + // duplicate is flagged as an error + assertThat(result.getPathExceptions()).containsOnlyKeys(pj2); + assertThat(result.getPathExceptions().get(pj2)) + .isInstanceOf(IllegalStateException.class) + .hasMessageContaining("Module 'plexus.java' is already on the module path!"); } @Test @@ -473,9 +537,13 @@ void testDuplicateModule() throws Exception { ResolvePathsResult result = locationManager.resolvePaths(request); assertThat(result.getPathElements()).hasSize(2); assertThat(result.getModulepathElements()).containsOnlyKeys(moduleB); - // with current default the duplicate will be ignored assertThat(result.getClasspathElements()).hasSize(0); - assertThat(result.getPathExceptions()).hasSize(0); + assertThat(result.getPathExceptions()).hasSize(1); + // duplicate (module B / module C) is flagged as an error + assertThat(result.getPathExceptions()).containsOnlyKeys(moduleC); + assertThat(result.getPathExceptions().get(moduleC)) + .isInstanceOf(IllegalStateException.class) + .hasMessageContaining("Module 'anonymous' is already on the module path!"); } @Test diff --git a/plexus-java/src/test/resources/jar.tests/plexus-java-1.0.0-SNAPSHOT-tests.jar b/plexus-java/src/test/resources/jar.tests/plexus-java-1.0.0-SNAPSHOT-tests.jar new file mode 100644 index 0000000..a6afd0f Binary files /dev/null and b/plexus-java/src/test/resources/jar.tests/plexus-java-1.0.0-SNAPSHOT-tests.jar differ diff --git a/plexus-java/src/test/resources/jar.tests/plexus-java-1.0.0-SNAPSHOT.jar b/plexus-java/src/test/resources/jar.tests/plexus-java-1.0.0-SNAPSHOT.jar new file mode 100644 index 0000000..413ae96 Binary files /dev/null and b/plexus-java/src/test/resources/jar.tests/plexus-java-1.0.0-SNAPSHOT.jar differ