【问题标题】:Spring/Java error: namespace element 'annotation-config' ... on JDK 1.5 and higherSpring/Java 错误:命名空间元素 'annotation-config' ... 在 JDK 1.5 及更高版本上
【发布时间】:2014-07-11 21:03:10
【问题描述】:

我有使用编译器合规级别 1.5 编译的 Spring/Java 应用程序。

我有一个新的 Linux 设置,我在其中下载了 Apache Tomcat 8.0.8

我下载了 JDK 8u5

我在bash中设置路径如下:

PATH=$PATH:$HOME/jdk1.8.0_05/bin
export PATH

Java 版本报告:

java version "1.8.0_05"
Java(TM) SE Runtime Environment (build 1.8.0_05-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.5-b02, mixed mode)

并在 setnenv.sh 中设置(用于 Tomcat):

JDK_HOME=/home/userid/jdk1.8.0_05

当我部署我的 WAR 文件时,出现以下错误。 我认为Tomcat似乎没有使用我安装的Java。 我已按照设置说明进行操作。 PS:我也试过 JRE 而不是 JDK 和同样的问题。

22-May-2014 11:34:54.070 INFO [http-nio-8080-exec-4] org.apache.catalina.core.ApplicationContext.log Initializing Spring root WebApplicationContext
22-May-2014 11:34:54.512 SEVERE [http-nio-8080-exec-4] org.apache.catalina.core.StandardContext.listenerStart Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
 org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from file [/home/userid/apache-tomcat-8.0.8/webapps/myApplication-QA/WEB-INF/classes/config/spring/securityContext.xml]; nested exception is **java.lang.IllegalStateException: Context namespace element 'annotation-config' and its parser class [org.springframework.context.annotation.AnnotationConfigBeanDefinitionParser] are only available on JDK 1.5 and higher**
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:420)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:342)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:310)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:124)
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:92)
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:123)
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:423)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:353)
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4750)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5170)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.manager.ManagerServlet.start(ManagerServlet.java:1270)
    at org.apache.catalina.manager.HTMLManagerServlet.start(HTMLManagerServlet.java:673)
    at org.apache.catalina.manager.HTMLManagerServlet.doPost(HTMLManagerServlet.java:221)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:644)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:301)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.filters.CsrfPreventionFilter.doFilter(CsrfPreventionFilter.java:213)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:615)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:78)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:526)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1033)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:652)
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalStateException: Context namespace element 'annotation-config' and its parser class [org.springframework.context.annotation.AnnotationConfigBeanDefinitionParser] are only available on JDK 1.5 and higher
    at org.springframework.context.config.ContextNamespaceHandler$1.parse(ContextNamespaceHandler.java:65)
    at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:69)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1253)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1243)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:135)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:92)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:507)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:398)
    ... 49 more

22-May-2014 11:34:54.518 INFO [http-nio-8080-exec-4] org.apache.catalina.core.ApplicationContext.log Closing Spring root WebApplicationContext

【问题讨论】:

  • 试试setenv.sh: JAVA_HOME=/home/userid/jdk1.8.0_05
  • 谢谢 Stefan,我试过了,但还是没有运气。顺便说一句:在 Tomcat 启动时,我得到以下信息。 bash startup.sh 使用 CATALINA_BASE:/home/userid/apache-tomcat-8.0.8 使用 CATALINA_HOME:/home/userid/apache-tomcat-8.0.8 使用 CATALINA_TMPDIR:/home/userid/apache-tomcat-8.0.8/ temp 使用 JRE_HOME:/home/userid/jdk1.8.0_05 使用 CLASSPATH:/home/userid/apache-tomcat-8.0.8/bin/bootstrap.jar:/home/userid/apache-tomcat-8.0.8/bin/ tomcat-juli.jar 使用 CATALINA_PID:/home/userid/apache-tomcat-8.0.8/tomcat.pid Tomcat 已启动。
  • 您使用的是 Spring 2.5?
  • 是的,这是一个旧应用程序。
  • @AndreiStefan 用 jdk 5、6 或 7 替换 jdk1.8...。感谢您为我指明正确的方向。我遇到了这个问题,因为我在同一台机器上运行了两个应用程序 - 一个需要 java 8,一个旧的依赖于 spring 2.5

标签: java spring illegalstateexception


【解决方案1】:

引发异常的类正在使用此代码检查 Java 版本:

static {
        javaVersion = System.getProperty("java.version");
        // version String should look like "1.4.2_10"
        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 {
            // else leave 1.4 as default (it's either 1.4 or unknown)
            majorJavaVersion = JAVA_14;
        }
    }

