Подтвердить что ты не робот

Spring/Ошибка Java: элемент пространства имен 'annotation-config'... на JDK 1.5 и выше

У меня есть Spring/Java-приложение, которое скомпилировано с уровнем соответствия компилятора 1.5.

У меня есть новая установка Linux, где я загрузил Apache Tomcat 8.0.8.

Я загрузил 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: Я также попробовал 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
4b9b3361

Ответ 1

Класс, который бросает исключение, использует этот код для проверки версии 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 either 1.4 or unknown)
            majorJavaVersion = JAVA_14;
        }
    }

Итак, когда Spring 2.5 был впервые выпущен, код не предполагал, что он будет запущен в версии Java, которая позже 1.7. Для Java 8 и выше приведенный выше код будет использовать версию 1.4 по умолчанию. Из-за этого часть аннотаций будет жаловаться.

Мне кажется, вам нужно либо обновить версию Spring, либо использовать Java 7. Spring 2.5 был EOLed в течение довольно долгого времени, во всяком случае.

Ответ 2

У меня подобная проблема. Старый Spring MVC/Spring Приложение Faces в Spring 2.5.5 не запускается на Java 8.

Я потратил несколько дней на поиск решения, потому что нам нужно запустить Java 8.

Первой идеей было: обновить полный пакет Spring до 4.1.6. Я использовал Maven. Проблема этого метода заключается в том, что после этого необходимо переработать почти весь проект. Это потому, что, например, в Spring 4 были удалены реализация JSF и некоторые специальные taglib, которые полностью удалены, например <sf:..>. И были некоторые более серьезные и незначительные проблемы с конфигурацией, адаптерами, обработчиками, сопоставлениями....

Второй подход состоял в том, чтобы частично заменить JARs на w760. Один на один. Опять не успех. Невозможно заменить любую банку, не затрагивая зависимости.

Я считаю, что через несколько недель или месяцев борьбы я могу добиться успеха на обоих подходах. Но не так много времени. И я сдался. Мое решение:

Я нашел исходный файл JdkVersion.java из пакета org.springframework.core. 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;
    }

Даже это изменение кода действительно не нужно, только для fun.It потому, что этот источник пришел из пакета Spring 3.0.0, где Spring ребята уже изменили проверку версии Java. Версии более 7 не считаются старыми java.

Теперь приложение запускается правильно. Он вызывает класс JdkVersion из моего проекта вместо jar.

Работает до сих пор! Спасибо всем за эту тему, кто дал эту идею.

Спасибо

Ответ 3

<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".
  • Выберите вкладку "Библиотеки" и дважды щелкните "JRE System Libry"
  • В этом всплывающем меню выберите JDK 1.7 (Если у вас нет JDK 1.7, сначала установите его, затем выберите его из "среды выполнения" ).

Property

Ответ 4

Мне нужно поддерживать Spring 2.5.5 на Java 8, поэтому я использовал этот подход из этого ответа, чтобы обеспечить возможность замены в будущем для замены 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 или, если необходимо).

Ответ 5

Я оказался еще одним неудачным пользователем очень старого проекта (разработанного в 2008 году!), который все еще использует Spring 2.5. И это не проект Maven, так что обновление до более поздних версий Spring длилось долгое время с ошибками зависимостей и давало ошибки сборки. Я понизил кодекс 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 > Standard VM и нажмите Next. Вы видите окно, подобное это:

    Adding a new JRE

  • Нажмите Directory... и перейдите в папку, в которую вы установили JDK (т.е. C:\Program Files\Java\jdk1.7.0_71. JDK в порядке, нет потребность в JRE). Нажмите Finish.

  • Затем убедитесь, что вы выбрали JRE для Java 7, и все установлено.

Ответ 6

Перенесите версию spring с 2.5 нa >= 3.2.3.

Для миграции spring вам необходимо выполнить следующие изменения -

1) В вашей pom.xml удалите зависимость для spring 2.5.6 и добавьте зависимость для новой версии spring.

2) Обновите "xsi: schemaLocation" в теге beans файла applicationcontet.xml вашего проекта.

например, обновить http://www.springframework.org/schema/beans/spring-beans-2.5.xsd до http://www.springframework.org/schema/beans/spring-beans-3.2.xsd для версии spring 3.2.3.

3) Очистка, сборка и повторное развертывание вашего проекта.

Ответ 7

У меня была та же проблема, но у меня есть решение:

в файле проекта 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>

и попрощайтесь со своими проблемами!

Эти две взаимозависимости в большинстве случаев являются заменой большей зависимости.

Ответ 8

Я столкнулся с той же проблемой. Но, пытаясь очень сильно, я узнал, что это связано с использованием Java 1.8. Я изменил его на 1.6, и он сработал.

Ответ 9

Я создал полностью автоматическую версию ответа valismortis. Сначала прочитайте его сообщение о тонкостях, которые он адресует.

  • создайте файл сборки ant с содержимым под марками
  • скопировать spring.jar рядом с файлом сборки
  • запустить целевой патч
  • все готово, файл исправлен

содержимое файла сборки:

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

Ответ 10

Несмотря на то, что этот ответ был полностью удовлетворен, в некоторых случаях это нежелательно или возможно обновить версию Java или версию Spring.

В нашем случае мы должны использовать JDK 8 для связи с Sonar (от Jenkins), и мы не хотим менять spring -версию, потому что у нас нет тестовой емкости для тестирования это обновление.

Нашим решением было просто переопределить версию Java при построении, используя

-Djava.version=1.6.45