From 714fa9f8d0c72b9b6990429550e976d77561d17c Mon Sep 17 00:00:00 2001 From: rfscholte Date: Mon, 27 May 2019 23:29:27 +0200 Subject: [PATCH] #24 Indirect static required modules should stay on classpath --- .../languages/java/jpms/LocationManager.java | 15 ++++++++----- .../java/jpms/LocationManagerTest.java | 22 +++++++++++++++++++ 2 files changed, 32 insertions(+), 5 deletions(-) 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 8b49151..dbe91c3 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 @@ -259,7 +259,8 @@ public String extract( Path path ) selectRequires( mainModuleDescriptor, Collections.unmodifiableMap( availableNamedModules ), Collections.unmodifiableMap( availableProviders ), - requiredNamedModules ); + requiredNamedModules, + true ); } for ( String additionalModule : request.getAdditionalModules() ) @@ -373,11 +374,15 @@ private ResolvePathResult resolvePath( Path path, ModuleNameExtractor fileModule private void selectRequires( JavaModuleDescriptor module, Map availableModules, Map> availableProviders, - Set namedModules ) + Set namedModules, + boolean includeStatic ) { for ( JavaModuleDescriptor.JavaRequires requires : module.requires() ) { - selectModule( requires.name(), availableModules, availableProviders, namedModules ); + if ( includeStatic || !requires.modifiers​().contains( JavaModuleDescriptor.JavaRequires.JavaModifier.STATIC ) ) + { + selectModule( requires.name(), availableModules, availableProviders, namedModules ); + } } for ( String uses : module.uses() ) @@ -390,7 +395,7 @@ private void selectRequires( JavaModuleDescriptor module, if ( requiredModule != null && namedModules.add( providerModule ) ) { - selectRequires( requiredModule, availableModules, availableProviders, namedModules ); + selectRequires( requiredModule, availableModules, availableProviders, namedModules, false ); } } } @@ -404,7 +409,7 @@ private void selectModule( String module, Map avai if ( requiredModule != null && namedModules.add( module ) ) { - selectRequires( requiredModule, availableModules, availableProviders, namedModules ); + selectRequires( requiredModule, availableModules, availableProviders, namedModules, false ); } } 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 23afa47..f2350af 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 @@ -358,5 +358,27 @@ public void testParseModuleDescriptor() throws Exception assertThat( result.getModuleNameSource(), is( ModuleNameSource.MODULEDESCRIPTOR ) ); assertThat( result.getModuleDescriptor().name(), is( "a.b.c" ) ); } + + @Test + public void testTransitiveStatic() throws Exception + { + Path moduleA = Paths.get( "src/test/resources/mock/module-info.java" ); // some file called module-info.java + Path moduleB = Paths.get( "src/test/resources/mock/jar0.jar" ); // any existing file + Path moduleC = Paths.get( "src/test/resources/mock/jar1.jar" ); // any existing file + ResolvePathsRequest request = ResolvePathsRequest.ofPaths( moduleB, moduleC ).setMainModuleDescriptor( moduleA ); + + when( qdoxParser.fromSourcePath( moduleA ) ).thenReturn( JavaModuleDescriptor.newModule( "moduleA" ) + .requires( "moduleB" ).build() ); + when( asmParser.getModuleDescriptor( moduleB ) ).thenReturn( JavaModuleDescriptor.newModule( "moduleB" ) + .requires​( Collections.singleton( JavaModuleDescriptor.JavaRequires.JavaModifier.STATIC ), "moduleC" ).build() ); + when( asmParser.getModuleDescriptor( moduleC ) ).thenReturn( JavaModuleDescriptor.newModule( "moduleC" ).build() ); + + + ResolvePathsResult result = locationManager.resolvePaths( request ); + assertThat( result.getPathElements().size(), is( 2 ) ); + assertThat( result.getModulepathElements().size(), is( 1 ) ); + assertThat( result.getClasspathElements().size(), is( 1 ) ); + assertThat( result.getPathExceptions().size(), is( 0 ) ); + } }