files - Idea para evitar que spring.handlers/spring.schemas se sobrescriban al fusionar mĂșltiples dependencias de primavera en un solo contenedor
maven-assembly-plugin example (2)
Obtuve el error Unable to locate NamespaceHandler when using context:annotation-config
running (java -jar) un jar ensamblado por maven-assembly-plugin y que contiene mi proyecto y todas sus dependencias.
Como otras personas detectaron correctamente en el hilo de forum.springsource.org (mensaje # 7/8 ) el problema ocurre porque los archivos META-INF/spring.handlers
y META-INF/spring.schemas
que están presentes en diferentes jarras, se sobrescriben cuando maven-assembly-plugin reempaca los frascos en un solo archivo.
Al mirar el contenido de dos archivos spring - *. Jar, puede ver que los archivos se encuentran en la misma posición que la classpath
$ 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 posible colocar la carpeta META-INF en un paquete específico? Si es así, la idea que sugeriría (espero que sea aplicable) es colocar 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 fusionen en un único contenedor. ¿Qué piensa usted al respecto?
Con Ant.
<!--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>
Logré deshacerme del error usando el plugin shader en lugar del plugin ensamblador (buggy):
<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 encontré la solución en los foros de springsource. Ha pasado bastante tiempo desde que lo busqué ... realmente no recuerdo al autor. Felicitaciones a él de todos modos: p
aclamaciones