2010-09-06 10 views
15

soy capaz de compilar y empezar mi proyecto de Primavera utilizando Maven:excepción de aplicación de primavera a partir de Java

mvn -e clean compile exec:java -Dexec.mainClass=de.fraunhofer.fkie.tet.vmware.manager.Test 

Sin embargo, cuando montamos todo frascos en un solo archivo mediante el maven-assembly-plugin (incluyendo applicationContext.xml), siempre obtener una Exception durante la ejecución 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'. 

también probé para unir las definiciones de esquema, es decir spring-context.xsd etc., directamente a la ruta de clases, pero sin ningún éxito.

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> 
+0

Puedes publicar tu applicationContext.xml - o al menos la sección del encabezado. Sospecho que hay un problema con su referencia de cabeceras/dtd, etc. –

+0

'applicationContext.xml' está publicado arriba. Sorprendentemente, la aplicación se ejecuta sin ningún problema, si se usa 'mvn exec: java' para iniciarla. – rmv

Respuesta

19

controladores de espacio de nombres de Primavera se resuelven utilizando archivos /META-INF/spring.schemas y /META-INF/spring.handlers. Como los archivos con estos nombres existen en diferentes contenedores de Spring, probablemente solo uno de ellos permanece en el contenedor de destino después de maven-assembly-plugin.

Quizás pueda combinar estos archivos manualmente y de alguna forma configurar maven-assembly-plugin para sobrescribir el archivo en el archivo jar de destino con este archivo fusionado.

+2

Sí, tienes razón, eso es todo! Los archivos independientes '/META-INF/spring.handlers' de diferentes jar se pierden en el jar final. Frente a esto, decido no usar el 'maven-assembly-plugin' por el momento, pero incluyo todos los jars manualmente desde el directorio 'target/lib /' (luego de 'mvn install'), p. 'java -cp target/lib/spring-aop-3.0.4.RELEASE.jar: target/lib/spring-asm-3.0.4.RELEASE.jar: [...]: target/classes de.fraunhofer.fkie .tet.vmware.manager.Test '. Esto funciona como se esperaba ¡Muchas gracias! ;-) – rmv

+3

@rmv O puede dejar que maven-dependency-plugin haga la copia por usted, como en [aquí] (http://stackoverflow.com/questions/574594/how-can-i-create-an- ejecutable-jar-with-dependence-using-maven/4323501 # 4323501) – staromeste

4

Sospecho que su archivo de configuración de primavera no contiene el espacio de nombres XML context. Debe agregarse al elemento raíz de su archivo de configuración de resorte de esta manera:

<?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> 
+0

¡Gracias por la respuesta rápida! No publiqué mi archivo applicationContext.xml, porque 'mvn exec: java -Dexec.mainClass = de.fraunhofer.fkie.tet.vmware.manager.Test ' funciona bien. Así que creo que no hay nada de malo en el archivo de configuración en el principal, en realidad contiene todos los elementos de su ejemplo anterior. El problema ocurre cuando intento iniciar la versión ensamblada directamente desde Java. – rmv

0

¿Qué dependencias de primavera tiene en su pom? Puede obtener errores de análisis xml debido a que algunos archivos jar de resorte no están en la ruta de la clase. En la primavera 3, la biblioteca se dividió en muchos archivos jar. Salida this post para ver lo que necesita, específicamente:

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-context</artifactId> 
    <version>${org.springframework.version}</version> 
</dependency> 
+0

Gracias por la sugerencia, pero 'spring-context.jar' ya está ensamblado en 'target/test-jar-with-dependencies.jar', es decir, el jar final contiene 'org/springframework/context/config/spring-context- 3.0.xsd '. Por cierto: estamos conectados a internet a través de un servidor proxy. ¿Es posible que Maven use algunas configuraciones de proxy en todo el sistema, mientras que Java no puede conectar y verificar documentos '.xsd' desde la web? – rmv

+0

Actualización: no tiene nada que ver con problemas de proxy como lo verifiqué con una prueba en casa conectada directamente a Internet. – rmv

3

He encontrado el problema de raíz para esto según la respuesta de axtavt, y lo he informado como un? Error? en Spring: https://jira.springsource.org/browse/SPR-8368 - se incluye una solución alternativa para generar sus propias copias fusionadas de estos archivos. Para la posteridad el código es aquí también:

//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"); 
} 
1

Creo que hay 3 soluciones a este problema

  1. el archivo JAR TX debe ser incluido en la ruta de clase/BuildPath del proyecto. (Error más común)
  2. mencionados por "axtavt" por encima
  3. Pruebe esta solución antes "axtaxt": ir a su directorio de guerra (especificado en GWT de lengüeta avanzada compilar) y poner el archivo de primavera-tx.jar en el lib carpeta debajo de su directorio war, actualice y vuelva a ejecutar.
0

Como sugiere que hay un problema con el análisis en Solicitud o en Respuesta. Este error puede ocurrir si el cliente RestTemplate espera un tipo particular de respuesta del recurso, pero el recurso devuelve algo por completo. Recibí este error para un cliente POST RestTemplate que estaba relacionado con el cambio en la Respuesta devuelta.

Por ej.RestTemplate inicial que regresaba de una entidad MiClase 'cambiado y se quedó de regresar de cuerdas por lo que el Analizador empezó a dar error

ResponseEntity<MyClass> postResponseEntity = restTemplate.postForEntity(postEndPoint, httpRequestEntity, MyClass.class); 
MyClass postResponseBody = postResponseEntity.getBody(); 

cambiado a

ResponseEntity<String> postResponseEntity = restTemplate.postForEntity(postEndPoint, httpRequestEntity, String.class); 
String postResponseBody = postResponseEntity.getBody(); 

Como el tipo de respuesta cambiado desde la entidad a la cadena el analizador comenzó dando error al procesar la Respuesta. Cambié para corregir el tipo de respuesta (que en mi caso era String) y comenzó a funcionar.

Cuestiones relacionadas