2012-09-27 42 views
15

Trong dự án của tôi, có một lớp đang triển khai giao diện. Giao diện xuất phát từ sự phụ thuộc. Tôi có một sự phụ thuộc khác mà bản thân nó có một sự phụ thuộc vào một cái lọ cũng chứa cùng một giao diện, ngoại trừ một phiên bản với nhiều phương thức hơn; hai lọ chứa cùng một giao diện gói KHÔNG có cùng groupId hoặc artifactId.
Biên dịch không thành công vì trình biên dịch phàn nàn rằng lớp trong dự án của tôi không triển khai tất cả các phương thức. Tôi nhận ra đó là bởi vì trình biên dịch lấy tham chiếu giao diện từ bình sai. Câu hỏi của tôi là, tại sao maven sử dụng giao diện từ phụ thuộc transitive thay vì một từ jar mà tôi đề cập rõ ràng trong POM dự án? Tôi có thể thấy lọ được sử dụng xuất hiện sớm hơn trong định nghĩa (vì vậy tôi cũng tưởng tượng trong classpath), nhưng tôi nghĩ trong trường hợp này, maven đã giải quyết nó bằng cách sử dụng lớp/giao diện va chạm từ phụ thuộc với đường dẫn ngắn nhất Thứ tự phụ thuộc Maven

Đây là một phần của cây phụ thuộc. Lưu ý rằng đây là grepped nhưng nó vẫn có thể thấy rằng javax.servlet:servlet-api (một trong những thực tế sử dụng) là sâu sắc hơn trong cây so với tomcat:servlet (một trong đó nên được sử dụng)

[[email protected] proj]$ mvn dependency:tree | grep servlet 
[INFO] | +- javax.servlet:servlet-api:jar:2.4:compile 
[INFO] +- tomcat:servlet:jar:4.0.6:compile 

Tôi đang sử dụng maven 3.0 .4

+0

tomcat: servlet: jar phải được cung cấp, không biên dịch. Bạn nên biên dịch với javax.servlet: servlet-api và thêm một sự phụ thuộc vào phiên bản thích hợp. – OrangeDog

Trả lời

14

Tại sao maven sử dụng giao diện từ phụ thuộc transitive thay vì một từ jar mà tôi đề cập rõ ràng trong POM dự án ?

Vì, đối với Maven, cả hai không liên quan gì đến nhau. Maven không biết về tên lớp hay tên gói, Maven chỉ biết về groupId và artifactId. Vì những thứ đó không giống nhau, maven không có lý do gì để bỏ qua sự phụ thuộc chuyển tiếp.

Và nếu tôi đúng, Maven đặt phụ thuộc vào đường dẫn lớp theo thứ tự chúng được xác định, tức là phụ thuộc chuyển tiếp phụ thuộc a xuất hiện trước phụ thuộc b.

5

Khi bạn khai báo sự phụ thuộc của bạn vào file jar khác mà bạn có thể nói với nó để loại trừ phụ thuộc bắc cầu vào file jar mâu thuẫn:

<dependency> 
     <groupId>group</groupId> 
     <artifactId>artifact</artifactId> 
     <version>1.0.0</version> 
     <exclusions> 
      <exclusion> 
       <groupId>othergroup</groupId> 
       <artifactId>ArtifactToExclude</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
+0

Vâng, tôi đã nghĩ đến việc đó. Nhưng câu hỏi của tôi, nhiều hơn làm thế nào để sửa chữa nó, là tại sao maven lấy giao diện từ bình sai? Tôi muốn hiểu logic – Hilikus

+3

Trong trường hợp này tôi nghĩ Sean Patrick Floyd là chính xác, chúng sẽ xuất hiện trong classpath theo thứ tự chúng được khai báo trong tệp pom của bạn. –