This is an automated email from the ASF dual-hosted git repository. michaelo pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/maven-shared-jar.git
The following commit(s) were added to refs/heads/master by this push: new 6188c39 [MSHARED-1413] Review Multi-Release JAR analysis support 6188c39 is described below commit 6188c3975b20e84b3ea63421c51e52838cd0d17e Author: Gabriel Belingueres <belingue...@gmail.com> AuthorDate: Fri Jun 14 05:33:36 2024 +0200 [MSHARED-1413] Review Multi-Release JAR analysis support - Fix NumberFormatException - Added tests exposing the issue - Removed warning message in log - Make multi-release regex resoureless Co-authored-by: Michael Osipov <micha...@apache.org> This closes #41 --- .../shared/jar/classes/JarClassesAnalysis.java | 17 +----- .../shared/jar/classes/JarClassesAnalyzerTest.java | 67 +++++++++++++++++++-- .../jars/multi-release-resources-only-0.0.1.jar | Bin 0 -> 5582 bytes ...version-with-lower-jdk-revision-class-0.0.1.jar | Bin 0 -> 5299 bytes 4 files changed, 64 insertions(+), 20 deletions(-) diff --git a/src/main/java/org/apache/maven/shared/jar/classes/JarClassesAnalysis.java b/src/main/java/org/apache/maven/shared/jar/classes/JarClassesAnalysis.java index 1c6663f..de5777d 100644 --- a/src/main/java/org/apache/maven/shared/jar/classes/JarClassesAnalysis.java +++ b/src/main/java/org/apache/maven/shared/jar/classes/JarClassesAnalysis.java @@ -62,11 +62,11 @@ public class JarClassesAnalysis { /** * Constant representing the root content of a Multi-Release JAR file, thus outside of - * any given META-INF/versions/NN/... entry. + * any given META-INF/versions/N/... entry. */ private static final Integer ROOT = 0; - private static final Pattern ENTRY_FILTER_MULTI_RELEASE = Pattern.compile("^META-INF/versions/(\\d{1,2})/.+$"); + private static final Pattern ENTRY_FILTER_MULTI_RELEASE = Pattern.compile("^META-INF/versions/([1-9]\\d*)/.*$"); private static final Map<Double, String> JAVA_CLASS_VERSIONS; @@ -152,19 +152,6 @@ public class JarClassesAnalysis { JarClasses rootJarClasses = rootContentVersionedRuntime.getJarClasses(); jarData.setJarClasses(rootJarClasses); - // Paranoid? - for (Map.Entry<Integer, JarVersionedRuntime> runtimeVersionEntry : runtimeVersionsMap.entrySet()) { - Integer version = runtimeVersionEntry.getKey(); - String jdkRevision = runtimeVersionEntry.getValue().getJarClasses().getJdkRevision(); - if (!version.equals(Integer.valueOf(jdkRevision))) { - logger.warn( - "Multi-release version {} in JAR file '{}' has some class compiled for Jdk revision {}", - version, - jarFilename, - jdkRevision); - } - } - jarData.setVersionedRuntimes(new JarVersionedRuntimes(runtimeVersionsMap)); return rootJarClasses; diff --git a/src/test/java/org/apache/maven/shared/jar/classes/JarClassesAnalyzerTest.java b/src/test/java/org/apache/maven/shared/jar/classes/JarClassesAnalyzerTest.java index 3862712..be4f53f 100644 --- a/src/test/java/org/apache/maven/shared/jar/classes/JarClassesAnalyzerTest.java +++ b/src/test/java/org/apache/maven/shared/jar/classes/JarClassesAnalyzerTest.java @@ -154,7 +154,7 @@ class JarClassesAnalyzerTest extends AbstractJarAnalyzerTestCase { JarData jarData = getJarData("module-info-only-test-0.0.1.jar"); assertEquals(10, jarData.getNumEntries()); // root level information - assertEquals(9, jarData.getNumRootEntries()); + assertEquals(8, jarData.getNumRootEntries()); JarClasses jclass = jarData.getJarClasses(); assertTrue(jclass.getImports().isEmpty()); assertTrue(jclass.getPackages().isEmpty()); @@ -176,7 +176,7 @@ class JarClassesAnalyzerTest extends AbstractJarAnalyzerTestCase { assertEquals("", jarClasses11.getPackages().get(0)); assertEquals(1, jarClasses11.getClassNames().size()); assertTrue(jarClasses11.getMethods().isEmpty()); - assertEquals(1, jarVersionedRuntime11.getNumEntries()); + assertEquals(2, jarVersionedRuntime11.getNumEntries()); assertEntriesContains(jarVersionedRuntime11.getEntries(), "META-INF/versions/11/module-info.class"); } @@ -185,7 +185,7 @@ class JarClassesAnalyzerTest extends AbstractJarAnalyzerTestCase { JarData jarData = getJarData("multi-release-test-0.0.1.jar"); assertEquals(37, jarData.getNumEntries()); // root level information - assertEquals(19, jarData.getNumRootEntries()); + assertEquals(17, jarData.getNumRootEntries()); JarClasses jclass = jarData.getJarClasses(); assertEquals("1.8", jclass.getJdkRevision()); assertFalse(jclass.getImports().isEmpty()); @@ -207,7 +207,7 @@ class JarClassesAnalyzerTest extends AbstractJarAnalyzerTestCase { assertEquals(1, jarClasses9.getPackages().size()); assertEquals(1, jarClasses9.getClassNames().size()); assertFalse(jarClasses9.getMethods().isEmpty()); - assertEquals(9, jarVersionedRuntime9.getNumEntries()); + assertEquals(10, jarVersionedRuntime9.getNumEntries()); assertEntriesContains(jarVersionedRuntime9.getEntries(), "META-INF/versions/9/resource.txt"); JarVersionedRuntime jarVersionedRuntime11 = jarVersionedRuntimes.getJarVersionedRuntime(11); @@ -217,7 +217,7 @@ class JarClassesAnalyzerTest extends AbstractJarAnalyzerTestCase { assertEquals(1, jarClasses11.getPackages().size()); assertEquals(1, jarClasses11.getClassNames().size()); assertFalse(jarClasses11.getMethods().isEmpty()); - assertEquals(9, jarVersionedRuntime11.getNumEntries()); + assertEquals(10, jarVersionedRuntime11.getNumEntries()); assertEntriesContains(jarVersionedRuntime11.getEntries(), "META-INF/versions/11/resource.txt"); // test ordering @@ -300,6 +300,63 @@ class JarClassesAnalyzerTest extends AbstractJarAnalyzerTestCase { .getJdkRevision()); } + /** + * Exposes issue MSHARED-1413 + */ + @Test + public void testAnalyzeMultiReleaseJarWithVersion11HasALowerJdkRevisionClass() { + try { + // Version 11 has one class compiled to target Java 1.8 + JarData jarData = getJarData("multi-release-version-with-lower-jdk-revision-class-0.0.1.jar"); + JarClasses jclass = jarData.getJarClasses(); + + assertNull(jclass.getJdkRevision()); + + JarVersionedRuntimes jarVersionedRuntimes = jarData.getVersionedRuntimes(); + assertNotNull(jarVersionedRuntimes); + Map<Integer, JarVersionedRuntime> jarVersionedRuntimeMap = jarVersionedRuntimes.getVersionedRuntimeMap(); + assertNotNull(jarVersionedRuntimeMap); + assertEquals(1, jarVersionedRuntimeMap.size()); // 11 + + JarVersionedRuntime jarVersionedRuntime11 = jarVersionedRuntimes.getJarVersionedRuntime(11); + JarClasses jarClasses11 = jarVersionedRuntime11.getJarClasses(); + assertEquals("1.8", jarClasses11.getJdkRevision()); + } catch (Exception e) { + fail("It should not raise an exception", e); + } + } + + /** + * Ensures no exceptions are raised when versioned content does not contain classes (just resources) + */ + @Test + public void testAnalyzeMultiReleaseJarResourcesOnly() { + try { + JarData jarData = getJarData("multi-release-resources-only-0.0.1.jar"); + JarClasses jclass = jarData.getJarClasses(); + + assertEquals("1.8", jclass.getJdkRevision()); + + JarVersionedRuntimes jarVersionedRuntimes = jarData.getVersionedRuntimes(); + assertNotNull(jarVersionedRuntimes); + Map<Integer, JarVersionedRuntime> jarVersionedRuntimeMap = jarVersionedRuntimes.getVersionedRuntimeMap(); + assertNotNull(jarVersionedRuntimeMap); + assertEquals(2, jarVersionedRuntimeMap.size()); // 9 and 11 + + JarVersionedRuntime jarVersionedRuntime9 = jarVersionedRuntimes.getJarVersionedRuntime(9); + JarClasses jarClasses9 = jarVersionedRuntime9.getJarClasses(); + // no classes found + assertNull(jarClasses9.getJdkRevision()); + + JarVersionedRuntime jarVersionedRuntime11 = jarVersionedRuntimes.getJarVersionedRuntime(11); + JarClasses jarClasses11 = jarVersionedRuntime11.getJarClasses(); + // no classes found + assertNull(jarClasses11.getJdkRevision()); + } catch (Exception e) { + fail("It should not raise an exception", e); + } + } + private void assertEntriesContains(List<JarEntry> list, final String entryToFind) { assertTrue(list.stream().anyMatch(entry -> entry.getName().equals(entryToFind))); } diff --git a/src/test/resources/jars/multi-release-resources-only-0.0.1.jar b/src/test/resources/jars/multi-release-resources-only-0.0.1.jar new file mode 100644 index 0000000..cd056ab Binary files /dev/null and b/src/test/resources/jars/multi-release-resources-only-0.0.1.jar differ diff --git a/src/test/resources/jars/multi-release-version-with-lower-jdk-revision-class-0.0.1.jar b/src/test/resources/jars/multi-release-version-with-lower-jdk-revision-class-0.0.1.jar new file mode 100644 index 0000000..9879c82 Binary files /dev/null and b/src/test/resources/jars/multi-release-version-with-lower-jdk-revision-class-0.0.1.jar differ