我有使用编译器合规性级别1.5 编译的Spring / Java应用程序。
我有一个新的Linux设置,我下载 Apache Tomcat 8.0.8 。
我下载了 JDK 8u5 。
我在bash中设置路径如下:
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
答案 0 :(得分:134)
抛出异常的类正在使用此代码检查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已经有一段时间了。
答案 1 :(得分:15)
我有类似的问题。 Spring 2.5.5下的Old Spring MVC / Spring Faces应用程序不能在Java 8上运行。
我花了几天时间试图找到解决方案,因为我们需要运行Java 8.
第一个想法是:将完整的Spring包升级到4.1.6。我用了Maven。这种方法的问题在那之后几乎需要整修整个项目。这是因为例如在Spring 4中删除了JSF实现和一些完全删除的特殊taglib,如<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;
...
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类。
到目前为止工作!感谢所有人提出这个想法。
由于
答案 2 :(得分:13)
我需要在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.java
的{{3}}并将其作为起点(下面的示例适用于Spring 2.5.5,并且您不希望更改版本中的任何方法签名&#39} ;与...合作。
检查JdkVersion.class
文件的主要版本和次要版本:
javap -verbose org/springframework/core/JdkVersion.class
我们看到该类原始编译为目标 48.0 (appropriate version,我们发现它是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
或适当时)。
答案 3 :(得分:11)
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>2.5.6</version>
TO =&gt;
<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>
OR
答案 4 :(得分:4)
我有同样的问题,但我有一个解决方案:
在项目文件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>
并告诉你的问题!!
这两个家庭在很大程度上取代了第一个依赖。
答案 5 :(得分:3)
我恰好是一个非常古老的项目(2008年开发!)的另一个不幸的用户,它仍在使用Spring 2.5。而且它也不是Maven项目,因此升级到更高版本的Spring需要花费很长时间才能使依赖项失败并产生构建错误。我将tomcat JRE降级为1.7,它运行良好。
如果有人需要帮助,请记录如何在eclipse中执行此操作:
如果您还没有Java 7,请下载JDK 7并进行安装
像C:\Program Files\Java\jdk1.7.0_71
然后转到eclipse并双击Servers > Tomcat vX.Y server
点击Runtime Environment
,然后点击Installed JREs
然后Add
&gt; Standard VM
并点击Next
。你看到一个像窗户
这样:
单击Directory...
并浏览到您安装的文件夹
JDK(即C:\Program Files\Java\jdk1.7.0_71
。JDK没问题,没有
需要JRE)。点击Finish
。
然后确保选择JRE for Java 7并且你已经完成了设置。
答案 6 :(得分:3)
将您的spring版本从2.5迁移到&gt; = 3.2.3。
对于Spring迁移,您需要进行以下更改 -
1)在你的pom.xml中删除spring 2.5.6的依赖项,并为spring new version添加依赖项。
2)更新项目的applicationcontet.xml文件的beans标签中的“xsi:schemaLocation”。
例如将http://www.springframework.org/schema/beans/spring-beans-2.5.xsd更新为 春天3.2.3版本的http://www.springframework.org/schema/beans/spring-beans-3.2.xsd。
3)清理,构建和重新部署项目。
答案 7 :(得分:2)
我遇到了同样的问题。但是,经过努力,我发现这是因为使用Java 1.8。我将它改为1.6并且有效。
答案 8 :(得分:2)
我创建了this answer的全自动版本。 请先阅读该帖子,了解他所提到的细微之处。
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&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>
文件内容:
{{1}}
答案 9 :(得分:2)
即使这个答案得到了完美的回答,但在某些情况下,不希望或不可能升级Java版本或Spring版本。
在我们的例子中,我们必须使用JDK 8才能与Sonar(来自Jenkins)进行通信,我们不想更改spring-version,因为我们没有测试此升级的测试能力
我们的解决方案是使用
在构建时简单地覆盖Java版本-Djava.version=1.6.45
答案 10 :(得分:1)
我已经将支持java1.8和java1.9添加到spring 2.5。 请替换你的tomacat lib中的文件。 JdkVersion.class - 已更改