Spring / Java错误:JDK 1.5及更高版本中的命名空间元素“annotation-config”…
我有与编译器合规性级别1.5编译的Spring / Java应用程序。
我有一个新的Linux设置,我下载了Apache Tomcat 8.0.8 。
我下载了JDK 8u5 。
我在bash中设置path如下:
PATH=$PATH:$HOME/jdk1.8.0_05/bin export PATH
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)
并设置在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
引发exception的类正在使用此代码来检查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现在已经有很长一段时间了。
我有类似的问题。 Spring 2.5.5之下的旧Spring MVC / Spring Faces应用程序不能在Java 8上运行。
我花了几天的时间来寻找解决scheme,因为我们需要运行Java 8。
第一个想法是:将完整的Spring包升级到4.1.6。 我用Maven。 这个方法的问题在那之后,有必要几乎整个项目的返工。 这是因为例如在Spring 4中删除了JSF实现和一些完全删除的特殊taglibs,如<sf:..>
。 还有一些更重大的和小问题的configuration,适配器,处理程序,映射….
第二种方法是部分replaceSpring JAR。 再次没有成功。 不可能replace任何jar而不触及依赖关系。
我相信经过几个星期或几个月的努力,我可以在两种方法上取得成功。 但没有那么多时间。 我放弃了。 我的解决scheme是:
我从org.springframework.core包中find源文件JdkVersion.java。 http://www.java2s.com/Code/Jar/o/Downloadorgspringframeworkcoresources300releasejar.htm 。 我在我的项目中创build了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。
现在应用程序正常启动 它从我的项目调用JdkVersion类而不是jar。
迄今为止工作! 感谢所有从这个线索谁给了这个想法。
谢谢
<dependency> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> <version>2.5.6</version>
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>
要么
- 右键单击项目属性。
- 转到/单击“Java构buildpath”。
- selectLibraries选项卡并双击“JRE System Libry”
- 在popup的selectJDK 1.7(如果你没有JDK 1.7,首先安装它,然后从“执行环境”中select)
我需要在Java 8上支持Spring 2.5.5,所以我使用了这个答案的方法,为JdkVersion.class
提供了一个面向未来的直接replaceJdkVersion.class
,尽可能less的副作用(没有人发布完整的类,我不想劫持其他答案)。 没有必要检查Java 8,只需默认Java 7,这是类关心的最高版本:
解压缩jar文件:
mkdir spring cd spring jar xvf ../spring.jar
检查META-INF/MANIFEST.MF
的Spring版本(你应该看到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: ...
使用以下内容创buildorg/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版本。
创build修改的jar文件(不覆盖原始清单):
jar Mcf ../spring-modified.jar *
在需要的地方复制修改的jar文件(如spring.jar
或者适当的)。
我碰巧是一个很老的项目的另一个不幸的用户(2008年开发的!),它仍在使用Spring 2.5。 而且它也不是一个Maven项目,所以升级到更高版本的Spring需要很长时间,依赖关系失败并给出构build错误。 我将tomcat JRE降级到1.7,并且工作正常。
只要logging下如何在eclipse中这样做,以防有人需要帮助:
-
如果您还没有Java 7,请下载JDK 7并将其安装在
C:\Program Files\Java\jdk1.7.0_71
-
然后去eclipse,双击
Servers > Tomcat vX.Y server
-
点击
Runtime Environment
,然后点击Installed JREs
-
然后
Add
>Standard VM
,然后单击Next
。 你看到这样一个窗口: -
点击
Directory...
并浏览到安装了JDK的文件夹(即C:\Program Files\Java\jdk1.7.0_71
很好,不需要JRE)。 点击Finish
。 -
然后确保selectJRE for Java 7,并且您已经完成设置。
将您的弹簧版本从2.5迁移到> = 3.2.3。
对于Spring迁移,您需要做以下更改 –
1)在你的pom.xml中删除2.5.6的依赖项,并为spring新版本添加依赖项。
2)更新项目的applicationcontet.xml文件的beans标签中的'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)清理,build立和重新部署你的项目。
我有同样的问题,但我有一个解决scheme:
在你的项目文件pom.xml中replace:
<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>
并告诉你的问题再见!
这两个依赖大部分是替代依赖的依赖。
我面临同样的问题。 但是,经过努力,我发现这是因为使用Java 1.8。 我改变它到1.6,它的工作。
我通过valismortis创build了一个完全自动的答案版本。 请先阅读他的post,了解他所说的微妙之处。
- 用项目符号下面的内容创build一个ant构build文件
- 复制构build文件旁边的spring.jar
- 运行修补程序目标
- 你完成了,文件被修补
构build文件内容:
<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>
- 如何解决getActionBar方法可能会产生java.lang.NullPointerException
- 如何以可视方式创build和使用embedded在UIViewController中的UITableView中的静态单元格