2012-06-22 19 views
28

Tengo un proyecto de cliente Spring-WS basado en Maven que deseo 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.¿Cómo crear un contenedor ejecutable basado en la primavera con maven?

Así que agregué el 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 envasado, mis múltiples dependencias de primavera tienen diferentes META-INF/spring.schemas archivos que anulan entre sí. En consecuencia, mi jar final tiene un archivo spring.schemas incompleto.

Así que cuando intento ejecutar mi jar ejecutable, recibo los mensajes de error de Spring de que no se pueden encontrar archivos porque el archivo spring.schemas está incompleto (el archivo Spring-WS ha anulado el archivo spring.schemas de Spring-core).

Mis META-INF del jar ejecutable/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 META-INF/spring.schemas Primavera-beans.jar:

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 salté el arma un poco. 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 sería apreciada.

+0

enfoque alternativo que funciona muy bien es colocar frascos de primavera en la carpeta lib separada, y añadir esta carpeta 'lib' en la ruta de clase en el manifiesto - ver André Aronsen de respuesta http://stackoverflow.com/a/4323501/241986 –

Respuesta

6

En lugar de maven-shade-plugin use onejar-maven-plugin. One-JAR le permite empaquetar una aplicación Java junto con sus Jars de dependencia en un solo archivo jar ejecutable.

+3

Mi problema con el plugin one-jar es que crea un segundo jar en la carpeta de destino con la extensión one-jar.jar. En consecuencia, cuando intento desplegar el artefacto, despliega el jar original y no el one-jar. ¿Sabes si hay una forma adecuada de configurar el pom para evitar este problema? –

+0

'one-jar' es un clasificador predeterminado agregado por el plugin one-jar. Consulte http://onejar-maven-plugin.googlecode.com/svn/mavensite/usage.html Configure deployment para usar ese clasificador http://stackoverflow.com/questions/9743574/maven-how-to-install-a- jar-with-a-clasificador-y-no-instalar-el-predeterminado-uno – amra

57

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

Gracias - Vi lo mismo y acababa de editar mi pregunta para incluir esa información. Mi pregunta/problema es cómo saber si hay otras bibliotecas que puedan estar experimentando problemas similares. No se puede esperar que sepa el contenido de todas las carpetas de META-INF para todas las librerías que uso ... –

+0

Probablemente no haya forma de averiguarlo por análisis. La única opción práctica es realizar algunas pruebas, asegurarse de que funcione y arreglar todo lo que esté roto. – gkamal

+0

@gkamal ¿qué significa 'get appended together' no son archivos con el mismo nombre de archivo que el uno sobre el otro cuando están empaquetados en un' jar'? ¿Cómo pueden diferentes archivos con el mismo nombre no colisionar en el contenedor? – Jas

1

¿Has probado el maven-assembly-plugin?

Se va a crear un solo frasco con dependencias para usted y morevover puede hacer que este frasco sea ejecutable:

Uso 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> 
+3

Los complementos de sombreado y ensamblaje son el mismo concepto. Ambos explotarán las dependencias e intentarán incluirlas en la misma área. Ambos tienen problemas cuando varias dependencias tienen archivos en la misma ruta (ej: META-INF/spring.schemas) –

4

Ayer también he tenido este problema.

La solución fue preparar archivos requeridos por la concatenación manual y configuración del plug-in de montaje por 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 frasco no es lo suficientemente bueno - no se puede estar seguro de archivos mixtos mano , trate de mantener la exportación de toda dependencia de como es ...

1
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> 
Cuestiones relacionadas