2009-06-09 11 views
8

Sto utilizzando il plug-in di assembly Maven 2 per creare un jar-with-dependencies e creare un file JAR eseguibile. Il mio assembly include Spring e la libreria CXF.Il plug-in Maven 2 clobbers alcuni file META-INF

CXF include copie di file META-INF spring.schemas e spring.handlers che terminano con il blobare i file simili dal jar spring-2.5.4.

A mano, posso aggiornare questi due file all'interno di jar-with-dependencies.

Quello che sto cercando è un modo nel Maven POM per dirigere il plug-in di assembly per ottenere la versione corretta di questi due file.

La documentazione del plug-in di assemblaggio parla del filtro dei file, ma non sembra avere configurazione o parametri, senza il problema di creare un descrittore di assieme personalizzato.

Creare un descrittore di assieme personalizzato è la mia unica speranza in questo caso?

+0

La stessa cosa accade con i file "spring.tooling", ma dal loro nome che sto cercando di indovinare che non sono abituati a runtime. –

risposta

6

Per qualche motivo la soluzione che Mojo e gli altri suggeriscono ancora non funziona per me.Ho creato i miei file personalizzati spring.handlers e spring.schemas e li ho inseriti in src/main/resources/META-INF. Tuttavia, quando si utilizza lo unpackOptions i miei file non sono inclusi. Quando non uso lo unpackOptions i miei file non sono quelli nel barattolo.

Quello che ho finito è fare riferimento direttamente ai file. Questo finalmente mise i miei file nel JAR.

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"> 
    <!-- TODO: a jarjar format would be better --> 
    <id>jar-with-dependencies</id> 
    <formats> 
     <format>jar</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <dependencySets> 
     <dependencySet> 
      <outputDirectory>/</outputDirectory> 
      <unpack>true</unpack> 
      <unpackOptions> 
       <excludes> 
        <exclude>META-INF/spring.handlers</exclude> 
        <exclude>META-INF/spring.schemas</exclude> 
       </excludes> 
      </unpackOptions> 
      <scope>runtime</scope> 
     </dependencySet> 
    </dependencySets> 
    <files> 
     <file> 
      <source>${project.basedir}/src/main/resources/META-INF/spring.handlers</source> 
      <outputDirectory>META-INF</outputDirectory> 
     </file> 
     <file> 
      <source>${project.basedir}/src/main/resources/META-INF/spring.schemas</source> 
      <outputDirectory>META-INF</outputDirectory> 
     </file> 
    </files> 
</assembly> 
+0

In effetti questa soluzione è migliore e più generale. Ho dovuto ricorrere a me stesso quando le precedenti esclusioni hanno smesso di funzionare per me per qualche motivo. – Mojo

+0

Ho dovuto aggiungere true per includere le classi nello stesso progetto. – jontro

1

ho lavorato fuori, e qui ci sono i dettagli:

In primo luogo, non c'è modo di specificare il file include o esclude se si utilizza il descrittore di assemblaggio vaso-con-dipendenze incorporato.

La documentazione del plug-in di assemblaggio fornisce il campione jar-with-dependencies descriptor here.

Ho copiato e incollato quel descrittore in un file nella mia directory di progetto chiamato exec-jar.xml. Quindi, nel pom, ho modificato il plug-in dell'assieme per fare riferimento a quel descrittore. Ecco l'estratto:

<build> 
    <plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.2-beta-3</version> 
     <configuration> 
      <descriptors> 
       <descriptor>exec-jar.xml</descriptor> 
      </descriptors> 
      <archive> 
       <manifest> 
        <mainClass>com.package.MyMainClass</mainClass> 
       </manifest> 
      </archive> 
     </configuration> 
     <executions> 
      <execution> 
       <id>make-assembly</id> 
       <phase>package</phase> 
       <goals> 
        <goal>single</goal> 
       </goals> 
      </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 

Quel po 'di descrittore si lega il gruppo alla fase confezione del ciclo di vita, e fa riferimento al descrittore exec-jar.xml. Facendo quel pacchetto confermò che il barattolo era stato creato esattamente come era con il descrittore predefinito.

Quindi, si tratta di modificare exec-jar.xml per escludere i file CXF che sono in conflitto con i file Spring. Ecco il mio descrittore di assemblaggio che realizza che:

<assembly> 
    <id>jar-with-dependencies</id> 
    <formats> 
    <format>jar</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <dependencySets> 
    <dependencySet> 
     <unpack>true</unpack> 
     <unpackOptions> 
     <excludes> 
      <exclude>cxf*/META-INF/spring.handlers</exclude> 
      <exclude>cxf*/META-INF/spring.schemas</exclude> 
     </excludes> 
     </unpackOptions> 
     <scope>runtime</scope> 
    </dependencySet> 
    </dependencySets> 
    <fileSets> 
    <fileSet> 
     <directory>${project.build.outputDirectory}</directory> 
    </fileSet> 
    </fileSets> 
</assembly> 

Ora qui sta il problema. Se lo fai con il plug-in assembly attualmente rilasciato, versione 2.1, fallirà sul tag come "inaspettato". Il tag è supportato nella versione 2.2 non rilasciata del plug-in. Nota nel mio estratto del file pom sopra, ho specificato la versione 2.2-beta-3 di maven-assembly-plugin che era l'ultima al momento della scrittura.

Questo ha creato un jar eseguibile e Spring aveva tutti i gestori e gli schemi necessari per inizializzare la mia app.

1

È inoltre possibile aggirare il problema recuperando i file spring.schemas e spring.handlers dalla distro primaverile desiderata e inserirli nella directory src/main/resources/META-INF dei progetti. Poiché quelli sono imballati per ultimi, otterrai la versione che desideri. Ho trovato l'idea here

5

Ho provato l'approccio del plug-in dello schermo e ha funzionato molto bene. Ecco tutto ciò che è necessario inserire nel tuo POM (non è necessario alcun plug-in di assembly).

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>1.4</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <transformers> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
           <mainClass>org.example.Runner</mainClass> 
          </transformer> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
           <resource>META-INF/spring.handlers</resource> 
          </transformer> 
         </transformers> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
+0

Questo ha funzionato per me –