2012-05-04 15 views
9

tôi có một dự án dự kiến ​​sẽ cung cấp một file jar:Làm thế nào để đăng ký một tệp jar được xây dựng tùy chỉnh làm tạo tác chính maven?

<packaging>jar</packaging> 

nhưng jar được xây dựng một cách tùy chỉnh, vì vậy bao bì mặc định thực hiện với jar: jar đã bị vô hiệu

<plugin> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.3.2</version> 
    <executions> 
    <execution> 
     <id>default-jar</id> 
     <phase>none</phase> 
    </execution> 
    </executions> 
</plugin> 

nhưng sau đó khi tôi muốn áp dụng bóng râm: bóng râm trên lọ hiện tại, tôi gặp lỗi

Tạo phẩm chính của dự án không tồn tại.

Tôi giả định rằng maven không biết về tệp .jar được tạo bởi công cụ tùy chỉnh của tôi. Làm thế nào để cho nó biết, bởi vì antrun attachArtifact không hoạt động

<attachartifact file="./bin/classes.jar" classifier="" type="jar"/> 

lỗi tôi nhận được là

Một Ant BuildException đã xảy ra: org.apache.maven.artifact.InvalidArtifactRTException: Đối với vật {: jar}: Một tạo tác được đính kèm phải có một ID khác với tạo phẩm chính tương ứng của nó.

Vì vậy, đây không phải là phương pháp để đăng ký tạo tác chính ... Có bất kỳ (không cần viết plugin java tùy chỉnh) không?

Cảm ơn, Lukasz

Trả lời

1

Tôi đã kiểm tra nguồn JarMojo và nó đã cho tôi một ý tưởng làm thế nào để giải quyết nó với Groovy (thông qua gmaven)

<plugin> 
    <groupId>org.codehaus.gmaven</groupId> 
    <artifactId>gmaven-plugin</artifactId> 
    <version>1.3</version> 
    <executions> 
    <execution> 
     <id>set-main-artifact</id> 
     <phase>package</phase> 
     <goals> 
     <goal>execute</goal> 
     </goals> 
     <configuration> 
     <source> 
      project.artifact.setFile(new File("./bin/classes.jar")) 
     </source> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

và nó hoạt động! :)

0

Chúng tôi đã gặp vấn đề tương tự, với việc các "vật kèm theo phải có một ID khác với vật chính tương ứng của nó" lỗi. Chúng tôi tìm thấy giải pháp trong bài đăng blog tuyệt vời sau đây:

http://devblog.virtage.com/2013/04/embed-and-run-ant-tasks-and-scripts-from-maven/

Như chi tiết in this section, bạn có thể khắc phục vấn đề bằng cách thêm một phân loại để Maven có thể phân biệt giữa jar kiến ​​xây dựng và jar maven-xây dựng. Vì bạn đang sử dụng antrun attachartifact, bạn cần dùng cái này:

<attachartifact file="./bin/classes.jar" classifier="foo" type="jar"/> 

Lưu ý bạn cũng sẽ cần phải bao gồm phân loại đó (cùng với groupId, artifactId và phiên bản) bất cứ khi nào bạn muốn lấy lọ này như một sự phụ thuộc trong các dự án khác.

1

Something như thế này

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>build-helper-maven-plugin</artifactId> 
    <version>1.8</version> 
    <executions> 
     <execution> 
      <id>attach-artifacts</id> 
      <phase>package</phase> 
      <goals> 
       <goal>attach-artifact</goal> 
      </goals> 
      <configuration> 
       <artifacts> 
        <artifact> 
         <file>${basedir}/bin/classes.jar</file> 
         <type>jar</type> 
        </artifact> 
       </artifacts> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 
0

Trong khi giải pháp của bạn có thể làm việc cho một xây dựng để quá trình cài đặt + pha hoặc nơi không có phụ thuộc trong lò phản ứng, trong trường hợp chỉ xây dựng đến biên dịch hoặc kiểm tra giai đoạn các lớp đóng gói sẽ không được tìm thấy bởi các phụ thuộc. Xây dựng để biên dịch diễn ra khi sử dụng các plugin như plugin maven-release.

Mở rộng giải pháp lựa chọn của bạn để bao gồm việc xác định các lớp giải nén trong biên dịch

<plugin> 
    <groupId>org.codehaus.gmaven</groupId> 
    <artifactId>gmaven-plugin</artifactId> 
    <version>1.3</version> 
    <executions> 
    <execution> 
     <id>set-main-artifact-compile</id> 
     <phase>compile</phase> 
     <goals> 
     <goal>execute</goal> 
     </goals> 
     <configuration> 
     <source> 
      project.artifact.setFile(new File("./bin/classes")) 
     </source> 
     </configuration> 
    </execution> 
    <execution> 
     <id>set-main-artifact</id> 
     <phase>package</phase> 
     <goals> 
     <goal>execute</goal> 
     </goals> 
     <configuration> 
     <source> 
      project.artifact.setFile(new File("./bin/classes.jar")) 
     </source> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

Theo mặc định, maven-cài đặt-plugin sẽ sử dụng thần vật được xác định dọc theo dòng của ${project.build.directory}/${project.finalname}.jar

Vì vậy, tùy chọn khác có hãy thực hiện một cái gì đó như thế này

<build> 
    <directory>bin</directory> 
    <outputDirectory>bin/classes</outputDirectory> 
    <finalName>classes</finalName> 
</build>