Spring / Java 오류 : 네임 스페이스 요소 'annotation-config'… JDK 1.5 이상
Compiler compliance level 1.5로 컴파일 된 Spring / Java App이 있습니다.
Apache Tomcat 8.0.8을 다운로드 한 새 Linux 설정이 있습니다.
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를 사용하지 않는 것 같습니다. 설정 지침을 따랐습니다. 추신 : JDK 대신 JRE와 같은 문제도 시도했습니다.
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 버전을 확인합니다.
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는 어쨌든 꽤 오랫동안 EOL되었습니다 .
비슷한 문제가 있습니다. Spring 2.5.5에서 이전 Spring MVC / Spring Faces 애플리케이션은 Java 8에서 실행되지 않습니다.
Java 8을 실행해야하므로 솔루션을 찾기 위해 며칠을 보냈습니다.
첫 번째 아이디어는 완전한 Spring 패키지를 4.1.6으로 업그레이드하는 것입니다. Maven을 사용했습니다. 이 방법의 문제점은 그 후에 거의 전체 프로젝트를 재 작업해야한다는 것입니다. 예를 들어 Spring 4에서는 JSF 구현이 제거되었고 일부 특수 taglib가 완전히 제거 되었기 때문입니다 <sf:..>. 그리고 구성, 어댑터, 처리기, 매핑에 대한 몇 가지 주요 및 사소한 문제였습니다 ....
두 번째 접근 방식은 Spring JAR을 부분적으로 교체하는 것이 었습니다. 다시 성공하지 못했습니다. 종속성을 건드리지 않고 항아리를 교체하는 것은 불가능합니다.
몇 주 또는 몇 달 동안 고군분투하면 두 가지 접근 방식 모두에서 성공할 수 있다고 믿습니다. 그러나 시간이별로 없습니다. 그리고 포기했습니다. 내 솔루션은 다음과 같습니다.
org.springframework.core 패키지에서 소스 파일 JdkVersion.java를 찾았습니다. http://www.java2s.com/Code/Jar/o/Downloadorgspringframeworkcoresources300releasejar.htm . JdkVersion 클래스가 하나만있는 프로젝트에서 org.springframework.core 패키지를 만들었습니다. 그 후 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 직원이 이미 Java 버전 확인을 변경 한 Spring 3.0.0 패키지에서 왔기 때문입니다. 7보다 높은 버전은 이전 Java로 간주되지 않습니다.
이제 응용 프로그램이 제대로 시작됩니다. jar 대신 내 프로젝트에서 JdkVersion 클래스를 호출합니다.
지금까지 작동합니다! 이 아이디어를 주신 모든 분들께 감사드립니다.
감사
Java 8에서 Spring 2.5.5를 지원해야 하므로이 답변 의 접근 방식을 사용하여 JdkVersion.class가능한 한 적은 부작용으로 미래 보장 드롭 인 대체를 제공했습니다 (다른 사람은 완전한 클래스를 게시하지 않았으며 다른 답변을 가로 채고 싶지 않습니다). Java 8을 확인할 필요가 없습니다. 기본적으로 Java 7이 기본으로 설정되어 있습니다. 이는 클래스가 신경 쓰는 가장 높은 버전입니다.
jar 파일을 추출하십시오.
mkdir spring
cd spring
jar xvf ../spring.jar
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:
...
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적절한 경우).
<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>
또는
- 프로젝트 속성을 마우스 오른쪽 버튼으로 클릭하십시오.
- "Java Build Path"로 이동 / 클릭합니다.
- 라이브러리 탭을 선택하고 "JRE 시스템 라이브러리"를 두 번 클릭합니다.
- 팝업 창에서 JDK 1.7을 선택합니다 (JDK 1.7이없는 경우 먼저 설치 한 다음 "실행 환경"에서 선택).

나는 같은 문제가 있었지만 해결책이 있습니다.
프로젝트 파일 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>
and say good bye to your problems!!
This two dependecies are the replacement for the firts dependency in the most part.
I happen to be another unfortunate user of a very old project (developed in 2008!) which is still using Spring 2.5. And it is not a Maven project either, so upgrading to later versions of Spring was taking a long time with dependencies failing and giving build errors. I downgraded tomcat JRE to 1.7 and it worked fine.
Just documenting how to do that in eclipse in case someone needs help:
If you do not already have Java 7, download JDK 7 and install it somewhere like
C:\Program Files\Java\jdk1.7.0_71Then go to eclipse and double click on
Servers > Tomcat vX.Y serverClick on
Runtime Environment, thenInstalled JREsThen
Add>Standard VMand clickNext. You see a window like this:
Click on
Directory...and browse to the folder where you installed the JDK (i.e.C:\Program Files\Java\jdk1.7.0_71. JDK is fine, no need for JRE). ClickFinish.Then make sure to select the JRE for Java 7 and you are all set.
Migrate your spring version from 2.5 to >=3.2.3.
For Spring migration you need to do following changes -
1) In your pom.xml remove dependency for spring 2.5.6 and add dependency for spring new version.
2) Update 'xsi:schemaLocation' in beans tag of applicationcontet.xml file of your project.
e.g update http://www.springframework.org/schema/beans/spring-beans-2.5.xsd to http://www.springframework.org/schema/beans/spring-beans-3.2.xsd for spring 3.2.3 version.
3) Clean,build and re-deploy your project.
I was facing the same issue. But, after trying very hard, I found out that this is because of using Java 1.8. I changed it to 1.6 and it worked.
Even though this answer has been perfectly answered, in some cases it's not desired or possible to upgrade the Java version or the Spring version.
In our case, we have to use JDK 8 to be able to communicate with Sonar (from Jenkins) and we don't want to change the spring-version, because we don't have the test capacity to test this upgrade.
Our solution was to simply override the Java version while building, using
-Djava.version=1.6.45
I created a fully automatic version of this answer. Please read that post first for the subtleties he addresses.
- create an ant build file with the contents below the bullets
- copy
spring.jarnext to thebuild.xmlfile - run the patch target
- 완료되면 파일이 패치됩니다.
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>
스프링 2.5에 java1.8 및 java1.9 지원을 추가했습니다. tomacat lib의 파일을 바꾸십시오. JdkVersion.class-변경됨
'Program Club' 카테고리의 다른 글
| 클래스의 개인 생성자에 어떻게 액세스 할 수 있습니까? (0) | 2020.11.09 |
|---|---|
| winforms 텍스트 상자에 검은 색 점 (•)이 표시되는 passwordchar는 무엇입니까? (0) | 2020.11.09 |
| "do {…} while ()"루프가 필요합니까? (0) | 2020.11.09 |
| 이미지를 늘리지 않고 이미지의 너비와 높이를 설정하는 방법은 무엇입니까? (0) | 2020.11.09 |
| CSS : 표 열 사이의 테두리 만 (0) | 2020.11.09 |