2011-09-13 46 views
5

Tôi có một gói OSGi được xây dựng bằng Maven bởi một nhóm khác. Tệp POM tuyên bố bao bì của nó là "gói" và sử dụng plugin Apache Felix.Cách triển khai gói OSGi cho repo Maven với triển khai: deploy-file?

Tôi cần triển khai vật phẩm này vào kho lưu trữ Maven cục bộ (Nexus) để nó có thể được sử dụng bởi các dự án nội bộ của chúng tôi.

Tôi đã sử dụng mục tiêu deploy:deploy-file để triển khai gói cho kho lưu trữ, giống như bạn làm với tệp JAR chuẩn và thao tác này không có lỗi. Tôi trích POM nhúng từ bó và thông qua đó trên dòng lệnh, vì vậy dòng lệnh là:

mvn deploy:deploy-file -Dfile=3rdpartybundle.jar -DpomFile=pom.xml -DrepositoryId=internal -Durl=http://internalserver/nexus 

Vấn đề là khi tôi triển khai nó như thế này, bao bì được thiết lập để bó và kết quả là tên của tạo phẩm trong kho lưu trữ kết thúc bằng một phần mở rộng .bundle, thay vì phần mở rộng .jar.

Bây giờ, chúng tôi không thể tìm ra cách khai báo dưới dạng phụ thuộc. Nếu chúng tôi tuyên bố như sau:

 <dependency> 
      <groupId>...</groupId> 
      <artifactId>...</artifactId> 
      <version>...</version> 
      <type>bundle</type> 
     </dependency> 

Chúng tôi gặp lỗi khi nói rằng không thể giải quyết sự phụ thuộc. Điều thú vị là tọa độ GAV trong thông báo lỗi thực sự có "jar" làm giá trị cho loại phụ thuộc mặc dù chúng ta đặt nó là "bundle".

Nếu chúng ta thay đổi phụ thuộc vào:

 <dependency> 
      <groupId>...</groupId> 
      <artifactId>...</artifactId> 
      <version>...</version> 
      <type>jar</type> 
     </dependency> 

Chúng tôi nhận được cùng một lỗi phụ thuộc chưa được giải quyết chính xác. Vì vậy, làm thế nào bạn có nghĩa vụ phải triển khai một artifact đóng gói như là một gói để một kho lưu trữ Maven, do đó nó có thể được sử dụng như là một phụ thuộc thời gian biên dịch cho một dự án khác? Không.

Cảm ơn

+0

Tôi nhận thấy việc sử dụng cụm từ "kho lưu trữ cục bộ" của tôi có thể gây nhầm lẫn. Tôi đang cố triển khai kho lưu trữ Nexus trên máy chủ từ xa. Máy chủ được chia sẻ bởi tất cả mọi người trong nhóm của chúng tôi. Khi tôi nói "địa phương", tôi đoán những gì tôi có nghĩa là "bên trong tường lửa của chúng tôi trên mạng LAN của chúng tôi". –

Trả lời

0

Cảm ơn câu trả lời, tôi nghĩ rằng tôi có một giải pháp (tôi sẽ không gọi nó là một giải pháp Tuy nhiên).

@earcar đang đi đúng hướng, mặc dù giải pháp đó không tận dụng tất cả thông tin có sẵn trong tệp pom.xml có sẵn trong nhóm bên thứ ba (đặc biệt là phụ thuộc). Vì vậy, những gì dường như làm việc, mặc dù tài liệu cho triển khai: triển khai tập tin là một chút mơ hồ, là bạn có thể vượt qua một tập tin pom.xml cũng đặt tham số đóng gói cùng một lúc. Vì vậy, dòng lệnh của tôi bây giờ trông giống như sau:

mvn deploy:deploy-file -Dfile=3rdpartybundle.jar -DpomFile=pom.xml -DrepositoryId=internal -Durl=http://internalserver/nexus -Dpackaging=jar 

Làm theo cách này, tệp pom.xml trong kho vẫn cho biết bao bì thuộc loại "bó" và bao gồm tất cả các phụ thuộc, v.v ... bản thân tạo tác có phần mở rộng tệp .jar.

Sau đó, khi chúng ta khai báo sự phụ thuộc của chúng tôi as type JAR, Maven là có thể giải quyết nó thành công:

<dependency> 
     <groupId>...</groupId> 
     <artifactId>...</artifactId> 
     <version>...</version> 
     <type>jar</type> 
    </dependency> 

này về cơ bản giải quyết vấn đề của chúng tôi. Tôi không chắc chắn như thế nào di động hoặc đáng tin cậy này là mặc dù. FWIW, chúng tôi đang chạy Maven 3.0.3

Cảm ơn sự giúp đỡ.

0

Bạn có thể muốn thử loại bỏ các loại hoàn toàn, và sau đó thực hiện một đơn giản

mvn install 

