I need to support Spring 2.5.5 on Java 8, so I used this approach from this answer to provide the option of replacing in the future to replace JdkVersion.class with as few side effects as possible (no one published the full class, and I did not want to carry away another answer). There is no need to test Java 8, just the default on Java 7, which is the highest version the class cared for:
Extract the jar file:
mkdir spring cd spring jar xvf ../spring.jar
Check the Spring version in META-INF/MANIFEST.MF (you should see something like version=2.5.5 ). Look at the corresponding version of JdkVersion.java and use this as a starting point (the example below is for Spring 2.5.5, and you do not want to change the method signatures from the version you are working with).
Check the major and minor version of the JdkVersion.class file:
javap -verbose org/springframework/core/JdkVersion.class
We see that the class was originally compiled as the target 48.0 ( looking at it , we find that it is Java 1.4):
Classfile /tmp/spring/org/springframework/core/JdkVersion.class Last modified Jun 23, 2008; size 1286 bytes MD5 checksum 98e6ea08ce9186c50cc71d14465fc3dd Compiled from "JdkVersion.java" public abstract class org.springframework.core.JdkVersion minor version: 0 major version: 48 flags: ACC_PUBLIC, ACC_SUPER, ACC_ABSTRACT Constant pool: ...
Create org/springframework/core/JdkVersion.java with the following contents:
package org.springframework.core; public abstract class JdkVersion { public static final int JAVA_13 = 0; public static final int JAVA_14 = 1; public static final int JAVA_15 = 2; public static final int JAVA_16 = 3; public static final int JAVA_17 = 4; private static final String javaVersion; private static final int majorJavaVersion; static { javaVersion = System.getProperty("java.version"); if (javaVersion.indexOf("1.7.") != -1) { majorJavaVersion = JAVA_17; } else if (javaVersion.indexOf("1.6.") != -1) { majorJavaVersion = JAVA_16; } else if (javaVersion.indexOf("1.5.") != -1) { majorJavaVersion = JAVA_15; } else if (javaVersion.indexOf("1.4.") != -1) {
Then compile the new class as Java 1.4:
javac -source 1.4 org/springframework/core/JdkVersion.java
You can check the version of major.minor as above if necessary.
Create a modified jar file (without overwriting the original manifest):
jar Mcf ../spring-modified.jar *
Copy the modified jar file if necessary (like spring.jar or, if necessary).