Spring/Java错误:JDK 1.5及更高版本上的命名空间元素'annotation-config'...

use*_*944 67 java spring illegalstateexception

我有使用编译器合规级别1.5编译的Spring/Java App .

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

我下载了JDK 8u5.

我在bash中设置路径如下:

PATH=$PATH:$HOME/jdk1.8.0_05/bin
export PATH
Run Code Online (Sandbox Code Playgroud)

Java -version报告:

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)
Run Code Online (Sandbox Code Playgroud)

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

JDK_HOME=/home/userid/jdk1.8.0_05
Run Code Online (Sandbox Code Playgroud)

当我部署我的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
Run Code Online (Sandbox Code Playgroud)

And*_*fan 135

抛出异常的类是使用此代码检查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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

我认为你需要升级你的Spring版本或使用Java 7. 无论如何,Spring 2.5已经被淘汰了很长一段时间了.

  • 斯特凡,就是这样.我下载了JRE 1.7,一切都很顺利.谢谢您的帮助.罗伯特 (2认同)

Dmi*_*try 17

我有类似的问题.Spring 2.5.5下的Old Spring MVC/Spring Faces应用程序不能在Java 8上运行.

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

第一个想法是:将完整的Spring包升级到4.1.6.我用了Maven.这种方法的问题在那之后几乎需要对整个项目进行返工.这是因为例如在Spring 4中删除了JSF实现和一些特殊的taglibs,其中完全删除了<sf:..>.并且是配置,适配器,处理程序,映射等一些更重要和次要的问题....

第二种方法是部分取代Spring JAR.一个接一个.再没有成功.无法触及依赖关系,无法替换任何jar.

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

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

public static final int JAVA_18 = 5;
Run Code Online (Sandbox Code Playgroud)

...

        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;
    }
Run Code Online (Sandbox Code Playgroud)

即使这个代码更改也不是必需的,只是为了好玩.这是因为这个源代码来自Spring 3.0.0软件包,其中Spring的人已经改变了Java版本检查.高于7的版本不被视为旧java.

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

到目前为止工作!感谢所有来自这个提出这个想法的线程.

谢谢


val*_*tis 13

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

解压缩jar文件:

mkdir spring
cd spring
jar xvf ../spring.jar
Run Code Online (Sandbox Code Playgroud)

检查Spring版本META-INF/MANIFEST.MF(你应该看到类似的东西version=2.5.5).中查找相应版本JdkVersion.java和使用,作为一个起点(下面的例子是对Spring 2.5.5和你不想从你正在使用的版本更改任何方法签名).

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

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

我们看到该类是原始编译为目标48.0(看起来,我们发现它是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:
...
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将新类编译为Java 1.4:

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

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

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

jar Mcf ../spring-modified.jar *

在需要的地方(根据需要)复制修改后的jar文件spring.jar.


小智 10

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>2.5.6</version>
Run Code Online (Sandbox Code Playgroud)

TO =>

<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>
Run Code Online (Sandbox Code Playgroud)

要么

  1. 右键单击项目属性.
  2. 转到/单击"Java Build Path".
  3. 选择Libraries选项卡,然后双击"JRE System Libry"
  4. 在弹出窗口中选择JDK 1.7(如果你没有JDK 1.7,首先安装它,然后从"执行环境"中选择它)

属性


小智 5

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

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

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring</artifactId>
    <version>2.5.6</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

为了:

<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>
Run Code Online (Sandbox Code Playgroud)

和你的问题说再见!!

这两个依赖在很大程度上替代了第一个依赖。