2011-04-07 8 views
35

Recibí el error Unable to locate NamespaceHandler when using context:annotation-config ejecutando (java -jar) un contenedor ensamblado por maven-assembly-plugin y conteniendo mi proyecto y todas sus dependencias.Idea para evitar que spring.handlers/spring.schemas se sobrescriban al fusionar varias dependencias de resorte en un solo contenedor

Como otras personas detectaron correctamente en el forum.springsource.org thread (message #7/8) El problema se produce porque los archivos META-INF/spring.handlers y META-INF/spring.schemas que están presentes en diferentes frascos, se sobreescriben, cuando el experto-montaje-plugin vuelve a empaquetar los frascos en un solo archivo.

Mirando el contenido de dos de primavera -. * Archivos jar se pueden ver los archivos se encuentra en la misma posición con respecto a la ruta de clase

$ jar tf spring-oxm-3.0.3.RELEASE.jar 
META-INF/spring.handlers 
META-INF/spring.schemas 
org/springframework/oxm/GenericMarshaller.class 
... 

$ jar tf spring-context-3.0.3.RELEASE.jar 
META-INF/spring.handlers 
META-INF/spring.schemas 
org/springframework/context/ApplicationContext.class 

no es que es posible poner la carpeta META-INF en un paquete específico? Si es así, la idea que sugeriría (espero que sea aplicable) es poner los archivos META-INF/spring.shemas y META-INF/spring.handlers bajo el paquete al que se refieren.

$ jar tf spring-oxm-3.0.3.RELEASE.jar 
org/springframework/oxm/META-INF/spring.schemas 
org/springframework/oxm/META-INF/spring.handlers 
org/springframework/oxm/GenericMarshaller.class 
... 

$ jar tf spring-context-3.0.3.RELEASE.jar 
org/springframework/context/META-INF/spring.handlers 
org/springframework/context/META-INF/spring.schemas 
org/springframework/context/ApplicationContext.class 

De esta forma no entrarán en conflicto cuando se combinen en un solo contenedor. ¿Qué piensa usted al respecto?

+0

Probablemente no funcionará. Esperaría que cualquier código que se lea estos archivos use una llamada 'ClassLoader.getResource()', que se ve en la raíz del classpath. O (más probable) examina explícitamente los archivos en el classpath. – Anon

+0

Sí, no funcionará simplemente moviendo los archivos en esa ubicación sin cambiar el código que lo carga. Me pregunto si esa es una mejor manera de organizar esa información, ya que mantiene las cosas en paquetes separados (también conocidos como espacios de nombres). Me gustaría enviar una solicitud de mejora a SpringSrouce si la idea es buena. –

+2

Es posible que desee marcar la pregunta 26+ como una respuesta @ Xan. – Gray

Respuesta

83

me las arreglé para deshacerse del fallo usando el plugin de shader en lugar de la (con errores) ensamblador plugin:

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <transformers> 
          <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
           <mainClass>at.seresunit.lecturemanager_connector.App</mainClass> 
          </transformer> 
          <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> 
         </transformers> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 

Creo que he encontrado la solución en los foros de SpringSource .. lo ha sido desde hace bastante tiempo desde que lo busqué ... realmente no recuerdo al autor. Felicitaciones a él de todos modos: p

aplausos

+3

lol. Me acabo de dar cuenta de que esta es mi respuesta más votada ... sin un tic: p – chzbrgla

+1

me funciona. gracias –

+1

@chzbrgla Gracias por contribuir y ayudar al resto de no sufrir tanto :) esto funcionó muy bien para mí. –

2

con la hormiga.

<!--define couple of properties to identify spring jar files--> 
<property name="spring-beans-jar" value="spring-beans-4.0.5.RELEASE.jar"/> 
<property name="spring-context-jar" value="spring-context-4.0.5.RELEASE.jar"/> 

<!--other properties--> 


<target name="dist" depends="compile" description="Prepare distribution"> 
    <!--dump spring-context into build classes (or some place else)--> 
    <unjar src="${lib.dir}/${spring-context-jar}" dest="${build.classes.dir}"/> 

    <!--dump spring-beans on top of it overwriting META-INF/spring.* files--> 
    <unjar src="${lib.dir}/${spring-beans-jar}" dest="${build.classes.dir}"/> 

    <!--get overwritten META-INF/spring.* files of spring-context to some other place--> 
    <unjar src="${lib.dir}/${spring-context-jar}" dest="${build.tmp.dir}"> 
     <patternset> 
      <include name="META-INF/spring.handlers"/> 
      <include name="META-INF/spring.schemas"/> 
      <include name="META-INF/spring.tooling"/> 
     </patternset> 
    </unjar> 

    <!--skipped spring-beans/META-INF/spring.factories as its not present in spring-context--> 
    <!--handled only spring-context and spring-beans as that's what I needed at this point--> 

    <!--append content from spring-context/META-INF/spring.* files--> 
    <concat destfile="${build.classes.dir}/META-INF/spring.handlers" append="true"> 
     <filelist dir="${build.tmp.dir}" files="META-INF/spring.handlers"/> 
    </concat> 
    <concat destfile="${build.classes.dir}/META-INF/spring.schemas" append="true"> 
     <filelist dir="${build.tmp.dir}" files="META-INF/spring.schemas"/> 
    </concat> 
    <concat destfile="${build.classes.dir}/META-INF/spring.tooling" append="true"> 
     <filelist dir="${build.tmp.dir}" files="META-INF/spring.tooling"/> 
    </concat> 

    <jar destfile="${build.dist.dir}/application.jar"> 
     <fileset dir="${build.classes.dir}"/> 

     <!--include all .jar files except already extracted ones--> 
     <zipgroupfileset dir="${lib.dir}" includes="*.jar" 
         excludes="${spring-beans-jar}, ${spring-context-jar}"/> 
     <manifest> 
      <attribute name="Main-Class" value="${main-class}"/> 
     </manifest> 
    </jar> 
</target> 
Cuestiones relacionadas