2012-06-22 13 views
28

Ho un progetto client Spring-WS basato su Maven che voglio impacchettare come un singolo jar. In Eclipse, tutto funziona correttamente. Quando provo a confezionarlo come un jar eseguibile, ottengo eccezioni ClassNotFound poiché i jar di Spring non sono inclusi nel jar dell'applicazione.Come creare un jar eseguibile basato a molla con maven?

Così ho aggiunto lo maven-shade-plugin per includere tutte le mie dipendenze nel mio jar dell'applicazione. Quando guardo il mio jar di app, vedo tutti i file di classe da tutte le dipendenze incluse (tutti i jar della libreria sono esplosi).

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

Il mio problema è che nel processo di confezionamento, i miei più dipendenze primaverili hanno diversi META-INF/spring.schemas file che sostituiscono l'un l'altro. Di conseguenza, il mio jar finale ha un file spring.schemas incompleto.

Così quando provo a eseguire il mio jar eseguibile, ricevo i messaggi di errore di Spring che i file non possono essere trovati poiché il file spring.schemas è incompleto (il vaso Spring-WS ha scavalcato il file spring.schemas di Spring-core).

miei META-INF del jar eseguibile/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 

Invece di Primavera-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 

stumped. Non sono sicuro se/come posso impacchettare tutto come un singolo jar eseguibile. Non so se questo è un problema di configurazione di ombreggiamento del plugin, o se sto cercando di fare qualcosa di impossibile. Non sembrerebbe corretto che dovrei creare manualmente il mio file spring.schemas (una concatenazione degli altri).

Forse ho saltato un po 'la pistola. Nel scavare più informazioni sul plugin per l'ombra, ho notato lo AppendingTransformer che avevo precedentemente perso. Tuttavia, la mia preoccupazione è come sapere quali altri file hanno gli stessi problemi? Ho scoperto/preso questo particolare problema di primavera. Non ho idea di altre librerie che potrebbero fare qualcosa di simile ...

Qualsiasi suggerimento sarebbe apprezzato.

+0

approccio alternativo che funziona alla grande è quello di mettere vasi di primavera nella cartella lib separata, e aggiungere questa cartella 'lib' nel percorso di classe in manifesta - vedere André Aronsen di rispondi a http://stackoverflow.com/a/4323501/241986 –

risposta

6

Invece di utilizzo Maven-ombra-plugin onejar-maven-plugin. One-JAR consente di impacchettare un'applicazione Java insieme ai suoi jar di dipendenza in un singolo file Jar eseguibile.

+3

Il mio problema con il plug-in one-jar è che crea un secondo jar nella cartella di destinazione con l'estensione one-jar.jar. Di conseguenza, quando provo a distribuire l'artefatto, distribuisce il vaso originale e non il vaso singolo. Sai se esiste un modo corretto di configurare il pom per evitare questo problema? –

+0

'one-jar' è un classificatore predefinito aggiunto dal plugin one-jar. Vedi http://onejar-maven-plugin.googlecode.com/svn/mavensite/usage.html Configura la distribuzione per utilizzare tale classificatore http://stackoverflow.com/questions/9743574/maven-how-to-install-a- jar-with-a-classifier-and-not-install-the-default-one – amra

57

È possibile aggiungere la seguente configurazione in modo che i contenuti dei file .schema di tutti i vasi vengano aggiunti insieme.

<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

Grazie - Ho visto la stessa cosa e ho appena modificato la mia domanda per includere tali informazioni. La mia domanda/problema è come sapere se ci sono altre librerie che possono avere problemi simili? Non mi si può aspettare che sappia il contenuto di tutte le cartelle META-INF per tutte le librerie che uso ... –

+0

Probabilmente non c'è modo di capirlo dall'analisi. L'unica opzione pratica è eseguire alcuni test, assicurarsi che funzioni e risolvere qualsiasi problema. – gkamal

+0

@gkamal che cosa significa "congiungersi insieme" non sono i file con lo stesso nome che si sovrascrivono quando vengono compressi in un 'jar'? in che modo diversi file con lo stesso nome non si scontrano in jar? – Jas

1

Hai provato il maven-assembly-plugin?

Si creerà un unico vaso con le dipendenze per voi e morevover può rendere questo barattolo essere eseguibile:

Usa mainClass per specificare la classe che si desidera eseguire.

<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

I plug-in di ombreggiatura e assemblaggio sono lo stesso concetto. Entrambi esploderanno le dipendenze e cercheranno di includerli nella stessa area. Entrambe incontrano problemi quando più dipendenze hanno file nello stesso percorso (es: META-INF/spring.schemas) –

4

Ieri ho riscontrato anche questo problema.

La soluzione era quella di preparare i file richiesti da concatenazione e la configurazione del plugin di montaggio manuale da questo:

<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: utilizzando uno approccio vaso non è abbastanza buono - non si può essere certi sul file misti mano , cercare di mantenere l'esportazione di ogni dipendenza di come è ...

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>