2009-09-30 17 views
20

Um Maven Gurus da draußen: Ich versuche, Non-Java-Projekt Artefakte (.NET) in eine einzige Zip-Datei zu packen. Ich habe 2 Probleme:Maven Erstellen flacher Reißverschluss-Assembly

Wenn ich Verpackung in meinem POM ändern <packaging>zip</packaging> zip, ich diese Fehlermeldung: [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, keine große Sache - habe ich es zu <packaging>pom</packaging> loszuwerden nutzlos Glas, die sonst erzeugt wird im Zielverzeichnis

Mein Hauptproblem ist, dass Dateien, die ich in ZIP verpacken, in wenigen Verzeichnissen verschachtelt sind, aber ich muss diese in das oberste Verzeichnis von ZIP setzen. Hier ist meine Assembly-Datei:

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

Als ich betreiben diese - ich werde ZIP-Datei erhalten, aber Dateien werden verschachtelt werden beginnend mit C: \ durch vollständigen Pfad gefolgt. Um Ihnen Idee - Projekt-Dumps es Binärdateien in die folgende Struktur ProjectFoo\ProjectFoo\subproject1\Bin\Release\foo.dll und ich brauche ZIP\foo.dll

Ist hier Montage Plugin-Konfiguration:

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

Vielleicht ant zip Ich muss nur antrun verwenden und ausführen Aufgabe?

Antwort

27

Wie Sie gesehen haben, gibt es keinen Zip-Verpackungstyp. Daher ist es sinnvoll, die Pom-Verpackung so zu verwenden, wie Sie es gewählt haben.

Sie haben in der Verarbeitung des Assembly-Plugins ein kleines Loch gefunden. Sie können dies beheben, indem Sie mehrere Dateisätze in der Assembly mit <outputDirectory>/<outputDirectory> angeben, eine für jedes Verzeichnis, das Sie einfügen möchten. Dies ist offensichtlich eine PITA und wahrscheinlich keine akzeptable Lösung.

Ein alternativer Ansatz besteht darin, den Ant-Kopiervorgang zu verwenden, um alle DLLs in ein Bereitstellungsverzeichnis zu kopieren und dieses Verzeichnis dann in die Assembly aufzunehmen.

Die folgende Konfiguration sollte tun, was Sie nach:

The antrun-Plugin-Konfiguration:

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

Die Montage:

<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

Genau das, was ich brauchte! Danke Rich! – Bostone

+0

Sie sind willkommen –

+0

Es gibt immer noch ein Problem. Die Zip enthält immer noch ein Top-Verzeichnis vom Typ "artifactId-Version". Wenn ich zip entpacke, landen meine Dateien nicht in '/' sondern in '/ Foo-1.0-SNAPSHOT /'. Dennoch werden die Dateien korrekt in target/dll-staging kopiert. – Bostone