Hiện tại chúng tôi đang thiết lập dự án sử dụng Ivy để quản lý sự phụ thuộc và Ant làm công cụ xây dựng chung (mặc dù có thể không liên quan ở đây). Ngoài ra chúng tôi có một loạt các thư viện được xây dựng với Maven và các dự án (chúng tôi có nhiều trong số đó) phụ thuộc vào. Chúng tôi biết rằng tình trạng này là rất xa lý tưởng và chúng tôi đang đánh giá các cách để cải thiện điều đó nhưng chúng tôi không thể thay đổi điều đó nhanh như chúng tôi muốn. Vì vậy, chúng tôi phải làm việc với những gì chúng tôi có vào lúc này. Nhưng dù sao, đây là vấn đề: nó làm việc với Maven 2 và Ivy nhưng gần đây chúng tôi bắt đầu chuyển sang Maven 3 vì nhiều lý do (một giải pháp xung đột tốt hơn) và loại kết hợp đó đã phá vỡ các bản dựng của chúng tôi.Apache Ivy và repo Maven địa phương - cách xử lý ảnh chụp nhanh được xây dựng với Maven 3
Trước tiên, tôi sẽ cố gắng mô tả cách các bản dựng của chúng tôi hoạt động với Maven 2 và Ivy. Sau đó tôi sẽ thêm nơi đó đã phá vỡ khi chuyển sang Maven 3.
Ivy + Maven 2
Khi phát triển các phiên bản mới của các thư viện của chúng tôi, chúng tôi đang sử dụng phiên bản SNAPSHOT, đã được cài đặt vào địa phương Maven repo (.m2). Ngoài ra, chúng tôi triển khai các ảnh chụp nhanh đó vào Artifactory của chúng tôi để có thể chia sẻ các bản dựng trung gian để cho phép phát triển song song.
Dự án của chúng tôi sau đó tuyên bố sự phụ thuộc vào các ảnh chụp nhanh đó. Ivysettings.xml tương ứng trông giống như sau:
<ivysettings>
<settings defaultResolver="default" />
<include url="${ivy.default.settings.dir}/ivysettings-local.xml" />
<resolvers>
<ibiblio name="public" root="path.to.our.artifactory" m2compatible="true" />
<filesystem name="local-maven2" m2compatible="true" checkmodified="true" changingPattern=".*SNAPSHOT">
<ivy pattern="${user.home}/.m2/repository/[organisation]/[module]/[revision]/[module]-[revision].pom" />
<artifact pattern="${user.home}/.m2/repository/[organisation]/[module]/[revision]/[artifact]-[revision](-[classifier]).[ext]" />
</filesystem>
<filesystem name="local" checkmodified="true" changingPattern=".*SNAPSHOT">
<ivy pattern="${ivy.local.default.root}/${ivy.local.default.ivy.pattern}" />
<artifact pattern="${ivy.local.default.root}/${ivy.local.default.artifact.pattern}" />
</filesystem>
<filesystem name="local2" checkmodified="true" changingPattern=".*SNAPSHOT">
<ivy pattern="${user.home}/.ivy2/cache/[organisation]/[module]/ivy-[revision].xml" />
<artifact pattern="${user.home}/.ivy2/cache/[organisation]/[module]/[artifact]-[revision].[ext]" />
</filesystem>
<chain name="default" checkmodified="true" changingPattern=".*SNAPSHOT">
<resolver ref="local" />
<resolver ref="local-maven2" />
<resolver ref="public" />
</chain>
</resolvers>
<include url="${ivy.default.settings.dir}/ivysettings-shared.xml" />
</ivysettings>
Do thiết lập này, nên tìm phiên bản mới hơn của ảnh chụp nhanh và giải quyết chính xác. Các phiên bản mới hơn được xác định bằng cách so sánh ngày tệp của tệp .pom tương ứng.
Khi chúng tôi tạo ảnh chụp nhanh với Maven 2, tệp .pom tương ứng sẽ lấy ngày tệp của bản dựng hiện tại và do đó kiểm tra hoạt động và Ivy sẽ giải quyết các phiên bản chụp nhanh chính xác.
Ivy + Maven 3
Độ phân giải mô tả ở trên phá vỡ khi xây dựng các bức ảnh chụp với Maven 3. Lý do dường như là các tập tin cài đặt .pom không nhận được dấu thời gian hiện tại như ngày tập tin của nó nhưng giữ ngày tệp của tệp pom.xml gốc được sao chép. Do đó Ivy không thể phát hiện xem ảnh chụp có mới hơn nữa hay không.
Dường như Maven 3 lưu dấu thời gian cập nhật trong maven-metadata-local.xml nhưng Ivy không đọc chúng. Chúng tôi biết rằng có trình phân giải ibiblio (mà chúng tôi đang sử dụng) nhưng vẫn ghi nhận những gì chúng ta biết (ví dụ: từ các câu hỏi như this) nó có nghĩa là làm việc với kho lưu trữ thực sự và có thể tạo ra các vấn đề khi được áp dụng cho repo .m2 cục bộ.
Chúng tôi cũng nghĩ về việc theo dõi ngày tệp của các tệp khác, ví dụ: maven-metadata-local.xml hoặc các tạo phẩm thực tế, nhưng chúng tôi không chắc liệu đó là khôn ngoan hay có thể phá vỡ bản dựng trong các tình huống khác.
Vậy chúng ta nên/chúng ta có thể giải quyết điều đó như thế nào?
TL; DR
gì là tiêu chuẩn/gợi ý cách để xử lý Ivy phụ thuộc vào bức ảnh chụp mà được xây dựng với Maven 3 và triển khai trong repo .m2 địa phương?
CẬP NHẬT 2016-07-26
Dưới đây là 2 điều tôi đã cố gắng để giải quyết vấn đề này nhưng tôi không chắc liệu sẽ có bất kỳ tác dụng phụ tôi không nghĩ đến. Tôi muốn được biết ơn nếu ai đó có thể làm sáng tỏ về điều này:
- Sử dụng hệ thống tập tin phân giải cho kho .m2 địa phương nhưng trong conjection với một bộ nhớ cache trong đó có
useOrigin="true"
(và tùy chọn một DefaultTTL thấp). Bằng cách đó, dường như chỉ có các tệp xml được lưu trữ trong bộ nhớ cache .ivy2 và các tạo phẩm được tham chiếu trong kho .m2, nghĩa là chúng không được sao chép. Điều này dường như làm việc nhưng tôi không chắc liệu nó sẽ như thế nào nếu tra cứu đầu tiên sẽ tải xuống ảnh chụp từ kho lưu trữ ảnh chụp nhanh được chia sẻ (Artifactory) và những bản cập nhật sẽ được cập nhật bởi một bản dựng cục bộ sau này. Trong trường hợp đó chúng tôi có thể sẽ kết thúc với phiên bản từ xa của artifact được lưu trữ trong .ivy2 và một phiên bản mới hơn đang được cài đặt vào .m2 với ngày .pom file là như nhau trong cả hai trường hợp. - Sử dụng trình phân giải ibiblio với
root="file://${user.home}/.m2/repository/"
có vẻ như có khả năng giải quyết hầu hết các hiện vật (ngoại trừ xem bên dưới) nhưng vẫn có vẻ thất bại khi đọc siêu dữ liệu, tức là nó không cập nhật bộ nhớ cache với phiên bản mới hơn. trong repo .m2.
Trong khi có thể giải quyết hầu hết các hiện vật trong repo .m2, tôi dường như gặp lỗi độ phân giải cho một vài "url" nhưfile://{user.home}/.m2/repository/javax/enterprise/cdi-api/1.0/cdi-api-1.0.jar
trong khi hiện vật tồn tại, tức là tôi sao chép đường dẫn trực tiếp từ Windows Explorer và nó là"${user.home}\.m2\repository\javax\enterprise\cdi-api\1.0\cdi-api-1.0.jar"
.
Tại sao sử dụng trình phân giải ibiblio làm phiền bạn? Bạn sử dụng một kho lưu trữ từ xa. – davidxxx
@davidhxxx nó không phải là loại bỏ repo hoặc giải quyết ibiblio đó là vấn đề nhưng về cơ bản chúng tôi có 3 lớp khi xây dựng các dự án của chúng tôi: 1. ivy cache 2. local m2 repo 3. remote repo - và chúng ta cần tất cả 3. – Thomas