web-dev-qa-db-ja.com

Spring / Javaエラー:JDK 1.5以降の名前空間要素「annotation-config」...

コンパイラー準拠レベル1.5でコンパイルされたSpring/Javaアプリがあります。

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を使用していないようです。セットアップ手順に従いました。 PS:また、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
66
user3665944

例外をスローしているクラスは、このコードを使用して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されました とにかくかなり長い間。

134
Andrei Stefan

同様の問題があります。 Spring 2.5.5での古いSpring MVC/Spring Facesアプリケーションは、Java 8では実行されません。

Java 8を実行する必要があるため、解決策を見つけるために数日を費やしました。

最初のアイデアは、Springパッケージ全体を4.1.6までアップグレードすることでした。私はMavenを使用しました。この方法の問題は、その後、ほぼプロジェクト全体をやり直す必要があるということです。たとえば、Spring 4ではJSF実装が削除され、<sf:..>などの完全に削除された特別なtaglibがいくつか削除されたためです。そして、構成、アダプター、ハンドラー、マッピングに関する、より大きな問題と小さな問題がありました。

2番目のアプローチは、Spring JARを部分的に置き換えることでした。再び成功しません。依存関係に触れずにjarを置き換えることはできません。

苦労して数週間または数ヶ月経った後、私は両方のアプローチで成功することができると信じています。しかし、そんなに時間はありません。そしてあきらめました。私の解決策は次のとおりです。

Org.springframework.coreパッケージからソースファイルJdkVersion.Javaを見つけました。 http://www.Java2s.com/Code/Jar/o/Downloadorgspringframeworkcoresources300releasejar.htm 。プロジェクトでorg.springframework.coreパッケージを作成し、クラスJdkVersionを1つだけ作成しました。その後、コードを簡単に変更して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クラスを呼び出します。

これまでのところ動作します!この考えを与えてくれたこのスレッドからのすべてに感謝します。

ありがとう

16
Dmitry

Java 8でSpring 2.5.5をサポートする必要があるため、 この回答 からのアプローチを使用して、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を検索し、それを出発点として使用します(以下の例は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 *

必要に応じて(spring.jarまたは必要に応じて)変更したjarファイルをコピーします。

13
vallismortis
<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>

OR

  1. プロジェクトプロパティを右クリックします。
  2. 「Java Build Path」に移動/クリックします。
  3. [ライブラリ]タブを選択し、[JREシステムライブラリ]をダブルクリックします。
  4. そのポップアップで、JDK 1.7を選択します(JDK 1.7をお持ちでない場合は、最初にインストールしてから、「実行環境」から選択します)

Property

11
MAFAIZ

私は同じ問題を抱えていましたが、解決策があります:

プロジェクトファイル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>

そしてあなたの問題に別れを告げる!!

この2つの依存関係は、大部分のfirts依存関係の代替です。

スプリングバージョンを2.5から3.2.3以上に移行します。

Springの移行では、次の変更を行う必要があります-

1)pom.xmlで、spring 2.5.6の依存関係を削除し、springの新しいバージョンの依存関係を追加します。

2)プロジェクトのapplicationcontet.xmlファイルのbeansタグの「xsi:schemaLocation」を更新します。

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd to http://www.springframework.org/schema/beans/spring -beans-3.2.xsd Spring 3.2.3バージョンの場合。

3)プロジェクトをクリーンアップ、ビルド、および再デプロイします。

私は、Spring 2.5をまだ使用している非常に古いプロジェクト(2008年に開発されました!)の別の不幸なユーザーであることがあります。また、Mavenプロジェクトでもないため、Springの以降のバージョンへのアップグレードには時間がかかり、依存関係が失敗してビルドエラーが発生していました。 Tomcat JREを1.7にダウングレードしたところ、うまく機能しました。

誰かが助けを必要とする場合に備えて、Eclipseでそれを行う方法を文書化するだけです:

  1. Java 7がまだない場合は、JDK 7をダウンロードして、C:\Program Files\Java\jdk1.7.0_71などの場所にインストールします

  2. 次に、Eclipseに移動し、Servers > Tomcat vX.Y serverをダブルクリックします

  3. Runtime EnvironmentをクリックしてからInstalled JREsをクリックします

  4. 次にAdd> Standard VMをクリックし、Nextをクリックします。次のようなウィンドウが表示されます。

    Adding a new JRE

  5. Directory...をクリックして、JDKをインストールしたフォルダーを参照します(つまり、C:\Program Files\Java\jdk1.7.0_71。JDKは問題ありません。JREは不要です)。 Finishをクリックします。

  6. 次に、Java 7のJREを選択して、すべての設定が完了したことを確認します。

3
arun

私は同じ問題に直面していました。しかし、非常に一生懸命努力した後、これはJava 1.8を使用していることが原因であることがわかりました。私はそれを1.6に変更し、それが機能しました。

2
vikash singh

this answer の完全自動バージョンを作成しました。彼が対処する微妙さについては、最初にその投稿を読んでください。

  • 箇条書きの下の内容でantビルドファイルを作成します
  • spring.jarファイルの隣に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&amp;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
Erik Lievaart

この答えは完全に回答されていますが、場合によっては、JavaバージョンまたはSpringバージョンをアップグレードすることが望ましくないか、不可能です。

私たちの場合、JDK 8を使用してSonar(Jenkinsから)と通信できるようにする必要があり、このアップグレードをテストするためのテスト能力がないため、spring-versionを変更したくありません。

私たちの解決策は、ビルド中にJavaバージョンを単にオーバーライドすることでした。

-Djava.version=1.6.45
2
Dennis van Beek

Spring2.5にJava1.8とJava1.9のサポートを追加しました。 tomacat libのファイルを置き換えてください。 JdkVersion.class-変更

spring.jarをダウンロード

1