Je suis capable de compiler et de démarrer mon projet Spring avec Maven:
mvn -e clean compile exec:Java -Dexec.mainClass=de.fraunhofer.fkie.tet.vmware.manager.Test
Cependant, lorsque j'assemble tous les fichiers JAR dans un seul fichier à l'aide de maven-Assembly-plugin
(y compris applicationContext.xml
), je reçois toujours une Exception
lors de l'exécution de 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'.
J'ai également essayé de joindre les définitions de schéma, c'est-à-dire spring-context.xsd
, etc. directement au chemin de classe, mais sans succès.
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>
Les gestionnaires d’espace de noms Spring sont résolus à l’aide des fichiers /META-INF/spring.schemas
et /META-INF/spring.handlers
. Comme les fichiers portant ces noms existent dans des fichiers Spring différents, il est probable qu’un seul d’entre eux reste dans le fichier jar cible après maven-Assembly-plugin
.
Peut-être pourriez-vous fusionner ces fichiers manuellement et configurer en quelque sorte maven-Assembly-plugin
pour écraser le fichier dans le fichier jar cible avec ce fichier fusionné.
Je suspecte que votre fichier de configuration print soit manquant dans l'espace de noms XML context
. Il devrait être ajouté à l’élément racine de votre fichier de configuration print comme ceci:
<?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>
J'ai trouvé le problème racine pour cela selon la réponse de axtavt, et je l'ai signalé comme un? Bug? au printemps: https://jira.springsource.org/browse/SPR-8368 - une solution de contournement pour générer vos propres copies fusionnées de ces fichiers est incluse ici. Pour la postérité, le code est aussi ici:
//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");
}
Je crois qu'il y a 3 solutions à ce problème
Quelles dépendances de printemps avez-vous dans votre pom? Il est possible que vous rencontriez des erreurs d’analyse xml car certains fichiers jar de printemps ne se trouvent pas sur le chemin de classe. Au printemps 3, la bibliothèque a été divisée en plusieurs fichiers jar. Découvrez cet article pour voir ce dont vous avez besoin, en particulier:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework.version}</version>
</dependency>
Comme cela suggère, il y a un problème avec l'analyse syntaxique dans Request ou Response. Cette erreur peut se produire si le client RestTemplate attend un type particulier de réponse de la ressource, mais que la ressource renvoie complètement quelque chose. J'ai eu cette erreur pour un client POST RestTemplate qui était lié à une modification dans la réponse renvoyée.
Par exemple RestTemplate initial qui renvoyait une entité 'MyClass' a été modifié et a renvoyé String afin que l'analyseur commence à donner une erreur
ResponseEntity<MyClass> postResponseEntity = restTemplate.postForEntity(postEndPoint, httpRequestEntity, MyClass.class);
MyClass postResponseBody = postResponseEntity.getBody();
Changé en
ResponseEntity<String> postResponseEntity = restTemplate.postForEntity(postEndPoint, httpRequestEntity, String.class);
String postResponseBody = postResponseEntity.getBody();
Lorsque le type de réponse est passé de l'entité à String, l'analyseur a commencé à donner une erreur lors du traitement de la réponse. Changé pour corriger le type de réponse (qui dans mon cas était String) et cela a commencé à fonctionner.