因此,当 Spring 2.5 首次发布时,代码并没有假设它将在 1.7 之后的 Java 版本中运行。对于 Java 8 及更高版本,上面的代码将采用默认的 1.4 版本。因此,注解部分会报错。

我认为你要么需要升级你的 Spring 版本,要么使用 Java 7。Spring 2.5 has been EOLed 已经有一段时间了,无论如何。

【讨论】:

  • 斯特凡,就是这样。我下载了 JRE 1.7,一切都很好。谢谢您的帮助。罗伯特
  • 似乎在 Spring >= 3.2.3 中添加了对 Java 8 的支持。请参阅JdkVersion.class 中的code change
  • 唷,这个解决方案比我想象的要简单。谢谢!
  • 这让我省了很多麻烦,谢谢!
【解决方案2】:

我也有类似的问题。 Spring 2.5.5 下的旧 Spring MVC/Spring Faces 应用程序无法在 Java 8 上运行。

我花了几天时间试图找到解决方案,因为我们需要运行 Java 8。

第一个想法是:将完整的 Spring 包升级到 4.1.6。我使用了 Maven。这种方法的问题是,之后几乎需要对整个项目进行返工。这是因为例如在 Spring 4 中移除了 JSF 实现和一些完全移除的特殊标记库,例如 <sf:..>。还有一些配置、适配器、处理程序、映射的主要和次要问题......

第二种方法是部分替换 Spring JAR。一个一个。再次没有成功。不可能在不触及依赖关系的情况下替换任何 jar。

我相信,经过几周或几个月的努力,我可以在这两种方法上取得成功。但是没有那么多时间。我放弃了。 我的解决方案是:

我从 org.springframework.core 包中找到了源文件 JdkVersion.java。 http://www.java2s.com/Code/Jar/o/Downloadorgspringframeworkcoresources300releasejar.htm。 我在我的项目中创建了 org.springframework.core 包,只有一个类 JdkVersion。之后对代码进行了简单的更改以检查 Java 8 版本。像这样的:

public static final int JAVA_18 = 5;

...

        javaVersion = System.getProperty("java.version");
    // version String should look like "1.4.2_10"
    if (javaVersion.contains("1.8.")) {
        majorJavaVersion = JAVA_18;         
        System.out.println("JAVA_VERSION: "+javaVersion);

    } else if (javaVersion.contains("1.7.")) {
        majorJavaVersion = JAVA_17;
    }

即使这个代码更改也不是真正必要的,只是为了好玩。这是因为这个源来自 Spring 3.0.0 包,其中 Spring 家伙已经更改了 Java 版本检查。高于 7 的版本不被视为旧 java。

现在应用程序可以正常启动。它从我的项目而不是 jar 中调用 JdkVersion 类。

到目前为止有效!感谢这个帖子中提出这个想法的所有人。

谢谢

【讨论】:

  • 我已经将这种方法应用于我的项目中,其中包含多个模块/子项目。所以我所做的是在我的服务器目录中搜索 spring-xxx-version.jar(我使用的是 tomcat)。我在 spring-xxx-version.jar 中添加了一个 JdkVersion.class(如上所述检查了 java 8)并重新启动了服务器。这解决了我的问题。
  • 这也很好,你刚刚修补了原始的弹簧罐。无论如何,这个版本的 spring 已经停止服务了。
【解决方案3】:

我需要在 Java 8 上支持 Spring 2.5.5,所以我使用了 this answer 的方法来为 JdkVersion.class 提供面向未来的替代品,同时尽可能减少副作用(没有其他人发布一个完整的课程,我不想劫持另一个答案)。无需检查 Java 8,只需默认为 Java 7,这是该类关心的最高版本:

解压jar文件:

mkdir spring
cd spring
jar xvf ../spring.jar

检查 META-INF/MANIFEST.MF 中的 Spring 版本(您应该会看到类似 version=2.5.5 的内容)。查找JdkVersion.javaappropriate version 并将其用作起点(以下示例适用于Spring 2.5.5,您不想更改正在使用的版本的任何方法签名)。

检查JdkVersion.class 文件的主要和次要版本:

javap -verbose org/springframework/core/JdkVersion.class

我们看到该类最初编译为目标 48.0looking this up,我们发现它是 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:
...

使用以下内容创建org/springframework/core/JdkVersion.java

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;
    }
}

然后将新类编译为 Java 1.4:

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

如果需要,您可以再次检查major.minor版本。

创建修改后的 jar 文件(不覆盖原始清单):

jar Mcf ../spring-modified.jar *

在需要的地方复制修改后的 jar 文件(如spring.jar 或适当的地方)。

【讨论】:

  • @SunilShevante 没问题,很高兴这对您有所帮助!
【解决方案4】:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>2.5.6</version>

