Не удалось найти Spring NamespaceHandler для контекста springframework пространства имен XML-схемы

Я пытаюсь создать один исполняемый файл jar с зависимостями, используя подключаемый модуль maven shadow. В моем pom.xml я добавил зависимость от пакета, который я выполнил локально (установка mvn), который также является пакетом на основе SpringFramework. но я получаю следующие ошибки при запуске приложения.

Исключение в потоке «основной» org.springframework.beans.factory.parsing.BeanDefinitionParsingException: проблема с конфигурацией: невозможно найти Spring NamespaceHandler для пространства имен схемы XML [http://www.springframework.org/schema/context] Ресурс-нарушитель: ресурс пути к классу [applicationContext.xml]

Потратив половину сегодняшнего дня на поиск ответов в Google, я обнаружил, что файлы манифеста разных модулей springframework могут перезаписывать друг друга, и поэтому мне приходится использовать AppendingTransformer, чтобы их можно было добавлять, а не перезаписывать. поэтому я добавил эти строки, но они все еще терпят неудачу. что может быть не так?

вот мое определение плагина.

  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-shade-plugin</artifactId>
  <version>2.1</version>

  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>shade</goal>
      </goals>
      <configuration>
        <finalName>my-spring-app</finalName>
        <shadedArtifactAttached>true</shadedArtifactAttached>
        <shadedClassifierName>jar-with-dependencies</shadedClassifierName>
        <transformers>
          <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
            <mainClass>com.mycomp.App</mainClass>
          </transformer>
          <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
            <resource>META-INF/spring.handlers</resource>
          </transformer>
          <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
            <resource>META-INF/spring.schemas</resource>
          </transformer>
          <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
            <resource>META-INF/spring.tooling</resource>
          </transformer>
        </transformers>

      </configuration>
    </execution>
  </executions>
</plugin>

ОБНОВЛЕНИЕ вот мой applicationContext.xml (частичный)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:task="http://www.springframework.org/schema/task"
    xmlns:util="http://www.springframework.org/schema/util" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
        http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">



    <context:property-placeholder location="classpath*:test.properties" />

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driverClassName}" />
        <property name="jdbcUrl" value="${jdbc.url}" />
        <property name="user" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />

        <!-- C3P0 properties -->
        <property name="acquireIncrement" value="${acquireIncrement}" />
        <property name="minPoolSize" value="${minPoolSize}" />
        <property name="maxPoolSize" value="${maxPoolSize}" />
        <property name="maxIdleTime" value="${maxIdleTime}" />
    </bean>

    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource">
            <ref bean="dataSource" />
        </property>

        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="default_schema">test</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>

        <property name="annotatedClasses">
            <list>

                <value>com.mycomp.database.myVO</value>

            </list>
        </property>

    </bean>

    <bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <bean id="persistenceExceptionTranslationPostProcessor"
        class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

    <tx:annotation-driven transaction-manager="transactionManager" />


    <task:annotation-driven />

</beans>

person user3590506    schedule 12.08.2014    source источник


Ответы (3)


Maven-shade-plugin темпераментен, и, по моему опыту, получить от него хорошую банку может быть проблемой, если у вас есть несколько классов с несколькими библиотеками jar. Capsule – это интересная альтернатива, которая использует средство запуска для настройки пути к классам и даже загрузки зависимостей из Maven Central, если вы желание! Для этого есть плагин maven, но он все еще находится на ранней стадии разработки.

Тем не менее, вам нужно mvn clean package заставить заштрихованную банку быть перестроенной с нуля.

person Steve McKay    schedule 12.08.2014

Я решил свою проблему, настроив без xml для своего весеннего проекта. я определил свои весенние бобы в классе @Configurations, и это решило проблему для меня.

person user3590506    schedule 12.08.2014

Ok. я наконец нашел проблему. мой pom был настроен неправильно.

у меня была запись плагина тени, как показано ниже.

<plugins>
  <pluginManagement>
     <plugin>
        .... shade stuff
     </plugin>
  </pluginManagement>
</plugins>

решение состояло в том, чтобы поместить его вне pluginManagement, как показано ниже.

<plugins>
  <plugin>
    ... shade stuff
  </plugin>
  <pluginManagement/>
</plugins>
person user3590506    schedule 14.08.2014