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 <[email protected]>
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 <[email protected]>
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