diff --git a/src/main/java/org/apache/maven/shared/jar/JarData.java b/src/main/java/org/apache/maven/shared/jar/JarData.java index d6f6b1c..c4dcf43 100644 --- a/src/main/java/org/apache/maven/shared/jar/JarData.java +++ b/src/main/java/org/apache/maven/shared/jar/JarData.java @@ -178,8 +178,23 @@ public int getNumPackages() { return jarClasses.getPackages().size(); } + /** + * Get the maximum Java class version of the JAR, if it can be determined. + * @return the maximum Java class version, or null if it cannot be determined + * @since 3.2.1 + */ + public String getMaxJavaClassVersion() { + return jarClasses.getMaxJavaClassVersion(); + } + + /** + * Get the JDK revision of the JAR, if it can be determined. + * @return the JDK revision, or null if it cannot be determined + * @deprecated since 3.2.1, use {@link #getMaxJavaClassVersion()} instead, which is more accurate name. + */ + @Deprecated public String getJdkRevision() { - return jarClasses.getJdkRevision(); + return getMaxJavaClassVersion(); } public void setJarIdentification(JarIdentification jarIdentification) { diff --git a/src/main/java/org/apache/maven/shared/jar/classes/JarClasses.java b/src/main/java/org/apache/maven/shared/jar/classes/JarClasses.java index 92f31de..6ab616f 100644 --- a/src/main/java/org/apache/maven/shared/jar/classes/JarClasses.java +++ b/src/main/java/org/apache/maven/shared/jar/classes/JarClasses.java @@ -57,10 +57,10 @@ public class JarClasses { private boolean isDebugPresent; /** - * The highest JVM revision available in any class files. While the JAR may work on earlier JVMs if particular - * classes are not used, this is the minimum JVM that guarantees compatibility. + * The highest Java class version available in any class files. While the JAR may work on earlier JVMs if particular + * classes are not used, this is the minimum JVM version that guarantees compatibility. */ - private String jdkRevision; + private String maxJavaClassVersion; /** * Constructor to create an empty instance. @@ -130,12 +130,48 @@ public void setDebugPresent(boolean hasDebugSymbols) { this.isDebugPresent = hasDebugSymbols; } + /** + * Get the highest Java class version available in any class files. While the JAR may work on earlier JVMs if particular + * classes are not used, this is the minimum JVM version that guarantees compatibility. + * + * @return the highest Java class version available in any class files, or null if not known. + * + * @since 3.2.1 + */ + public String getMaxJavaClassVersion() { + return maxJavaClassVersion; + } + + /** + * Set the highest Java class version available in any class files. While the JAR may work on earlier JVMs if particular + * classes are not used, this is the minimum JVM version that guarantees compatibility. + * + * @param maxJavaClassVersion the highest Java class version available in any class files. + * + * @since 3.2.1 + */ + public void setMaxJavaClassVersion(String maxJavaClassVersion) { + this.maxJavaClassVersion = maxJavaClassVersion; + } + + /** + * The JDK revision of the classes in the JAR. + * @return the JDK revision of the classes in the JAR, or null if not known. + * @deprecated since 3.2.1, use {@link #getMaxJavaClassVersion()} instead, which is more accurate name. + */ + @Deprecated public String getJdkRevision() { - return jdkRevision; + return getMaxJavaClassVersion(); } + /** + * Set the JDK revision of the classes in the JAR. + * @param jdkRevision the JDK revision of the classes in the JAR. + * @deprecated since 3.2.1, use {@link #setMaxJavaClassVersion(String)} instead, which is more accurate name. + */ + @Deprecated public void setJdkRevision(String jdkRevision) { - this.jdkRevision = jdkRevision; + setMaxJavaClassVersion(jdkRevision); } public List getMethods() { 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 7bd6e80..a09a74e 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 @@ -235,7 +235,7 @@ private JarClasses analyze(String jarFilename, List classList) { maxVersion = moduleInfoVersion; } - Optional.ofNullable(JAVA_CLASS_VERSIONS.get(maxVersion)).ifPresent(classes::setJdkRevision); + Optional.ofNullable(JAVA_CLASS_VERSIONS.get(maxVersion)).ifPresent(classes::setMaxJavaClassVersion); return classes; } 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 5c4cc18..da5ecb0 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 @@ -92,7 +92,7 @@ void analyzeJarWithInvalidClassFile() throws Exception { assertTrue(jclass.getClassNames().isEmpty()); assertTrue(jclass.getPackages().isEmpty()); assertTrue(jclass.getImports().isEmpty()); - assertNull(jclass.getJdkRevision()); + assertNull(jclass.getMaxJavaClassVersion()); assertTrue(jclass.getMethods().isEmpty()); } @@ -145,14 +145,14 @@ static String[][] testAnalyzeJarVersion() { void testAnalyzeJarVersion(String jarName, String expectedRevision) throws Exception { JarClasses jclass = getJarClasses(jarName); - assertEquals(expectedRevision, jclass.getJdkRevision()); + assertEquals(expectedRevision, jclass.getMaxJavaClassVersion()); } @Test void analyzeJarWithModuleInfoClass() throws Exception { JarData jarData = getJarData("tomcat-jni-9.0.75.jar"); JarClasses jclass = jarData.getJarClasses(); - assertEquals("1.8", jclass.getJdkRevision()); + assertEquals("1.8", jclass.getMaxJavaClassVersion()); } @Test @@ -166,7 +166,7 @@ void analyzeJarWithOnlyModuleInfoClass() throws Exception { assertTrue(jclass.getPackages().isEmpty()); assertTrue(jclass.getClassNames().isEmpty()); assertTrue(jclass.getMethods().isEmpty()); - assertNull(jclass.getJdkRevision()); + assertNull(jclass.getMaxJavaClassVersion()); JarVersionedRuntimes jarVersionedRuntimes = jarData.getVersionedRuntimes(); assertNotNull(jarVersionedRuntimes); @@ -176,7 +176,7 @@ void analyzeJarWithOnlyModuleInfoClass() throws Exception { JarVersionedRuntime jarVersionedRuntime11 = jarVersionedRuntimes.getJarVersionedRuntime(11); JarClasses jarClasses11 = jarVersionedRuntime11.getJarClasses(); - assertEquals("11", jarClasses11.getJdkRevision()); + assertEquals("11", jarClasses11.getMaxJavaClassVersion()); assertTrue(jarClasses11.getImports().isEmpty()); assertEquals(1, jarClasses11.getPackages().size()); assertEquals("", jarClasses11.getPackages().get(0)); @@ -193,7 +193,7 @@ void analyzeMultiReleaseJarVersion() throws Exception { // root level information assertEquals(17, jarData.getNumRootEntries()); JarClasses jclass = jarData.getJarClasses(); - assertEquals("1.8", jclass.getJdkRevision()); + assertEquals("1.8", jclass.getMaxJavaClassVersion()); assertFalse(jclass.getImports().isEmpty()); assertEquals(1, jclass.getPackages().size()); assertEquals(1, jclass.getClassNames().size()); @@ -208,7 +208,7 @@ void analyzeMultiReleaseJarVersion() throws Exception { JarVersionedRuntime jarVersionedRuntime9 = jarVersionedRuntimes.getJarVersionedRuntime(9); JarClasses jarClasses9 = jarVersionedRuntime9.getJarClasses(); - assertEquals("9", jarClasses9.getJdkRevision()); + assertEquals("9", jarClasses9.getMaxJavaClassVersion()); assertFalse(jarClasses9.getImports().isEmpty()); assertEquals(1, jarClasses9.getPackages().size()); assertEquals(1, jarClasses9.getClassNames().size()); @@ -218,7 +218,7 @@ void analyzeMultiReleaseJarVersion() throws Exception { JarVersionedRuntime jarVersionedRuntime11 = jarVersionedRuntimes.getJarVersionedRuntime(11); JarClasses jarClasses11 = jarVersionedRuntime11.getJarClasses(); - assertEquals("11", jarClasses11.getJdkRevision()); + assertEquals("11", jarClasses11.getMaxJavaClassVersion()); assertFalse(jarClasses11.getImports().isEmpty()); assertEquals(1, jarClasses11.getPackages().size()); assertEquals(1, jarClasses11.getClassNames().size()); @@ -238,25 +238,25 @@ void analyzeMultiReleaseJarVersion() throws Exception { jarVersionedRuntimes .getBestFitJarVersionedRuntime(9) .getJarClasses() - .getJdkRevision()); + .getMaxJavaClassVersion()); assertEquals( "9", jarVersionedRuntimes .getBestFitJarVersionedRuntime(10) .getJarClasses() - .getJdkRevision()); + .getMaxJavaClassVersion()); assertEquals( "11", jarVersionedRuntimes .getBestFitJarVersionedRuntime(11) .getJarClasses() - .getJdkRevision()); + .getMaxJavaClassVersion()); assertEquals( "11", jarVersionedRuntimes .getBestFitJarVersionedRuntime(20) .getJarClasses() - .getJdkRevision()); + .getMaxJavaClassVersion()); assertThrows( NullPointerException.class, @@ -269,22 +269,22 @@ void analyzeMultiReleaseJarVersion() throws Exception { "9", getBestFitReleaseBySystemProperty(jarVersionedRuntimes, "9") .getJarClasses() - .getJdkRevision()); + .getMaxJavaClassVersion()); assertEquals( "9", getBestFitReleaseBySystemProperty(jarVersionedRuntimes, "10") .getJarClasses() - .getJdkRevision()); + .getMaxJavaClassVersion()); assertEquals( "11", getBestFitReleaseBySystemProperty(jarVersionedRuntimes, "11") .getJarClasses() - .getJdkRevision()); + .getMaxJavaClassVersion()); assertEquals( "11", getBestFitReleaseBySystemProperty(jarVersionedRuntimes, "20") .getJarClasses() - .getJdkRevision()); + .getMaxJavaClassVersion()); } /** @@ -298,7 +298,7 @@ void analyzeMultiReleaseJarWithVersion11HasALowerJdkRevisionClass() { JarData jarData = getJarData("multi-release-version-with-lower-jdk-revision-class-0.0.1.jar"); JarClasses jclass = jarData.getJarClasses(); - assertNull(jclass.getJdkRevision()); + assertNull(jclass.getMaxJavaClassVersion()); JarVersionedRuntimes jarVersionedRuntimes = jarData.getVersionedRuntimes(); assertNotNull(jarVersionedRuntimes); @@ -309,7 +309,7 @@ void analyzeMultiReleaseJarWithVersion11HasALowerJdkRevisionClass() { JarVersionedRuntime jarVersionedRuntime11 = jarVersionedRuntimes.getJarVersionedRuntime(11); JarClasses jarClasses11 = jarVersionedRuntime11.getJarClasses(); - assertEquals("1.8", jarClasses11.getJdkRevision()); + assertEquals("1.8", jarClasses11.getMaxJavaClassVersion()); }, "It should not raise an exception"); } @@ -324,7 +324,7 @@ void analyzeMultiReleaseJarResourcesOnly() { JarData jarData = getJarData("multi-release-resources-only-0.0.1.jar"); JarClasses jclass = jarData.getJarClasses(); - assertEquals("1.8", jclass.getJdkRevision()); + assertEquals("1.8", jclass.getMaxJavaClassVersion()); JarVersionedRuntimes jarVersionedRuntimes = jarData.getVersionedRuntimes(); assertNotNull(jarVersionedRuntimes); @@ -336,16 +336,61 @@ void analyzeMultiReleaseJarResourcesOnly() { JarVersionedRuntime jarVersionedRuntime9 = jarVersionedRuntimes.getJarVersionedRuntime(9); JarClasses jarClasses9 = jarVersionedRuntime9.getJarClasses(); // no classes found - assertNull(jarClasses9.getJdkRevision()); + assertNull(jarClasses9.getMaxJavaClassVersion()); JarVersionedRuntime jarVersionedRuntime11 = jarVersionedRuntimes.getJarVersionedRuntime(11); JarClasses jarClasses11 = jarVersionedRuntime11.getJarClasses(); // no classes found - assertNull(jarClasses11.getJdkRevision()); + assertNull(jarClasses11.getMaxJavaClassVersion()); }, "It should not raise an exception"); } + /** + * Ensures that the deprecated JDK revision property is consistent with the max Java class version property. + * Delete this test when the deprecated JDK revision property is removed, as it will no longer be relevant. + */ + @Test + void deprecatedJdkRevisionEquivalentToMaxJavaClassVersionInJarClasses() throws Exception { + JarClasses jclass = getJarClasses("helloworld-1.8.jar"); + + assertEquals("1.8", jclass.getJdkRevision()); + assertEquals("1.8", jclass.getMaxJavaClassVersion()); + + jclass.setJdkRevision("1.7"); + assertEquals("1.7", jclass.getJdkRevision()); + assertEquals("1.7", jclass.getMaxJavaClassVersion()); + + jclass.setMaxJavaClassVersion("25"); + assertEquals("25", jclass.getJdkRevision()); + assertEquals("25", jclass.getMaxJavaClassVersion()); + + jclass.setJdkRevision(null); + assertNull(jclass.getJdkRevision()); + assertNull(jclass.getMaxJavaClassVersion()); + + jclass.setMaxJavaClassVersion(null); + assertNull(jclass.getJdkRevision()); + assertNull(jclass.getMaxJavaClassVersion()); + } + + /** + * Ensures that the deprecated JDK revision property is consistent with the max Java class version. + * Delete this test when the deprecated JDK revision property is removed, as it will no longer be relevant. + */ + @Test + void deprecatedJdkRevisionEquivalentToMaxJavaClassVersionInJarData() throws Exception { + JarData jarData = getJarData("helloworld-1.8.jar"); + JarClasses jclass = jarData.getJarClasses(); + + String expectedMaxVersion = "1.8"; + + assertEquals(expectedMaxVersion, jarData.getJdkRevision()); + assertEquals(expectedMaxVersion, jarData.getMaxJavaClassVersion()); + assertEquals(expectedMaxVersion, jclass.getJdkRevision()); + assertEquals(expectedMaxVersion, jclass.getMaxJavaClassVersion()); + } + private void assertEntriesContains(List list, final String entryToFind) { assertTrue(list.stream().anyMatch(entry -> entry.getName().equals(entryToFind))); }