2011-09-22 38 views
6

Tôi có các tình huống sau:dự án với sự phụ thuộc nguồn gốc và sao chép tập tin Maven

mylib là một thư viện (mà tôi có nguồn khác nhau, vì vậy tôi muốn đặt chúng vào một mylib dự án Maven: mylib ví dụ). Thư viện này có một phụ thuộc jar mà tôi chỉ có jar, và nó không được tìm thấy trong kho lưu trữ Maven (và tôi KHÔNG muốn cài đặt nó ở đó). Để làm cho nó biên dịch, một cái gì đó như thế này sẽ làm việc: thêm tệp jar vào dự án mylib trong một thư mục "lib", ví dụ: "lib/thirdpartylib.jar" và trong tệp pom.xml của mylib, thêm một phụ thuộc với nhóm/tạo phẩm/phiên bản tự chọn và mục nhập "<scope>system</scope><systemPath>${project.basedir}/lib/thirdpartylib.jar</systemPath>". Dự án mylib sẽ biên dịch tốt.

Lưu ý rằng mylib cũng có phụ thuộc thời gian chạy vào tệp dll, nói thirdparty.dll. Nhưng để biên soạn thì điều này không quan trọng.

Tuy nhiên, bây giờ những gì tôi đang tự hỏi làm thế nào để đạt được những điều sau đây:

Bất kỳ dự án nào khác, ví dụ: dự án "X", rằng sử dụng mylib, sẽ cần

- mylib.jar 
- thirdpartylib.jar 
- thirdpartylib.dll 

,

và nó sẽ phải thiết lập các java.library.path vào thư mục (ví dụ: "") sao cho jar thứ ba và dll được tìm thấy bởi máy ảo thực thi.

Mối quan tâm của tôi là: Tôi muốn các thứ ba/dll thứ ba là trách nhiệm của dự án mylib. I E. Tôi muốn xác định kiến ​​thức, rằng bạn cần phải sao chép jar của bên thứ ba và dll vào thư mục đích và java.library.path đề cập đến chúng, là một phần của dự án mylib (mylib pom biết làm thế nào để được sử dụng trong các dự án khác). Tuy nhiên, tôi muốn kiến ​​thức này (tức là hướng dẫn sao chép, bất kể chúng được thực hiện chính xác như thế nào trong Maven) được chuyển giao cho bất kỳ dự án nào khác bằng cách sử dụng mylib, chẳng hạn như X chẳng hạn. Có phải bằng cách nào đó có thể?

[Giải pháp hack của tôi bây giờ là tôi có một bản sao thứ ba trong X, nhưng thậm chí sau đó tôi không biết cách sao chép/xử lý tệp dll, vì vậy tôi phải viết một readme nói rằng tệp dll phải được sao chép vào thư mục bin của máy ảo thực hiện).

Bất kỳ đề xuất nào được đánh giá cao!

Trả lời

2

Ý tưởng cơ bản là như sau:

  • Maven là tốt trong việc xử lý với một kết quả mỗi Maven POM.
  • Chỉ có thể có thư viện và phụ thuộc vào các thư viện này trong kho lưu trữ địa phương của bạn.

Vì vậy, bạn phải làm các bước sau:

  1. Xác định cho thư viện thêm một dự án riêng biệt (hoặc một module trong dự án của bạn) và xác định các thư viện như kết quả.
  2. Thay đổi POM của bạn để POM này hiện phụ thuộc vào dự án mới.
  3. Thực hiện các bước tương tự cho tệp DLL của bạn (xem bài đăng Managing DLL dependencies with Maven) cách thực hiện điều đó).
  4. Triển khai thư viện bổ sung và DLL của bạn vào kho lưu trữ cục bộ của bạn.

Bây giờ bạn sẽ có thể sử dụng Maven cho quá trình xây dựng một lần nữa và bằng cách sử dụng các plugin bổ sung như maven-assembly-plugin, bạn có thể đóng gói tất cả cùng nhau.

13

tôi muốn đề nghị chuyển các tập tin thành các module Maven, bằng cách cài đặt chúng vào kho lưu trữ địa phương sử dụng các Maven install plug-in

mvn install:install-file \ 
    -DgroupId=com.demo \ 
    -DartifactId=thirdpartylib \ 
    -Dversion=1.0 \ 
    -Dfile=thirdpartylib.jar 

mvn install:install-file \ 
    -DgroupId=com.demo \ 
    -DartifactId=thirdpartylib-runtime \ 
    -Dversion=1.0 \ 
    -Dpackaging=dll 
    -Dfile=thirdpartylib.dll 

Một trong những điều gọn về phương pháp này là các Maven POM sẽ được tự động tạo ra.

Các mylib dự án nay tuyên bố các module thirdparty như phụ thuộc bình thường trong đó là tập tin POM:

<dependencies> 
    <dependency> 
     <groupId>com.demo</groupId> 
     <artifactId>thirdpartylib</artifactId> 
     <version>1.0</version> 
    </dependency> 
    <dependency> 
     <groupId>com.demo</groupId> 
     <artifactId>thirdpartylib-runtime</artifactId> 
     <version>1.0</version> 
     <scope>runtime</scope> 
    </dependency> 
</dependencies> 

Bây giờ khi mylib mô-đun được tham chiếu bởi các module khác (như là một sự phụ thuộc) các module thirdparty sẽ cũng được tải xuống dưới dạng phụ thuộc transitive.

+0

Tôi gắn bó với bạn là giải pháp, cảm ơn người đàn ông. – mtrovo

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