2012-01-04 14 views
23

Tôi có một dự án maven duy nhất có nhiều lớp chính. Tôi muốn tạo ra các Chum runnable (bao gồm các phụ thuộc) trong dự án này. Tôi hiện đang có cấu hình xây dựng sau (sử dụng maven.assembly):Tạo nhiều Chum có thể chạy được (với các trường hợp được bao gồm) từ một dự án Maven duy nhất

<build> 
<plugins> 
    <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <configuration> 
      <archive> 
       <manifest> 
        <mainClass>classpath.to.my.mainClass</mainClass> 
       </manifest> 
      </archive> 
      <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
      </descriptorRefs> 
     </configuration> 
    </plugin> 
</plugins> 
</build> 

Là cách để đạt được điều này với lắp ráp maven? Nếu không, cách đơn giản nhất để đạt được mục tiêu của tôi là gì?

+0

Bạn đã cố gắng tạo một số mục '' cho 'maven-assembly-plugin' với các cấu hình khác nhau? Điều này sẽ kích hoạt plugin này hai lần và tạo hai tệp JAR hy vọng ... –

+0

@dma_k Theo gợi ý của bạn, cố gắng tạo ba JAR, hai chữ cái đầu tiên bị ghi đè bởi cấu hình '' cuối cùng. – anon

+0

