java - with - pom maven
¿Cómo crear un contenedor ejecutable basado en la primavera con maven? (5)
Tengo un proyecto de cliente Spring-WS basado en Maven que quiero empaquetar como un único contenedor. En eclipse, todo funciona correctamente. Cuando intento empaquetarlo como un archivo ejecutable, obtengo excepciones de ClassNotFound ya que los archivos jar de Spring no están incluidos en mi jar de aplicación.
Así que agregué maven-shade-plugin para incluir todas mis dependencias en mi jar de aplicación. Cuando miro mi jar de aplicación, veo todos los archivos de clase de todas las dependencias incluidas (todos los jar de la biblioteca están explotados).
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.cws.cs.Client</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Mi problema es que en el proceso de empaquetado, mis múltiples dependencias de muelles tienen diferentes archivos META-INF/spring.schemas que se anulan entre sí. En consecuencia, mi jar final tiene un archivo spring.schemas incompleto.
Así que cuando trato de ejecutar mi jar ejecutable, recibo los mensajes de error de Spring de que no se pueden encontrar los archivos porque el archivo spring.schemas está incompleto (el jarro de Spring-WS ha anulado el archivo spring.schemas de Spring-core).
Mi jar ejecutable es META-INF / spring.schemas:
http/://www.springframework.org/schema/web-services/web-services-1.5.xsd=/org/springframework/ws/config/web-services-1.5.xsd
http/://www.springframework.org/schema/web-services/web-services-2.0.xsd=/org/springframework/ws/config/web-services-2.0.xsd
http/://www.springframework.org/schema/web-services/web-services.xsd=/org/springframework/ws/config/web-services-2.0.xsd
En lugar de Spring-beans.jar META-INF / spring.schemas:
http/://www.springframework.org/schema/beans/spring-beans-2.0.xsd=org/springframework/beans/factory/xml/spring-beans-2.0.xsd
http/://www.springframework.org/schema/beans/spring-beans-2.5.xsd=org/springframework/beans/factory/xml/spring-beans-2.5.xsd
http/://www.springframework.org/schema/beans/spring-beans-3.0.xsd=org/springframework/beans/factory/xml/spring-beans-3.0.xsd
http/://www.springframework.org/schema/beans/spring-beans-3.1.xsd=org/springframework/beans/factory/xml/spring-beans-3.1.xsd
http/://www.springframework.org/schema/beans/spring-beans.xsd=org/springframework/beans/factory/xml/spring-beans-3.1.xsd
http/://www.springframework.org/schema/tool/spring-tool-2.0.xsd=org/springframework/beans/factory/xml/spring-tool-2.0.xsd
http/://www.springframework.org/schema/tool/spring-tool-2.5.xsd=org/springframework/beans/factory/xml/spring-tool-2.5.xsd
http/://www.springframework.org/schema/tool/spring-tool-3.0.xsd=org/springframework/beans/factory/xml/spring-tool-3.0.xsd
http/://www.springframework.org/schema/tool/spring-tool-3.1.xsd=org/springframework/beans/factory/xml/spring-tool-3.1.xsd
http/://www.springframework.org/schema/tool/spring-tool.xsd=org/springframework/beans/factory/xml/spring-tool-3.1.xsd
http/://www.springframework.org/schema/util/spring-util-2.0.xsd=org/springframework/beans/factory/xml/spring-util-2.0.xsd
http/://www.springframework.org/schema/util/spring-util-2.5.xsd=org/springframework/beans/factory/xml/spring-util-2.5.xsd
http/://www.springframework.org/schema/util/spring-util-3.0.xsd=org/springframework/beans/factory/xml/spring-util-3.0.xsd
http/://www.springframework.org/schema/util/spring-util-3.1.xsd=org/springframework/beans/factory/xml/spring-util-3.1.xsd
http/://www.springframework.org/schema/util/spring-util.xsd=org/springframework/beans/factory/xml/spring-util-3.1.xsd
Estoy perplejo. No estoy seguro de si puedo empaquetar todo como un solo archivo ejecutable. No sé si esto es un problema de configuración de complemento de tono, o si estoy tratando de hacer algo imposible. No parece correcto que tendría que crear manualmente mi propio archivo spring.schemas (una concatenación de los demás).
Puede que haya saltado un poco el arma. Al desenterrar más información sobre el plugin de sombras, noté el AppendingTransformer que me había perdido anteriormente. Sin embargo, mi preocupación es cómo saber qué otros archivos tienen los mismos problemas. He descubierto / atrapado este problema de primavera en particular. No tengo idea de ninguna otra biblioteca que pueda estar haciendo algo similar ...
Cualquier sugerencia sera apreciada.
¿Has probado el maven-assembly-plugin ?
Creará un único contenedor con dependencias para usted y, además, puede hacer que este contenedor sea ejecutable:
Use mainClass para especificar la clase que desea ejecutar.
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.3</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>org.sample.App</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
Ayer me encontré con este problema también.
La solución fue preparar los archivos necesarios mediante la concatenación manual y la configuración del complemento de ensamblaje mediante esto:
<files>
<file>
<source>src/META-INF/spring.schemas</source>
<outputDirectory>META-INF</outputDirectory>
</file>
<file>
<source>src/META-INF/spring.handlers</source>
<outputDirectory>META-INF</outputDirectory>
</file>
</files>
<dependencySets>
<dependencySet>
<outputDirectory>/</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<unpack>true</unpack>
<scope>runtime</scope>
<unpackOptions>
<excludes>
<exclude>META-INF/spring.handlers</exclude>
<exclude>META-INF/spring.schemas</exclude>
</excludes>
</unpackOptions>
</dependencySet>
</dependencySets>
NOTA: el uso de un enfoque de jar no es lo suficientemente bueno; no puede estar seguro de los archivos mezclados a mano, intente seguir exportando todas las dependencias como está ...
En lugar de maven-shade-plugin usa onejar-maven-plugin . One-JAR permite empaquetar una aplicación Java junto con sus Jars de dependencia en un único archivo Jar ejecutable.
Puede agregar la siguiente configuración para que los contenidos de los archivos .schema de todos los archivos jar se anexen.
<configuration>
<transformers>
<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>
assembly plugin have issues, use below 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>
you may get security exception resolve it using below configuration
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>