2012-12-13 36 views
14

tôi có thể triển khai một jar bằng cách sử dụng sau đây trong tôi pom.xml và chạy mvn deploy:Maven triển khai jar với phụ thuộc để repo

<distributionManagement> 
    <repository> 
     <id>releases</id> 
     <url>http://${host}:8081/nexus/content/repositories/releases</url> 
    </repository> 
    <snapshotRepository> 
     <id>snapshots</id> 
     <name>Internal Snapshots</name> 
     <url>http://${host}:8081/nexus/content/repositories/snapshots</url> 
    </snapshotRepository> 
</distributionManagement> 

Và tôi có thể xây dựng một thực thi jar-with-dependencies sử dụng như sau:

 <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>create-executable-jar</id> 
        <phase>deploy</phase> 
        <goals> 
         <goal>single</goal> 
        </goals> 
        <configuration> 
         <descriptorRefs> 
          <descriptorRef>jar-with-dependencies</descriptorRef> 
         </descriptorRefs> 
         <archive> 
          <manifest> 
           <mainClass>my.company.app.Main</mainClass> 
          </manifest> 
         </archive> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 

Vấn đề là tôi không biết làm thế nào để ghép chúng lại với nhau để triển khai thực thi jar đến repo Maven của tôi. Tôi không thực sự biết nếu điều này được thực hiện bởi một plugin mới hoặc bằng cách thêm một mục tiêu hoặc bước khác để các plugin lắp ráp hiện có.

+1

Thú vị ... vì vậy bạn muốn một bình chứa tất cả các phụ thuộc của nó ('jar-with-dependencies') vào nexus? Tôi giả định khi bạn triển khai nó vào môi trường sản xuất, bình này sẽ độc lập (vì nó có tất cả các phụ thuộc của nó được nhúng bên trong)? –

Trả lời

0

Về cơ bản, khó khăn của tôi khi thực hiện điều này đã tiết lộ rằng thực tế là pom.xml của tôi đã thoát khỏi đường ray rồi. Tất cả mọi thứ sẽ có thể chộp vào vị trí của riêng mình. Tôi trước đây thực hiện:

  • Lưu tất cả các phụ thuộc vào một thư mục lib
  • Xây dựng một jar với một classpath slurping lên thư mục đó lib
  • Sử dụng lắp ráp các plugin để thực hiện một jar triển khai

Tôi nghĩ có một số lý do khiến ý nghĩa này xảy ra trên đường đi, nhất là khi các thư viện của tôi không được thừa nhận từ các ứng dụng của tôi.

Tuy nhiên, việc xóa 1 và 2 tất cả những gì cần là phần distributionManagement và giai đoạn triển khai hoạt động tự động. Vì vậy, tất cả trong tất cả điều này là một trường hợp tuyệt vời của nghĩa đen thêm chức năng bằng cách xóa swathes lớn của mã.

+3

Tôi có cùng triệu chứng của * jar-with -dependencies.jar không được đẩy với triển khai. Vấn đề của tôi là cấu hình không chính xác của plugin - tôi phải liên kết với gói phần mềm như được mô tả trong tài liệu (http://maven.apache.org/plugins/maven-assembly-plugin/usage.html) – ahains

+0

@ahains cảm ơn ! thats một giải pháp tốt hơn. hãy làm cho một câu trả lời trong số này để tôi thực sự có thể upvote bạn :) – Karussell

3

Làm việc sau. Tôi sẽ để câu hỏi này mở một chút bởi vì tôi không tích cực, đây là cách thực hành tốt nhất, nhưng làm việc là điều gì đó.

Vấn đề tôi nhận thấy là tôi đã tạo tên ID và tôi không biết đây có phải là thực tế thông thường hay không và tôi phải mã hóa cứng tên bình; nó không được suy ra từ bất cứ thứ gì khác.

<plugin> 
<artifactId>maven-deploy-plugin</artifactId> 
<version>2.7</version> 
<executions> 
    <execution> 
     <id>deploy-executable</id> 
     <goals> 
      <goal>deploy-file</goal> 
     </goals> 
     <configuration> 
      <file>target/Monitoring-Client-1.0-SNAPSHOT-jar-with-dependencies.jar</file> 
     </configuration> 
    </execution> 
</executions> 
</plugin> 
+0

Có vẻ tốt, nhưng không may không hoạt động đối với tôi: Không thể thực hiện mục tiêu org.apache.maven.plugins: maven-deploy-plugin: 2.8.2: triển khai tệp (default-cli) trên dự án BackofficeSmokeTest: Tệp tham số ' ',' url 'cho mục tiêu org.apache.maven.plugins: maven-deploy-plugin: 2.8.2: tệp triển khai bị thiếu hoặc không hợp lệ -> [Help 1] –

4

Để xây dựng một (cái gọi là) Uber JAR và triển khai nó sử dụng maven, bạn cũng có thể sử dụng shade plugin. Đoạn mã sau được lấy từ trang web của họ nhưng tôi đã thực hiện một hoặc hai dự án bằng cách sử dụng tính năng này.

<project> 
    ... 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-shade-plugin</artifactId> 
     <version>2.0</version> 
     <executions> 
      <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>shade</goal> 
      </goals> 
      <configuration> 
       <shadedArtifactAttached>true</shadedArtifactAttached> 
       <shadedClassifierName>jackofall</shadedClassifierName> <!-- Any name that makes sense --> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
    ... 
</project> 

Trong cấu hình này, bạn có được JAR asber như một triển khai ngoài JAR bình thường. Người dùng JAR của bạn sau đó có thể quyết định kéo gói tất cả-trong-một hoặc JAR với các phụ thuộc dựa trên trình phân loại.

Tôi thường sử dụng plugin bóng râm để xây dựng các JAR (ber (hoặc sửa đổi JAR theo cách) và sử dụng plugin lắp ráp để xây dựng những thứ như gói cài đặt (chứa JAR và các thứ khác). Tôi không chắc chắn những gì các mục tiêu dự định của các plugin duy nhất là tuy nhiên.

0

Trước tiên, bạn không nên thực hiện việc tạo bình ueber trong giai đoạn triển khai tốt hơn là thực hiện điều này trong giai đoạn gói. Hơn nữa, tệp jar được tạo thường được gắn tự động vào tạo tác của bạn và sẽ được chuyển đến kho lưu trữ từ xa (trong trường hợp của bạn là Nexus). Bạn có thể kiểm tra điều này nếu bạn chỉ đơn giản là cố gắng để làm một cài đặt mvn và hãy xem đầu ra nếu jar được tạo ra được cài đặt vào kho lưu trữ cục bộ. Để triển khai kết quả vào nexus, bạn cần phải gọi triển khai mvn.

3

Nếu bạn ràng buộc lắp ráp sang giai đoạn đóng gói, nó sẽ cài đặt trong kho lưu trữ của bạn cả "thường xuyên" jar và với-phụ thuộc jar khi bạn làm một xây dựng:

<plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <configuration> 
      <archive> 
       <manifest> 
        <mainClass>my.company.app.Main</mainClass> 
       </manifest> 
      </archive> 
      <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
      </descriptorRefs> 
     </configuration> 
     <executions> 
      <execution> 
       <id>make-assembly</id> <!-- this is used for inheritance merges --> 
       <phase>package</phase> <!-- bind to the packaging phase --> 
       <goals> 
        <goal>single</goal> 
       </goals> 
      </execution> 
     </executions> 
    </plugin> 

Thenn chỉ cần chạy mvn clean install deploy để tải cả hai lọ lên repo của bạn

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