Cố gắng chơi với tùy chọn cấu hình '' (kiểm tra [tại đây] (http://maven.apache.org/plugins/maven-assembly-plugin/howto.html)). –

Trả lời

18

Tôi không thể giải quyết vấn đề này với maven-assembly-plugin một cách thỏa mãn, vì vậy tôi đã tìm giải pháp khác. Tôi đã sử dụng onejar-maven-plugin:

<build> 
    <plugins> 
    <plugin> 
    <groupId>org.dstovall</groupId> 
    <artifactId>onejar-maven-plugin</artifactId> 
    <version>1.4.4</version> 
    <executions> 
     <execution> 
     <id>build-first</id> 
      <configuration> 
      <mainClass>classpath.to.first.Main</mainClass> 
      <attachToBuild>true</attachToBuild> 
      <classifier>onejar</classifier> 
      <filename>first-runnable.jar</filename> 
      </configuration> 
      <goals> 
      <goal>one-jar</goal> 
      </goals> 
     </execution> 
     <execution> 
     <id>build-second</id> 
      <configuration> 
      <mainClass>classpath.to.second.Main</mainClass> 
      <attachToBuild>true</attachToBuild> 
      <classifier>onejar</classifier> 
      <filename>second-runnable.jar</filename> 
      </configuration> 
      <goals> 
      <goal>one-jar</goal> 
      </goals> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 

<pluginRepositories> 
    <pluginRepository> 
    <id>onejar-maven-plugin.googlecode.com</id> 
    <url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url> 
    </pluginRepository> 
</pluginRepositories> 
+1

không nên hai 'id' trong hai 'thực hiện' là khác nhau? Maven của tôi phàn nàn nếu tôi có cùng một id nhiều hơn một lần. –

+0

@AndreHolzner: Vâng, đây là lỗi –

+1

IMHO, điều tương tự cũng có thể thực hiện với plugin maven-assembly. Hãy xem @ donal-fellows answer – Gabriel

19

Bạn có thể làm điều đó. Bạn sẽ cần thực thi riêng biệt cho mỗi tạo phẩm mà bạn đang xây dựng (ví dụ, cung cấp cho mỗi id riêng của nó nhưng bạn có thể rời khỏi giai đoạn như mặc định), và bạn sẽ cần phải chỉ định finalName và archive/manifest/mainClass cho mỗi.

<build> 
<plugins> 
    <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <executions> 
      <execution> 
      <id>build-a</id> 
      <configuration> 
       <archive> 
       <manifest> 
        <mainClass>foobar.Aclass</mainClass> 
       </manifest> 
       </archive> 
       <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
       <finalName>foobar_a.jar</finalName> 
      </configuration> 
      </execution> 
      <execution> 
      <id>build-b</id> 
      <configuration> 
       <archive> 
       <manifest> 
        <mainClass>foobar.Bclass</mainClass> 
       </manifest> 
       </archive> 
       <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
       <finalName>foobar_b.jar</finalName> 
      </configuration> 
      </execution> 
     </executions> 
    </plugin> 
</plugins> 
</build> 
+2

Nó có lẽ cũng nên tuyên bố rõ ràng rằng mục tiêu 'duy nhất' sẽ được sử dụng. –

+3

khi thử giải pháp này và giải pháp [được đăng tại đây] (http://stackoverflow.com/a/15799254/288875), có vẻ như cũng cần phải thêm các thẻ '' và ''? –

+0

Tôi đã chỉnh sửa bài đăng (chờ đánh giá ngang hàng) để bao gồm các mục tiêu và thẻ giai đoạn. – Gabriel

1

Để xác định một chút câu trả lời trước nhiều đó là rất hữu ích cho tôi, bạn cần phải thêm giai đoạn gói và lắp ráp mục tiêu và chạy mvn chạy gói sạch, pom được như sau:

<plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>build-a</id> 
        <configuration> 
         <archive> 
          <manifest> 
           <mainClass>firstMainClass</mainClass> 
          </manifest> 
         </archive> 
         <descriptorRefs> 
          <descriptorRef>jar-with-dependencies</descriptorRef> 
         </descriptorRefs> 
         <finalName>a.jar</finalName> 
        </configuration> 
        <phase>package</phase> 
        <goals> 
         <goal>assembly</goal> 
        </goals> 
       </execution> 
       <execution> 
        <id>build-b</id> 
        <configuration> 
         <archive> 
          <manifest> 
           <mainClass>SecondMainClass</mainClass> 
          </manifest> 
         </archive> 
         <descriptorRefs> 
          <descriptorRef>jar-with-dependencies</descriptorRef> 
         </descriptorRefs> 
         <finalName>b.jar</finalName> 
        </configuration> 
        <phase>package</phase> 
        <goals> 
         <goal>assembly</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
+2

Mục tiêu 'assembly' không được chấp nhận. Xem [thông tin về plugin] (https://maven.apache.org/plugins/maven-assembly-plugin/plugin-info.html). Thay vào đó hãy sử dụng 'đơn' thay thế tốt hơn. – Gabriel

6

The top answer làm việc nếu bạn không sử dụng bất kỳ cấu hình (hoặc bất kỳ tài nguyên, cho rằng vấn đề) đó được đóng gói thành tập tin của bạn jar (ví dụ, cấu hình cho Spring Framework tự động ràng buộc).

May mắn thay, giải pháp này cũng hoạt động với maven-shade-plugin và bạn không có vấn đề nói trên với onejar-maven-plugin.

Ngoài ra, maven-shade-plugin đang được duy trì tích cực như trái ngược với onejar-maven-plugin trong luyện ngục là googlecode.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>2.4.1</version> 
    <executions> 
    <execution> 
     <id>build-first</id> 
     <phase>package</phase> 
     <goals> 
     <goal>shade</goal> 
     </goals> 
     <configuration> 
     <transformers> 
      <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">       
      <mainClass>classpath.to.first.Main</mainClass> 
      </transformer> 
     </transformers> 
     <finalName>first-runnable</finalName> 
     </configuration>   
    </execution> 
    <execution> 
     <id>build-second</id> 
     <phase>package</phase> 
     <goals> 
     <goal>shade</goal> 
     </goals> 
     <configuration> 
     <transformers> 
      <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">       
      <mainClass>classpath.to.second.Main</mainClass> 
      </transformer> 
     </transformers> 
     <finalName>second-runnable</finalName> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 
Các vấn đề liên quan