2009-09-30 32 views
20

Để chuyên gia Maven ra khỏi đó: Tôi đang cố gắng đóng gói các tạo phẩm dự án không phải java (.NET) vào một tệp zip duy nhất. Tôi đang gặp 2 vấn đề:Maven tạo lắp ráp zip phẳng

Nếu tôi thay đổi bao bì trong POM tôi để zip <packaging>zip</packaging>, tôi nhận được thông báo lỗi này: [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, không có vấn đề lớn - Tôi đã thay đổi nó để <packaging>pom</packaging> để thoát khỏi jar vô dụng đó là nếu không tạo trong mục tiêu thư mục

Vấn đề chính của tôi là các tệp tôi đóng gói vào ZIP được lồng trong vài thư mục nhưng tôi cần đặt chúng vào thư mục trên cùng của ZIP. Đây là tệp lắp ráp của tôi:

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

Khi tôi chạy tệp này - tôi sẽ nhận tệp ZIP nhưng tệp sẽ được lồng nhau bắt đầu bằng C: \ theo sau là đường dẫn đầy đủ. Để cung cấp cho bạn ý tưởng - dự án bãi đó là mã nhị phân vào cấu trúc sau ProjectFoo\ProjectFoo\subproject1\Bin\Release\foo.dll và tôi cần cấu hình ZIP\foo.dll

Dưới đây là lắp ráp cắm:

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

Có lẽ tôi chỉ cần sử dụng antrun và thực hiện zip ant bài tập?

Trả lời

27

Như bạn đã thấy, không có loại bao bì zip, vì vậy bạn nên sử dụng bao bì pom như bạn đã chọn.

Bạn đã gặp phải một chút lỗ hổng trong quá trình xử lý plugin của assembly. Bạn có thể giải quyết điều này bằng cách chỉ định nhiều tập tinSets trong assembly với <outputDirectory>/<outputDirectory>, một cho mỗi thư mục mà bạn muốn bao gồm, đây rõ ràng là một PITA, và có lẽ không phải là một giải pháp chấp nhận được.

Một cách tiếp cận khác là sử dụng tác vụ sao chép Ant để sao chép tất cả các tệp DLL vào thư mục dàn dựng, sau đó bao gồm thư mục đó trong assembly.

Các cấu hình sau đây nên làm những gì bạn đang sau:

Cấu hình 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> 

Việc lắp ráp:

<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

Chính xác những gì tôi cần! Cảm ơn bạn giàu! – Bostone

+0

bạn được chào đón –

+0

Vẫn còn một vấn đề. Zip vẫn duy trì một thư mục hàng đầu thuộc loại "artifactId-Version". Khi tôi giải nén, tất cả các tệp của tôi sẽ không có trong '/' nhưng trong '/ Foo-1.0-SNAPSHOT /'. Tuy nhiên, các tập tin được sao chép chính xác vào mục tiêu/dll-staging – Bostone

Các vấn đề liên quan