Еще одна "неспособная найти ошибку Spring NamespaceHandler"

Я создаю автономное приложение Sava с Spring для обработки доступа JDBC. Приложение отлично работает на каждом тесте, и я решил, что мне нужна банка для развертывания наших клиентов.

Они могут не иметь spring в своем пути к классам, поэтому я использовал maven-assembly-plugin для обработки создания jar с зависимостями.

Однако, когда я пытаюсь запустить приложение:

java -jar target/myproject-0.0.1-SNAPSHOT-jar-with-dependencies.jar

Что вызывает следующую ошибку:

Exception in thread "main" org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/p]
Offending resource: class path resource [applicationContext.xml]

at org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:68)
at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:85)
at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:80)
...and so on to the database access class of this project.

Файл applicationContext.xml находится в файле projectbase/src/main/resources. И он помещается в базу целей /packagename.

ПриложениеContext.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:p="http://www.springframework.org/schema/p"
   xmlns:context="http://www.springframework.org/schema/context"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context-3.0.xsd">


    <bean id="dataSourceDesenv" class="org.apache.commons.dbcp.BasicDataSource"... />

    <bean id="simpleJdbcDaoSupport" class="org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport"
      p:dataSource-ref="dataSourceDesenv" />

    <bean id="simpleJdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
        <constructor-arg ref="dataSourceDesenv" />
    </bean>

</beans>

Это все, что я могу думать, что может быть полезно. Я буду предоставлять дополнительную информацию по запросу.

Ответы

Ответ 1

Я нашел ошибку, ошибка находится в ошибке в плагине maven-assembly. Я использовал следующее обходное решение:

Сначала прокомментировал код maven-assembly в моем pom. Затем я скопировал зависимости в папку lib в целевой среде с помощью плагина maben-dependency:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

Затем я использовал maven-jar-plugin для настройки исполняемого банку:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.3.1</version>
            <configuration>
                <archive>
                    <index>true</index>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <mainClass>org.foo.myproject.App</mainClass>
                    </manifest>
                    <manifestEntries>
                        <mode>development</mode>
                        <url>${pom.url}</url>
                        <key>value</key>

                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>

Наконец, я создал bash script, который развертывается с приложением, которое запускает мое приложение с его библиотеками и любыми предоставленными аргументами:

java -cp lib/*:myproject-0.0.1-SNAPSHOT.jar org.foo.myproject.App [email protected]

Я должен был создать приложение в python =/

Ответ 2

Я столкнулся с этой проблемой сегодня с помощью maven-assembly-plugin. Поиск привел меня к этому вопросу, и посмотрите, что сообщение об ошибке говорит о том, что, возможно, я использовал неправильный плагин. Поэтому я переключился на плагин maven-shade. Насколько я могу судить, он работает отлично. У меня есть исполняемый банку, которая включает в себя несколько модулей Spring, а также Apache MQ. Здесь соответствующий бит из моего pom.xml:

<build>
<finalName>sample-broker</finalName>
<plugins>
  ...
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.0</version>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>shade</goal>
        </goals>
        <configuration>
          <transformers>
            <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.ManifestResourceTransformer">
              <mainClass>org.XYZ</mainClass>
            </transformer>
          </transformers>
        </configuration>
      </execution>
    </executions>
  </plugin>
</plugins>
</build>

Ответ 3

Похож на ошибку в плагине сборки Maven - MASSEMBLY-360 и, как обсуждалось в этой записи в блоге здесь.

Короче говоря, файлы метаданных в Spring JAR, которые обрабатывают пространства имен Spring, искажаются maven.

Ответ 4

onejar-maven-plugin позволяет разрешать противоречия maven и spring, создавая один файл jar с зависимостями. Он создает обертку вокруг вашего файла jar, помещая его в другую банку (одну банку).

    <plugin>
            <groupId>org.dstovall</groupId>
            <artifactId>onejar-maven-plugin</artifactId>
            <version>1.4.4</version>
            <executions>
              <execution>
                <goals>
                    <goal>one-jar</goal>
                </goals>
              </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>your.package.App</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

<!-- outside build tag in pom.xml -->
<pluginRepositories>
        <pluginRepository>
            <id>onejar-maven-plugin.googlecode.com</id>
            <url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url>
        </pluginRepository>
</pluginRepositories>

Ответ 5

В дополнение к решению, опубликованному @GrampaJohn, я также должен был убедиться, что я упаковывал необходимые библиотеки в сгенерированный JAR файл, а не извлекал их в сгенерированный JAR.

В Eclipse Mars после внесения изменений в pom.xml(добавлен плагин maven-shade, предложенный @GrampaJohn), выполните следующие действия:

Файл → Экспорт → Выбрать папку Java → Загружаемый файл JAR → введите конфигурацию запуска (основной файл), пункт назначения экспорта и Обработка библиотеки, выберите "Необходимые пакеты. Библиотеки в сгенерированные JAR → Нажмите" Готово"

.