From 25e25939a2992afbee85141225a0b69bdf3cd6b2 Mon Sep 17 00:00:00 2001 From: rfscholte Date: Tue, 27 Oct 2020 23:38:21 +0100 Subject: [PATCH 1/2] read of JPMS multi-release jars fails if a newer version than supported is present --- .../jpms/AbstractBinaryModuleInfoParser.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/AbstractBinaryModuleInfoParser.java b/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/AbstractBinaryModuleInfoParser.java index 90854c4..122ab2c 100644 --- a/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/AbstractBinaryModuleInfoParser.java +++ b/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/AbstractBinaryModuleInfoParser.java @@ -23,16 +23,14 @@ import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Enumeration; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.jar.Manifest; -import java.util.regex.Pattern; + +import org.codehaus.plexus.languages.java.version.JavaVersion; abstract class AbstractBinaryModuleInfoParser implements ModuleInfoParser { - private static final Pattern MRJAR_DESCRIPTOR = Pattern.compile( "META-INF/versions/[^/]+/module-info.class" ); - @Override public JavaModuleDescriptor getModuleDescriptor( Path modulePath ) throws IOException @@ -64,12 +62,14 @@ public JavaModuleDescriptor getModuleDescriptor( Path modulePath ) if ( manifest != null && "true".equalsIgnoreCase( manifest.getMainAttributes().getValue( "Multi-Release" ) ) ) { - // look for multirelease descriptor - Enumeration entryIter = jarFile.entries(); - while ( entryIter.hasMoreElements() ) + // @todo in case of request.jdkHome the version should be extracted via commandline + int javaVersion = Integer.valueOf( JavaVersion.JAVA_SPECIFICATION_VERSION.getValue( 1 ) ); + + for ( int version = javaVersion; version >= 9; version-- ) { - JarEntry entry = entryIter.nextElement(); - if ( MRJAR_DESCRIPTOR.matcher( entry.getName() ).matches() ) + String resource = "META-INF/versions/" + version + "/module-info.class"; + JarEntry entry = jarFile.getJarEntry( resource ); + if ( entry != null ) { moduleInfo = entry; break; From 345ffc1bbfdefe8917039c7ea17180362668fe15 Mon Sep 17 00:00:00 2001 From: rfscholte Date: Wed, 28 Oct 2020 00:16:34 +0100 Subject: [PATCH 2/2] Add JavaVersion as parameter, so you can select the preferred module descriptor in case of multi release jar --- .../java/jpms/AbstractBinaryModuleInfoParser.java | 10 ++++++++-- .../languages/java/jpms/ModuleInfoParser.java | 14 +++++++++++++- .../java/jpms/BinaryModuleInfoParserTest.java | 3 ++- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/AbstractBinaryModuleInfoParser.java b/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/AbstractBinaryModuleInfoParser.java index 122ab2c..3b58137 100644 --- a/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/AbstractBinaryModuleInfoParser.java +++ b/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/AbstractBinaryModuleInfoParser.java @@ -34,6 +34,13 @@ abstract class AbstractBinaryModuleInfoParser implements ModuleInfoParser @Override public JavaModuleDescriptor getModuleDescriptor( Path modulePath ) throws IOException + { + return getModuleDescriptor( modulePath, JavaVersion.JAVA_SPECIFICATION_VERSION ); + } + + @Override + public JavaModuleDescriptor getModuleDescriptor( Path modulePath, JavaVersion jdkVersion ) + throws IOException { JavaModuleDescriptor descriptor; if ( Files.isDirectory( modulePath ) ) @@ -62,8 +69,7 @@ public JavaModuleDescriptor getModuleDescriptor( Path modulePath ) if ( manifest != null && "true".equalsIgnoreCase( manifest.getMainAttributes().getValue( "Multi-Release" ) ) ) { - // @todo in case of request.jdkHome the version should be extracted via commandline - int javaVersion = Integer.valueOf( JavaVersion.JAVA_SPECIFICATION_VERSION.getValue( 1 ) ); + int javaVersion = Integer.valueOf( jdkVersion.asMajor().getValue( 1 ) ); for ( int version = javaVersion; version >= 9; version-- ) { diff --git a/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/ModuleInfoParser.java b/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/ModuleInfoParser.java index 4791bf2..f0ed02e 100644 --- a/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/ModuleInfoParser.java +++ b/plexus-java/src/main/java/org/codehaus/plexus/languages/java/jpms/ModuleInfoParser.java @@ -22,6 +22,8 @@ import java.io.IOException; import java.nio.file.Path; +import org.codehaus.plexus.languages.java.version.JavaVersion; + /** * Extract information from the module-info file * @@ -37,6 +39,16 @@ interface ModuleInfoParser * @return the module descriptor * @throws IOException when the file could not be parsed */ - JavaModuleDescriptor getModuleDescriptor( Path modulePath ) + JavaModuleDescriptor getModuleDescriptor( Path modulePath ) throws IOException; + + /** + * Extracts the name from the module-info file + * + * @param modulePath the path to the {@code module-info.class} + * @param javaVersion the java version in case of a multirelease jar + * @return the module descriptor + * @throws IOException when the file could not be parsed + */ + JavaModuleDescriptor getModuleDescriptor( Path modulePath, JavaVersion javaVersion ) throws IOException; } \ No newline at end of file diff --git a/plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParserTest.java b/plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParserTest.java index a70daa4..9279540 100644 --- a/plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParserTest.java +++ b/plexus-java/src/test/java/org/codehaus/plexus/languages/java/jpms/BinaryModuleInfoParserTest.java @@ -38,6 +38,7 @@ import org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor.JavaExports; import org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor.JavaProvides; import org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor.JavaRequires; +import org.codehaus.plexus.languages.java.version.JavaVersion; import org.junit.Test; public class BinaryModuleInfoParserTest @@ -67,7 +68,7 @@ public void testJarDescriptor() throws Exception @Test public void testMultiReleaseJarDescriptor() throws Exception { - JavaModuleDescriptor descriptor = parser.getModuleDescriptor( Paths.get( "src/test/resources/jar.mr.descriptor/jloadr-1.0-SNAPSHOT.jar" ) ); + JavaModuleDescriptor descriptor = parser.getModuleDescriptor( Paths.get( "src/test/resources/jar.mr.descriptor/jloadr-1.0-SNAPSHOT.jar" ), JavaVersion.parse( "17" ) ); assertNotNull( descriptor); assertEquals( "de.adito.jloadr", descriptor.name() );