到 =>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>4.1.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.1.4.RELEASE</version>
</dependency>

  1. 右键单击项目属性。
  2. 转到/单击“Java 构建路径”。
  3. 选择库选项卡并双击“JRE 系统库”
  4. 在弹出窗口中选择 JDK 1.7(如果您没有 JDK 1.7,请先安装它,然后从“执行环境”中选择它)

【讨论】:

    【解决方案5】:

    我有同样的问题,但我有一个解决方案:

    在你的项目文件 pom.xml 中替换:

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring</artifactId>
        <version>2.5.6</version>
    </dependency>
    

    为:

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.1.4.RELEASE</version>
    </dependency>
    
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.1.4.RELEASE</version>
    </dependency>
    

    和你的问题说再见!

    这两个依赖大部分是第一个依赖的替换。

    【讨论】:

      【解决方案6】:

      我碰巧是一个非常老的项目(开发于 2008 年!)的另一个不幸用户,该项目仍在使用 Spring 2.5。而且它也不是一个 Maven 项目,因此升级到更高版本的 Spring 需要很长时间,因为依赖项失败并出现构建错误。我将 tomcat JRE 降级到 1.7,它运行良好。

      只是记录如何在 eclipse 中做到这一点,以防有人需要帮助:

      1. 如果您还没有 Java 7,请下载 JDK 7 并安装它 类似C:\Program Files\Java\jdk1.7.0_71

      2. 然后进入eclipse双击Servers &gt; Tomcat vX.Y server

      3. 点击Runtime Environment,然后点击Installed JREs

      4. 然后Add > Standard VM 并单击Next。你看到一个像这样的窗口 这个:

      5. 单击Directory... 并浏览到您安装的文件夹 JDK(即C:\Program Files\Java\jdk1.7.0_71。JDK很好,没有 需要 JRE)。点击Finish

      6. 然后确保为 Java 7 选择 JRE,一切就绪。

      【讨论】:

        【解决方案7】:

        将您的 Spring 版本从 2.5 迁移到 >=3.2.3。

        对于 Spring 迁移,您需要进行以下更改 -

        1) 在您的 pom.xml 中删除 spring 2.5.6 的依赖项并添加 spring 新版本的依赖项。

        2) 更新项目的 applicationcontet.xml 文件的 beans 标签中的“xsi:schemaLocation”。

        例如,将http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 更新为 http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 用于 spring 3.2.3 版本。

        3) 清理、构建和重新部署您的项目。

        【讨论】:

          【解决方案8】:

          我遇到了同样的问题。但是,经过一番努力,我发现这是因为使用了 Java 1.8。我将其更改为 1.6 并且可以正常工作。

          【讨论】:

            【解决方案9】:

            尽管这个答案已经得到了完美的回答,但在某些情况下,不希望或不可能升级 Java 版本或 Spring 版本。

            在我们的例子中,我们必须使用 JDK 8 才能与 Sonar(来自 Jenkins)进行通信,并且我们不想更改 spring-version,因为我们没有测试能力来测试这个升级.

            我们的解决方案是在构建时简单地覆盖 Java 版本,使用

            -Djava.version=1.6.45
            

            【讨论】:

              【解决方案10】:

              我创建了this answer 的全自动版本。 请先阅读该帖子,了解他所指出的微妙之处。

              • 使用项目符号下方的内容创建一个 ant 构建文件
              • spring.jar复制到build.xml文件旁边
              • 运行补丁目标
              • 大功告成,文件已修补

              build.xml文件内容:

              <project name="spring-patch" default="patch">
                  <target name="patch">
                      <mkdir dir="src/org/springframework/core"/>
                      <get dest="src/org/springframework/core/JdkVersion.java"
                              src="http://grepcode.com/file_/repo1.maven.org/maven2/org.springframework/spring/2.5.5/org/springframework/core/JdkVersion.java/?v=source&amp;disposition=attachment" />
                      <replace dir="src" value="majorJavaVersion = JAVA_17">
                        <replacetoken>majorJavaVersion = JAVA_14</replacetoken>
                      </replace>
                      <javac srcdir="src" />
                      <zip destfile="spring.jar" update="true">
                          <fileset dir="src" includes="**/*.class" />
                      </zip>
                      <delete dir="src" />
                  </target>
              </project>
              

              【讨论】:

                【解决方案11】:

                我在 spring 2.5 中添加了对 java1.8 和 java1.9 的支持。 请替换您的 tomacat 库中的文件。 JdkVersion.class - 已更改

                download spring.jar

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2021-10-02
                  • 2014-08-20
                  • 2015-09-13
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-03-04
                  • 2019-04-21
                  • 2011-09-16
                  相关资源
                  最近更新 更多