Еще одна "неспособная найти ошибку 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 → Нажмите" Готово"
.