Giải quyết vấn đề conflict version của maven dependency

Hi mọi người, mình đang gặp một số vấn đề khi import custom jar vào project java mong mọi người giúp.
Tình hình là mình muốn import một custom jar vào một project maven nhưng nó không thể chạy được. Khi chạy thì nó đòi hỏi các dependency được config trong file pom.xml của chính nó. Nhưng nếu mình thêm các dependency mà nó đòi hỏi vào file pom.xml của project thì lại bị conflict version với các dependency sẵn có trong project. Mình đang không rõ vấn đề ở đây là gì vì mình nghĩ khi build một thư viện thì nó phải độc lập rồi chứ tại sao lại phải config bằng tay.
Mong mọi người giúp hoặc cho mình xin keyword về vấn đề này ạ.

Hm, tớ có thắc mắc, tại sao cậu cần làm việc này vậy?

Điều này đúng rồi cậu :smile: Maven hoạt động theo cách này.

Tớ có hiểu đúng không, khi cậu định custom 1 thư viện, và import thư viện đã được custom?

Sẽ tốt hơn nếu cậu có một ví dụ, để giải thích vấn đề.


Thường thì cậu, hoặc là install file jar đó vào local maven folder (folder .m2), hoặc cậu deploy nó lên 1 repository nào đó, thì mới sử dụng được với maven project. Cậu cân nhắc thử xem :smile:

3 Likes

Dear Lib,

  • Custom jar là thư viện mà trc đây cty mình phát triển. Mình đang tích hợp nó vào project mới.
  • Mình làm theo hướng dẫn này https://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html để import và cũng đã kiểm tra trong folder .m2 và nó có xuất hiện trong đó
  • Cụ thể ở đây là dependency spring framework data: spring data mongo. Vấn đề là một số hàm của thư viện này bị thay đổi sau version 1.10. Trước đây file jar sử dụng version < 1.10 còn project mới tạo thì lại cần một số thư viện mà sau > version 1.10 mới có. Nếu hạ version xuống < 1.10 thì không thể sử dụng các thư viện mới còn nếu tăng version lên > 1.10 thì custom jar lại bị lỗi do một số hàm đã bị modified hoặc lược bỏ
3 Likes

Bạn cho mình xem file POM.xml của bạn thử

3 Likes
        <!-- custom jar -->
        <dependency>
            <groupId>com.goldengate.digvior</groupId>
            <artifactId>digvior-basedata</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
      <!-- dependency cần thiết cho file jar -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.16</version>
        </dependency>

<!--        <dependency>-->
<!--            <groupId>org.mongodb</groupId>-->
<!--            <artifactId>mongo-java-driver</artifactId>-->
<!--            <version>3.4.1</version>-->
<!--        </dependency>-->

 <!-- dependency cần thiết cho file jar, phần này hiện đang conflict version -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-mongodb</artifactId>
            <version>1.9.5.RELEASE</version><!-- ver cũ config trong file jar-->
<!--            <version>2.2.7.RELEASE</version>--><!-- ver mới của project hiện tại -->
        </dependency>
2 Likes

Tớ hiểu rồi. Hướng dẫn cậu làm theo là đúng rồi đó :smile:
Cậu có source code của custom jar file đó không?
Thường TH này, tớ recommend chiến lược dưới đây để cậu có thể migrate được với thư viện nội bộ kia:

  • Cậu cần phân tích những thư viện, method không được hỗ trợ ở phiên bản mới, mà phiên bản cũ cần để dùng. Thử tìm hiểu xem tại sao nó không được sử dụng nữa, và cách sử dụng thay thế ở phiên bản mới là gì.
    Đôi khi cậu sẽ có thêm thông tin để đưa ra solution sau này.
  • Cậu cần phân tích những method/thư viện mà chỉ bản mới mới có. Thử cân nhắc xem có solution nào khác ngoài cách sử dụng method/thư viện này không.
    Nó sẽ giúp cậu có thêm thông tin để đưa ra solution về sau.
  • Dựa vào các thông tin kể trên, cậu sẽ cân nhắc một trong các solution dưới đây:
    • Sửa lại thư viện nội bộ, a.k.a upgrade version của thư viện nội bộ. Những thông tin từ việc phân tích thư viện nội bộ sẽ giúp cậu ở lựa chọn này. Lúc này, phiên bản của thư viện nên là mới nhất có thể.
    • Thay đổi những thư viện/method ở project mới, a.k.a downgrade version của project mới. Những phân tích về project mới sẽ giúp cậu.
      Tuy nhiên, đây được coi là technical debt, và cậu sẽ có thể phải trả giá trong tương lai khi project cần version up spring-data-mongodb, do sự phụ thuộc chặt chẽ giữa thư viện của cậu và spring-data-mongodb.

Hi vọng sẽ được giúp được cậu!

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?