2012-05-09 25 views
10

Đây là kịch bản:Maven SNAPSHOT tên tệp jar không nhất quán bằng cách sử dụng Maven Assembly trong tệp MANIFEST

Hai dự án Maven 3 được xây dựng.

Bản dựng 1 có các hốc chụp nhanh được triển khai cho Nexus.

Bản dựng 2 có phụ thuộc vào ảnh chụp nhanh, được tham chiếu như 1.0.0-SNAPSHOT, được đóng gói và nén lên bằng lệnh mvn clean package assembly:single.

Vấn đề mà chúng tôi chạy vào: thoảng khi lắp ráp đã được tạo ra, các tập tin MANIFEST cho jar sẽ đôi khi nói some.jar.1.0.0-SNAPSHOT và đôi khi nó sẽ nói some.jar. Dấu ngày giờ là, do đó gây ra lỗi không xác định lớp.

Có cách nào để ngăn sự cố đặt tên này trong tệp kê khai không?

--edit--

Tiếp tục nghiên cứu đã khám phá ra những điều sau đây:

"Nếu ảnh chụp đã được giải quyết từ một repo sau đó nó sẽ được timestamped, nếu nó đến từ các lò phản ứng hoặc địa phương repo, sau đó nó sẽ được -SNAPSHOT. Plugin gọi vào logic phân giải maven vì vậy đây là cốt lõi maven hành vi. "

Đây là i chính xác vấn đề đang được chạy vào. Tệp kê khai xây dựng thứ 2 luôn có mục nhập là ./lib/Framework-1.0.0-SNAPSHOT.jar trong đó tên tệp jar thực tế thay đổi giữa ./lib/Framework-1.0.0-SNAPSHOT.jar./lib/Framework-1.0.0-timestamp.jar dựa trên báo giá ở trên.

+0

[Điều này] (http://stackoverflow.com/questions/2516860/maven-how-to-create-assembly-with-snapshot-artifacts-without-timestamps-file-na) có thể hữu ích, nó mô tả cài đặt outputfilenamemapping để làm cho tên tệp nhất quán trong ảnh chụp nhanh. – prunge

+1

Bản kê khai của SNAPSHOT được tạo ra như thế nào và nó được cấu hình như thế nào để tạo ra thông tin này? Hơn nữa tại sao mvn clean package assembly: duy nhất được gọi và không đơn giản là gói mvn clean package gây ra gói sẽ gọi cấu hình assembly-plugin. – khmarbaise

+0

Không có tệp kê khai nào cho chính SNAPSHOT. Tệp kê khai có vấn đề ở trong bản dựng thứ 2. Và với sự giúp đỡ của một đồng nghiệp, chúng tôi đã tìm thấy điều này 'Nếu ảnh chụp được giải quyết từ repo thì nó sẽ được định thời gian, nếu nó đến từ lò phản ứng hoặc repo cục bộ, thì nó sẽ là -SNAPSHOT. Các plugin gọi vào logic phân giải maven vì vậy đây là hành vi maven lõi. ' Đây là vấn đề chính xác mà tôi đang gặp phải, tôi chỉ cần giải quyết vấn đề này. Về lý do tại sao gói lắp ráp: duy nhất đang được gọi, cũng là bởi vì chúng ta mới đến maven nói chung. – Thaldin

Trả lời

6

Trong <dependencySet> bạn cần phải thiết lập <outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}</outputFileNameMapping>

ví dụ:

<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"> 
    <id>appserverB</id> 
    <formats> 
    <format>zip</format> 
    </formats> 
    <dependencySets> 
    <dependencySet> 
     <outputDirectory>/lib</outputDirectory> 
     <outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}</outputFileNameMapping> 
     <includes> 
     <include>application:logging</include> 
     <include>application:core</include> 
     <include>application:utils</include> 
     <include>application:appserverB</include> 
     </includes> 
    </dependencySet> 
    </dependencySets> 
</assembly> 

Nếu bạn đang sử dụng một trong những built-in mô tả lắp ráp bạn sẽ cần phải sao chép nó để tự của bạn và thêm trong mục nhập số outputFileNameMapping mình

0

sử dụng <useBaseVersion>false</useBaseVersion>, khi bạn cần sao chép phụ thuộc. Ví dụ:

   <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-dependency-plugin</artifactId> 
        <version>2.8</version> 
        <executions> 
         <execution> 
          <id>copy</id> 
          <phase>package</phase> 
          <goals> 
           <goal>copy-dependencies</goal> 
          </goals> 
          <configuration> 
           <outputDirectory>${project.build.directory}</outputDirectory> 
           <useBaseVersion>false</useBaseVersion> 
          </configuration> 
         </execution> 
        </executions> 
       </plugin> 
0

Đối với những người chạy vào trong này và xem câu trả lời từ Stephen Connolly nhưng vẫn kết thúc có trường hợp ngoại lệ, điều này có thể là do thực tế rằng một số phụ thuộc có phân loại trong tên của họ. Sau đó, bạn sẽ phải điều chỉnh mẫu để sử dụng dashClassifier làm giá trị tùy chọn:

<outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping> 

Điều này sẽ hoạt động ngay cả khi người phụ thuộc sử dụng không có bộ phân loại.

Xem documentation for the assembly plugin để biết thêm chi tiết.

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