Spring/Java error: namespace element 'annotation-config' … on JDK 1.5 and higher

后端 未结 11 1173
Happy的楠姐
Happy的楠姐 2020-11-29 00:47

I have Spring/Java App that is compiled with Compiler compliance level 1.5.

I have a new Linux setup where I downloaded Apache Tomcat 8.0.8<

11条回答
  •  情深已故
    2020-11-29 01:40

    I need to support Spring 2.5.5 on Java 8, so I used the approach from this answer to provide a future-proof drop-in replacement for JdkVersion.class with as few side-effects as possible (nobody else posted a complete class, and I didn't want to hijack the other answer). There is no need to check for Java 8, simply default to Java 7, which is the highest version the class cared about:

    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 up the appropriate version of JdkVersion.java and use that as a starting point (the example below is for Spring 2.5.5 and you don't want to change any method signatures from the version you're 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 original compiled as target 48.0 (looking this up, we find that 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 content:

    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) { // new
                majorJavaVersion = JAVA_14;                 // new
            } else {
                majorJavaVersion = JAVA_17;                 // changed from JAVA_14
            }
        }
    
        public static String getJavaVersion()
        {
            return javaVersion;
        }
    
        public static int getMajorJavaVersion()
        {
            return majorJavaVersion;
        }
    
        public static boolean isAtLeastJava14()
        {
            return true;
        }
    
        public static boolean isAtLeastJava15()
        {
            return getMajorJavaVersion() >= JAVA_15;
        }
    
        public static boolean isAtLeastJava16()
        {
            return getMajorJavaVersion() >= JAVA_16;
        }
    }
    

    Then compile the new class as Java 1.4:

    javac -source 1.4 org/springframework/core/JdkVersion.java

    You can check the major.minor version again as above if needed.

    Create the modified jar file (without overwriting the original manifest):

    jar Mcf ../spring-modified.jar *

    Copy the modified jar file where needed (as spring.jar or as appropriate).

提交回复
热议问题