2009-09-30 2 views
20

Per i guru di Maven: Sto provando a raggruppare gli elementi del progetto non-java (.NET) in un singolo file zip. Sto avendo 2 problemi:Maven che crea un assemblaggio con cerniera piatta

Se cambio imballaggio nel mio POM a zip <packaging>zip</packaging>, ottengo questo messaggio di errore: [INFO] Cannot find lifecycle mapping for packaging: 'zip'. Component descriptor cannot be found in the component repository: org.apache.mav en.lifecycle.mapping.LifecycleMappingzip. OK, non un grosso problema - ho cambiato in <packaging>pom</packaging> per sbarazzarsi di vaso inutili che altrimenti creato nel dir target

Il mio problema principale è che i file che sto impacchettando in ZIP sono annidati in poche directory, ma ho bisogno di inserirli nella top directory di ZIP. Ecco il mio file assembly:

<assembly> 
    <id>bin</id> 
    <formats> 
    <format>zip</format> 
    </formats> 
    <fileSets> 
    <fileSet> 
     <directory>${basedir}/${project.artifactId}</directory> 
     <includes> 
     <include>**/Bin/Release/*.dll</include> 
     <include>**/Bin/Release/*.pdb</include> 
     </includes> 
    </fileSet> 
    </fileSets> 
</assembly> 

Quando eseguo questo - Prendo file ZIP, ma i file verranno nidificati che iniziano per C: \ seguito dal percorso completo. Per darvi un'idea - progetto discariche è binari nella seguente struttura ProjectFoo\ProjectFoo\subproject1\Bin\Release\foo.dll e ho bisogno di configurazione ZIP\foo.dll

Ecco il montaggio plug-in:

<plugin> 
<artifactId>maven-assembly-plugin</artifactId> 
<configuration> 
    <descriptors> 
     <descriptor>assembly.xml</descriptor> 
    </descriptors> 
</configuration> 
<executions> 
    <execution> 
     <id>zip</id> 
     <phase>package</phase> 
     <goals> 
      <goal>single</goal> 
     </goals> 
    </execution> 
</executions> 

Forse ho solo bisogno di usare antrun ed eseguire zip formica compito?

risposta

27

Come si è visto, non esiste un tipo di confezione zip, quindi è logico utilizzare la confezione pom come si è scelto.

Si è verificato un piccolo problema nell'elaborazione del plug-in di assemblaggio. È possibile risolvere questo problema specificando più file set nell'assieme con <outputDirectory>/<outputDirectory>, uno per ogni directory che si desidera includere, si tratta ovviamente di una PITA e probabilmente non è una soluzione accettabile.

Un approccio alternativo consiste nell'utilizzare l'attività di copia di Ant per copiare tutte le DLL in una directory di staging, quindi includere tale directory nell'assembly.

La seguente configurazione dovrebbe fare quello che stai dopo:

La configurazione antrun-plugin:

<plugin> 
    <artifactId>maven-antrun-plugin</artifactId> 
    <version>1.3</version> 
    <executions> 
     <execution> 
     <phase>process-resources</phase> 
     <configuration> 
      <tasks> 
      <copy todir="${project.build.directory}/dll-staging"> 
       <fileset dir="${basedir}/${project.artifactId}"> 
       <include name="**/Bin/Release/*.dll"/> 
       <include name="**/Bin/Release/*.pdb"/> 
       </fileset> 
       <flattenmapper/> 
      </copy> 
      </tasks> 
     </configuration> 
     <goals> 
      <goal>run</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 

L'assemblea:

<assembly> 
    <id>bin</id> 
    <formats> 
    <format>zip</format> 
    </formats> 
    <fileSets> 
    <fileSet> 
     <directory>${project.build.directory}/dll-staging</directory> 
     <outputDirectory>/</outputDirectory> 
     <includes> 
     <include>*.dll</include> 
     <include>*.pdb</include> 
     </includes> 
    </fileSet> 
    </fileSets> 
</assembly> 
+0

Esattamente quello di cui avevo bisogno! Grazie ricco! – Bostone

+0

siete i benvenuti –

+0

C'è ancora un problema però. Lo zip mantiene ancora una directory superiore di tipo "artifactId-Version". Quando estrai zip tutti i miei file finiscono non in '/' ma in '/ Foo-1.0-SNAPSHOT /'. Eppure i file sono copiati correttamente in target/dll-staging – Bostone