2010-09-30 22 views
7

Ví dụ, nếu có phụ thuộc:Maven: Làm thế nào để loại bỏ các phụ thuộc nếu chúng đã được chuyển đổi?

a -> b 
a -> c 
b -> c 

Tôi muốn loại bỏ phụ thuộc a -> c, bởi vì có a -> b -> c.

Tôi biết có thể có một số phụ thuộc mạnh không nên giảm, nhưng không liên quan đến câu hỏi này.

Ví dụ:

In a.pom: 
<dependencies> 
    <dependency>b</dependency> 
    <dependency>c</dependency> 
</dependencies> 

In b.pom: 
<dependencies> 
    <dependency>c</dependency> 
</dependencies> 

Dự kiến ​​kết quả:

In a.pom: 
<dependencies> 
    <dependency>b</dependency> 
</dependencies> 
+4

Và những gì * là * các câu hỏi? –

+2

Và sau đó xây dựng của bạn phá vỡ nếu b thay đổi và không còn phụ thuộc vào c. Tại sao bạn muốn che giấu sự phụ thuộc đó, nếu nó thực sự ở đó? –

+0

@Thomas không liên quan đến câu hỏi này. –

Trả lời

12

Tôi giả định rằng bạn muốn tìm phụ thuộc giả/không cần thiết đã được đáp ứng bởi vì bạn nhận được chúng miễn phí từ một phụ thuộc khác.

Tôi có thể tưởng tượng bạn có thể muốn làm điều đó để làm sạch poms của bạn.

Tuy nhiên, đó không phải là điều bình thường bạn muốn làm, vì đó là cách hay để nêu rõ phụ thuộc của bạn là gì.

Bạn không bao giờ biết nếu trong mô-đun tương lai b loại bỏ c như phụ thuộc và do đó phá vỡ a

+0

Bạn nói đúng. Tôi phải dọn dẹp các poms, các phụ thuộc không được khai báo tốt bởi vì các lập trình viên không quen thuộc với các công cụ Maven và kĩ nghệ phần mềm. Các phụ thuộc chủ yếu được quản lý bởi các IDE. Nó cũng có giá trị để tạo ra một đồ thị phụ thuộc tối thiểu cho mục đích minh họa. –

2

Giống như áp phích khác, tôi không chắc chắn chính xác những gì bạn muốn đạt được. Có thể loại trừ là những gì bạn cần? Bạn có thể sử dụng các loại trừ để loại bỏ các phụ thuộc của các phụ thuộc của bạn - nếu chúng không được mong muốn vì một số lý do.

 <dependency> 
      <groupId>commons-logging</groupId> 
      <artifactId>commons-logging</artifactId> 
      <version>1.1.1</version> 
      <exclusions> 
       <exclusion> 
        <groupId>log4j</groupId> 
        <artifactId>log4j</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>logkit</groupId> 
        <artifactId>logkit</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>avalon-framework</groupId> 
        <artifactId>avalon-framework</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>javax.servlet</groupId> 
        <artifactId>servlet-api</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
14

Sử dụng mvn dependency:analyze để cho bạn biết liệu có phụ thuộc vào pom của bạn mà bạn không cần (nó cũng có thể xác định một số mà bạn đã bỏ lỡ, thêm -DoutputXML=true để hiển thị các mục mất tích).

Sử dụng mvn dependency:tree để cho bạn biết các phụ thuộc hiện đang được sử dụng bởi dự án của bạn và nơi Maven đang tìm kiếm chúng. Thêm -Dverbose=true để hiển thị tất cả các trùng lặp và xung đột.

Nếu atrực tiếp phụ thuộc vào c (có nghĩa là nếu mã trong a đề cập đến các lớp học trong c), thì pom nên phản ánh điều đó. Nếu a chỉ phụ thuộc trực tiếp vào b, thì bạn có thể xóa phụ thuộc c một cách an toàn khỏi tệp pom.xml của a. Các lệnh trên sẽ cho phép bạn xác định hành động tiếp theo thích hợp là gì.

Chỉnh sửa: OK, bạn đã cập nhật câu hỏi của mình. Dưới đây là cách bạn thực hiện:

  1. trong dự án a, chạy mvn dependency:tree -Dverbose=true. Điều này sẽ cho bạn thấy một cây hoàn chỉnh của tất cả các phụ thuộc được Maven xem xét cho dự án của bạn.
  2. Nhìn vào đầu ra của bước 1 và tạo danh sách tất cả các phụ thuộc được hiển thị ở nhiều cấp độ sâu (một số có thể là bản sao).
  3. Chỉnh sửa tập tin pom.xml của bạn trong bất cứ trình soạn thảo bạn thích và loại bỏ bất kỳ phụ thuộc phù hợp với danh sách mà bạn đã tạo ở bước 2.

Hoặc Bạn đang tìm kiếm một cách để làm điều đó tự động? Tôi không nghĩ rằng có bất kỳ cách tự động nào trừ khi bạn tự viết một mình, bởi vì những gì bạn đang cố gắng làm là BAD IDEA. Bạn đang nói với mọi người rằng phản đối của họ là "không thích hợp" với câu hỏi của bạn, nhưng thực tế là câu hỏi của bạn giống như hỏi "Làm thế nào tôi có thể sử dụng Maven để làm cho việc sử dụng Maven khó khăn hơn?"

Không có lý do chính đáng nào khiến bạn muốn thực hiện việc này. Nếu bạn nghĩ rằng có một lý do chính đáng, thì bạn phải cố gắng thực hiện nó để tạo ra một số kết quả.Bạn nên yêu cầu giúp đỡ với kết quả mong muốn, bởi vì kế hoạch của bạn là một kế hoạch xấu.

+0

lưu ý rằng bạn nên chạy 'mvn install' trước khi' phụ thuộc: phân tích' bởi vì phân tích được thực hiện trên tạo phẩm đã biên dịch –

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