Trong thư mục chứa tập tin pom.xml của bạn.

+0

Nhưng điều này sẽ chỉ cài đặt các tạo tác vào repo maven địa phương ... –

+0

Ahh vâng, tôi hiểu. Tôi nghĩ rằng bạn đang đề cập đến repo địa phương, nhưng trên một giây đọc rõ ràng của nó mà bạn có nghĩa là nexus. Trong môi trường nexus của chúng tôi, chúng tôi sử dụng các kịch bản lệnh bash shell để triển khai chúng. vì vậy, tôi chỉ quan tâm như bạn khi thấy giải pháp là gì! –

+0

Đúng, chúng tôi chắc chắn cần triển khai đến một kho lưu trữ từ xa chạy Nexus được toàn bộ nhóm chia sẻ. –

0

Lúc đầu, bạn đã cố gọi đơn giản là mvn deploy trong thư mục gói của mình. Tôi hy vọng rằng gói được, xây dựng, thử nghiệm và triển khai nếu distributionManagement được định cấu hình để triển khai cho mối quan hệ của bạn.
Nếu điều này không thành công, bạn có thể nhập thủ công gói bằng giao diện web nexus vào kho lưu trữ được lưu trữ.

+0

Tôi nghĩ bạn đã bỏ lỡ điểm. Nó không phải là nhận được nó được cài đặt đó là vấn đề, nó là loại "bó" được sử dụng bởi các plugin bó. – Robin

+0

Nhưng trong câu hỏi của ông, ông nói "3rdpartybundle.jar" mà nhìn với tôi rằng tạo tác của dự án, đóng gói như "bó", là một tập tin jar. Và theo như tôi có thể thấy trên trang web plugin Apache Felix Bundle, nó tạo ra một tệp jar như là tạo phẩm. Vì vậy, nếu tạo tác được triển khai dưới dạng ".bundle", tôi sẽ kiểm tra xem có plugin nào được định cấu hình có thể đổi tên thành phần tạo tác trước khi triển khai hay không. –

+0

Gói là từ một nhóm tại một công ty khác. Chúng tôi không có nguồn vv Chúng tôi đang cố gắng triển khai một gói đã được xây dựng. –

3

Vấn đề là "3rdpartybundle.jar" đang được xây dựng mà không cần thiết lập phần mở rộng = true và/hoặc hỗ trợ các loại:

<plugin> 
    <groupId>org.apache.felix</groupId> 
    <artifactId>maven-bundle-plugin</artifactId> 
... 
    <extensions>true</extensions> 
... 
    <configuration> 
     <supportedProjectTypes> 
      <supportedProjectType>jar</supportedProjectType> 
      <supportedProjectType>war</supportedProjectType> 
     </supportedProjectTypes> 

Nếu bạn không thể sửa chữa thượng nguồn, sau đó có một vài lựa chọn;

1) Đóng gói lại nó như là một Jar sử dụng một pom dự án mới:

    <plugin> 
          <groupId>org.apache.maven.plugins</groupId> 
          <artifactId>maven-dependency-plugin</artifactId> 
          <version>2.3</version> 
          <configuration> 
            <actTransitively>false</actTransitively> 
            <outputDirectory>target/classes</outputDirectory> 
            <artifactItems> 
              <artifactItem> 
                <groupId>3rd</groupId> 
                <artifactId>party</artifactId> 
                <version>X.Y.Z</version> 
              </artifactItem> 
            </artifactItems> 
          </configuration> 
          <executions> 
            <execution> 
              <goals> 
                <goal>unpack</goal> 
              </goals> 
              <phase>compile</phase> 
            </execution> 
          </executions> 
        </plugin> 

2) Hãy thử sử dụng mvn deploy:deploy-file với -DgeneratePom=false -Dpackaging=jar -Dfile=/path/to/3rdpartybundle.jar nhưng mà không chỉ định -DpomFile= - hy vọng không có META-INF/maven/pom.xml bên trong 3rdpartybundle.jar - nó sẽ làm việc bằng cách sử dụng này nhưng bạn sẽ cần phải xác định các tham số groupId/artifactId/phiên bản vì chúng sẽ không được bắt nguồn từ pom của dự án.

Tôi biết tôi đã tạo các gói phần mềm trong quá khứ và triển khai các gói này vào nexus (v1.9.0.1) và các gói trong gói Spring cũng được nhập, nhưng không nhớ bất kỳ vấn đề nào. (Ngẫu nhiên bạn không cần phải xác định các gói trong khai báo phụ thuộc, AFAIK nếu nó là tạo tác duy nhất nó nên được suy ra)

+0

Tôi đã gặp phải sự cố tương tự khi cố gắng triển khai các tệp được đóng gói với gói "gói". "-DgeneratePom = false -Dpackaging = jar" là ma thuật tôi cần. Cảm ơn. – Jared

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