Spring/Java error: namespace element 'annotation-config' … on JDK 1.5 and higher
我有使用Compiler符合性级别1.5编译的Spring / Java App。
我有一个新的Linux设置,我在其中下载了Apache Tomcat 8.0.8。
我下载了JDK 8u5。
我在bash中设置路径,如下所示:
1 2 | PATH=$PATH:$HOME/jdk1.8.0_05/bin export PATH |
Java版本报告:
1 2 3 | 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):
1 | JDK_HOME=/home/userid/jdk1.8.0_05 |
部署WAR文件时,出现以下错误。
我认为Tomcat似乎没有使用我安装的Java。
我已按照安装说明进行操作。
PS:我还尝试了JRE而不是JDK,并且遇到了同样的问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | 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 |
引发异常的类正在使用以下代码检查Java版本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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版本,要么使用Java7。无论如何,Spring 2.5已经停产了一段时间。
我有类似的问题。春季2.5.5下的旧版Spring MVC / Spring Faces应用程序无法在Java 8上运行。
我花了几天时间来寻找解决方案,因为我们需要运行Java 8。
第一个想法是:将完整的Spring软件包升级到4.1.6。我用过Maven。这种方法的问题是,在此之后几乎需要对整个项目进行返工。这是因为例如在Spring 4中删除了JSF实现,并删除了一些特殊的标记库,例如
第二种方法是部分替换Spring JAR。再次没有成功。不可能替换任何jar而不接触依赖项。
我相信经过几周或几个月的努力,我可以在两种方法上都取得成功。但是没有那么多时间。我放弃了。
我的解决方案是:
我从org.springframework.core包中找到了源文件JdkVersion.java。 http://www.java2s.com/Code/Jar/o/Downloadorgspringframeworkcoresources300releasejar.htm。
我在项目中仅使用一个类JdkVersion创建了org.springframework.core包。之后,对代码进行简单的更改即可检查Java 8版本。像这样:
1 | public static final int JAVA_18 = 5; |
...
1 2 3 4 5 6 7 8 9 |
即使是这样的代码更改也不是真正必要的,仅仅是为了好玩。这是因为该源代码来自Spring 3.0.0软件包,Spring人员已经在其中更改了Java版本检查。高于7的版本不视为旧Java。
现在,应用程序可以正常启动。它从我的项目而不是jar中调用JdkVersion类。
到目前为止工作!感谢所有提出这个想法的人。
谢谢
我需要在Java 8上支持Spring 2.5.5,因此我使用了此答案中的方法,以尽可能减少副作用的方式提供了
提取jar文件:
1 2 3 | mkdir spring cd spring jar xvf ../spring.jar |
检查
检查
我们看到该类最初是作为目标48.0编译的(查找后,发现它是Java 1.4):
1 2 3 4 5 6 7 8 9 10 | 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: ... |
创建具有以下内容的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | 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:
如果需要,您可以如上所述再次检查major.minor版本。
创建修改后的jar文件(不覆盖原始清单):
将修改后的jar文件复制到需要的位置(
1 2 3 4 | <dependency> <groupId>org.springframework</groupId> spring</artifactId> <version>2.5.6</version> |
到=>
1 2 3 4 5 6 7 8 9 10 | <dependency> <groupId>org.springframework</groupId> spring-core</artifactId> <version>4.1.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> spring-context</artifactId> <version>4.1.4.RELEASE</version> </dependency> |
要么
我有同样的问题,但我有解决方案:
在您的项目文件pom.xml中替换:
1 2 3 4 5 | <dependency> <groupId>org.springframework</groupId> spring</artifactId> <version>2.5.6</version> </dependency> |
对于:
1 2 3 4 5 6 7 8 9 10 11 | <dependency> <groupId>org.springframework</groupId> spring-core</artifactId> <version>4.1.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> spring-context</artifactId> <version>4.1.4.RELEASE</version> </dependency> |
和你的问题说再见!
这两个依赖性在大多数情况下替代了firts依赖性。
将您的Spring版本从2.5迁移到> = 3.2.3。
对于Spring迁移,您需要进行以下更改-
1)在您的pom.xml中,删除spring 2.5.6的依赖关系,并添加spring新版本的依赖关系。
2)更新项目的applicationcontet.xml文件的bean标记中的" xsi:schemaLocation"。
例如,将http://www.springframework.org/schema/beans/spring-beans-2.5.xsd更新为
对于Spring 3.2.3版本,http://www.springframework.org/schema/beans/spring-beans-3.2.xsd。
3)清理,构建和重新部署您的项目。
我碰巧是一个非常老的项目(2008年开发!)的另一个不幸用户,该项目仍在使用Spring 2.5。而且它也不是Maven项目,因此升级到更高版本的Spring需要很长时间,并且依赖项会失败并产生构建错误。我将tomcat JRE降级到1.7,并且运行良好。
只是记录下如何在日食中做到这一点,以防有人需要帮助:
如果您还没有Java 7,请下载并安装JDK 7。
然后转到Eclipse并双击
点击
然后
这个:
单击
JDK(即
需要JRE)。单击
然后,确保选择Java 7的JRE,一切就绪。
即使已经很好地回答了该答案,在某些情况下也不希望或不可能升级Java版本或Spring版本。
在我们的案例中,我们必须使用JDK 8才能与Sonar(来自Jenkins)进行通信,并且我们不想更改spring-version,因为我们没有测试此升级的测试能力。
我们的解决方案是在构建,使用
1 | -Djava.version=1.6.45 |
我创建了此答案的全自动版本。
请首先阅读该帖子以了解他所讲的微妙之处。
- 用项目符号下方的内容创建一个蚂蚁构建文件
-
复制
build.xml 文件旁边的spring.jar - 运行补丁目标
- 完成后,文件已打补丁
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <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&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> |
我面临着同样的问题。但是,在非常努力之后,我发现这是因为使用Java 1.8。我将其更改为1.6并成功了。
我在Spring 2.5中添加了对java1.8和java1.9的支持。
请替换您的tomacat库中的文件。
JdkVersion.class-已更改
下载spring.jar