Исключение запуска Spring приложения из Java
Я могу скомпилировать и запустить проект Spring с помощью Maven:
mvn -e clean compile exec:java -Dexec.mainClass=de.fraunhofer.fkie.tet.vmware.manager.Test
Однако, когда я собираю все банки в одном файле с помощью maven-assembly-plugin
(включая applicationContext.xml
), я всегда получаю Exception
во время выполнения java
:
java -cp target/test-jar-with-dependencies.jar:. de.fraunhofer.fkie.tet.vmware.manager.Test
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
Sep 6, 2010 10:37:21 AM org.springframework.util.xml.SimpleSaxErrorHandler warning
WARNING: Ignored XML validation warning
org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document 'http://www.springframework.org/schema/context/spring-context.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.
...
Exception in thread "main" org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException:
Line 10 in XML document from class path resource [applicationContext.xml] is invalid; nested exception is org.xml.sax.SAXParseException: cvc-complex-type.2.4.c:
The matching wildcard is strict, but no declaration can be found for element 'context:annotation-config'.
...
Caused by: org.xml.sax.SAXParseException: cvc-complex-type.2.4.c:
The matching wildcard is strict, but no declaration can be found for element 'context:annotation-config'.
Я также попытался привязать определения схемы, т.е. spring-context.xsd
и т.д., непосредственно к пути к классам, но без каких-либо успехов.
less src/main/resources/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:context="http://www.springframework.org/schema/context"
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">
<context:annotation-config /> <!-- wegen '@PostConstruct' -->
<!--<context:component-scan base-package="de.fraunhofer" /> -->
...
</beans>
Ответы
Ответ 1
Spring обработчики пространства имен разрешены с использованием файлов /META-INF/spring.schemas
и /META-INF/spring.handlers
. Поскольку файлы с этими именами существуют в разных банках Spring, вероятно, только один из них остается в целевой банке после maven-assembly-plugin
.
Возможно, вы можете объединить эти файлы вручную и каким-то образом настроить maven-assembly-plugin
на перезапись файла в целевой банке с помощью этого объединенного файла.
Ответ 2
Я подозреваю, что в вашем конфигурационном файле spring отсутствует пространство имен context
XML. Он должен быть добавлен в корневой элемент вашего конфигурационного файла spring следующим образом:
<?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: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">
<context:annotation-config />
<context:component-scan base-package="com.abc.xyz" />
</beans>
Ответ 3
Я нашел корневую проблему для этого в ответ на axtavt, и я сообщил об этом как об ошибке? в Spring: https://jira.springsource.org/browse/SPR-8368 - туда можно найти обходное решение для создания собственных объединенных копий этих файлов. Для потомков код также здесь:
//IOUtils and FileUtils come from Apache Commons IO
for(String s : new String[] {"spring.schemas", "spring.handlers", "spring.tooling"}) {
Enumeration<?> e = Test.class.getClassLoader().getResources("META-INF/"+s);
StringBuilder out = new StringBuilder();
while(e.hasMoreElements()) {
URL u = (URL) e.nextElement();
out.append(IOUtils.toString(u.openStream())).append("\n");
}
File outf = new File(s);
FileUtils.writeStringToFile(outf, out.toString(), "UTF-8");
}
Ответ 4
Я считаю, что есть 3 решения этой проблемы
- Файл tx jar должен быть включен в путь classpath/buildpath проекта. (наиболее распространенная ошибка)
- Упоминается "axtavt" выше
- Попробуйте это до решения "axtaxt": перейдите в свою военную директорию (указанную на вкладке GWT compile advanced) и поместите файл spring -tx.jar в папку lib под вашим военным каталогом, обновите и запустите снова.
Ответ 5
Какие spring зависимости у вас есть в вашем pom? Вы можете получить ошибки синтаксического анализа xml из-за того, что некоторые файлы jar spring не находятся на пути к классу. В spring 3 библиотека была разделена на множество файлов jar. Отметьте этот пост, чтобы узнать, что вам нужно, в частности:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework.version}</version>
</dependency>
Ответ 6
Как предполагается, существует проблема с синтаксическим анализом в запросе или в ответе. Эта ошибка может возникнуть, если клиент RestTemplate ожидает определенного вида ответа от ресурса, но ресурс полностью возвращает. Я получил эту ошибку для клиента POST RestTemplate, который был связан с изменением возвращаемого ответа.
Например, Первоначальная RestTemplate, которая возвращала Entity MyClass, изменилась и посмотрела на возвращающую String, чтобы Parser начал давать ошибку
ResponseEntity<MyClass> postResponseEntity = restTemplate.postForEntity(postEndPoint, httpRequestEntity, MyClass.class);
MyClass postResponseBody = postResponseEntity.getBody();
Изменено на
ResponseEntity<String> postResponseEntity = restTemplate.postForEntity(postEndPoint, httpRequestEntity, String.class);
String postResponseBody = postResponseEntity.getBody();
Когда тип ответа изменился с объекта на String, парсер начал выдавать ошибку при обработке ответа. Изменил его, чтобы исправить тип ответа (который в моем случае был String), и он начал работать.