2009-09-30 18 views
20

Para los gurús de Maven: Estoy tratando de empacar artefactos de proyecto que no son Java (.NET) en un solo archivo zip. Tengo 2 problemas:Maven creando conjunto de cremallera plana

Si cambio de envasado en mi POM para comprimir <packaging>zip</packaging>, me sale este mensaje de error: [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, no es gran cosa - lo cambié a <packaging>pom</packaging> para deshacerse del tarro inútil que se crea lo contrario en el directorio de destino

Mi problema principal es que los archivos que estoy empaquetando en ZIP están anidados en algunos directorios pero necesito ponerlos en el directorio superior de ZIP. Aquí está mi archivo de ensamblaje:

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

Cuando ejecuto esto - Voy a archivo ZIP, pero los archivos se pueden anidar partir de C: \ seguido por ruta completa. Para darle idea - proyecto de vertederos es binarios en la siguiente estructura ProjectFoo\ProjectFoo\subproject1\Bin\Release\foo.dll y necesito configuración ZIP\foo.dll

Aquí está el montaje plugin:

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

Tal vez sólo necesita utilizar antRun y ​​ejecutar postal hormiga ¿tarea?

Respuesta

27

Como has visto, no hay un tipo de embalaje con cremallera, por lo que tiene sentido usar el paquete de pom que hayas elegido.

Ha encontrado un poco de un agujero en el procesamiento del complemento de ensamblaje. Puede resolver esto especificando varios FileSets en el ensamblado con <outputDirectory>/<outputDirectory>, uno para cada directorio que desee incluir, esto es obviamente un PITA, y probablemente no una solución aceptable.

Un enfoque alternativo es utilizar la tarea de copia de Ant para copiar todas las DLL en un directorio provisional, y luego incluir ese directorio en el ensamblado.

La siguiente configuración debería hacer lo que está buscando:

La configuración 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> 

El ensamblaje:

<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

Exactamente lo que necesitaba! Gracias Rich! – Bostone

+0

de nada –

+0

Sin embargo, todavía hay un problema. El zip aún mantiene un directorio superior de tipo "artifactId-Version". Cuando extraigo zip todos mis archivos terminan no en '/' sino en '/ Foo-1.0-SNAPSHOT /'. Sin embargo, los archivos se copian correctamente en target/dll-staging – Bostone

Cuestiones relacionadas