Mục đích của thuộc tính phân loại khai báo phụ thuộc Mavens là gì?


81

Tôi có một tệp pom.xml và trong đó tôi thấy rằng chúng là 3 tệp phụ thuộc được tham chiếu cho giống nhau, <artifactId>sự khác biệt nằm trong các thẻ

<classifier>sources</classifier>
<classifier>javadoc</classifier>

Tôi đã xóa các phần phụ thuộc có SOURCES/JAVADOCvà chỉ giữ lại một phần phụ thuộc. Tôi đã thử nghiệm ứng dụng của mình và mọi thứ đều hoạt động tốt.

Mục đích của việc sử dụng thẻ phân loại này là gì? và tại sao tôi cần sao chép các phụ thuộc hai lần để thêm <classifier>thẻ với SOURCES/JAVADOC.

<dependency>
   <groupId>oauth.signpost</groupId>
   <artifactId>signpost-commonshttp4</artifactId>
   <version>1.2.1.2</version>
   <type>jar</type>
   <scope>compile</scope>
</dependency>
  <dependency>
   <groupId>oauth.signpost</groupId>
   <artifactId>signpost-commonshttp4</artifactId>
   <version>1.2.1.2</version>
   <type>jar</type>
      ***<classifier>javadoc</classifier>***
   <scope>compile</scope>
</dependency>
<dependency>
   <groupId>oauth.signpost</groupId>
   <artifactId>signpost-commonshttp4</artifactId>
   <version>1.2.1.2</version>
   <type>jar</type>
   ***<classifier>sources</classifier>***
   <scope>compile</scope>
</dependency> 

Câu trả lời:


65

Bộ phân loại phân biệt các tạo tác được xây dựng từ cùng một POM nhưng khác nhau về nội dung. Đó là một số chuỗi tùy chọn và tùy ý - nếu có - được thêm vào tên cấu phần ngay sau số phiên bản.

Nguồn


1
Theo tài liệu nói rằng 'nguồn phân loại và javadoc được sử dụng để triển khai mã nguồn dự án và tài liệu API cùng với các tệp lớp đóng gói' điều đó có nghĩa là gì? Tôi nghĩ đó là lý do tại sao pom.xml của tôi sử dụng nó. Tại sao bạn cần triển khai tài liệu API và Mã nguồn cùng với các lớp đóng gói. Triển khai các lớp đóng gói không đủ tốt sao?
pushhya

6
@pushya thường khi bạn triển khai tạo tác của mình vào một kho lưu trữ công cộng như Maven center, bạn bao gồm javadocs và các nguồn để các IDE có hỗ trợ Maven có thể hoàn thành mã thích hợp và cửa sổ bật lên JavaDoc, đồng thời có thể bước vào mã thư viện khi gỡ lỗi.
Ian Roberts

@IanRoberts hiện có ý nghĩa. vậy có nghĩa là tôi có thể xóa các phần phụ thuộc có "SOURCE / JAVADOC" và chúng là tùy chọn và chủ yếu phục vụ mục đích thân thiện với nhà phát triển khi viết mã?
pushhya

1
@pushya Nhiều khả năng là có. Hãy thử nó và xem những gì sẽ xảy ra.
Ian Roberts

15

Tuy nhiên, một câu trả lời khác thực dụng hơn bằng một ví dụ để giúp hiểu rõ hơn tính hữu ích của điều đó classifier.

Giả sử bạn có nhu cầu về hai phiên bản của một tạo tác: for openjpavà for eclipselink- giả sử vì jar chứa các thực thể cần được triển khai JPA nâng cao một cách cụ thể.

Bạn có thể có một số xử lý khác nhau cho các bản dựng này được xác định trong hồ sơ Maven và các hồ sơ được sử dụng sau đó cũng có thuộc tính <classifier />.

Để xây dựng các phiên bản được phân loại khác nhau, trong pomnhững maven-jar-pluginsau đó sẽ được cấu hình Followingly

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-jar-plugin</artifactId>
   <version>3.0.2</version>
   <configuration>
       <classifier>${classifier}</classifier>
   </configuration>
</plugin>

Cài đặt cả hai sẽ dẫn đến các tệp trong repo giống như sau:

org / example / data / 1.0.0 / data-1.0.0.pom
org / example / data / 1.0.0 / data-1.0.0-openjpa.jar
org / example / data / 1.0.0 / data-1.0. 0-eclipselink.jar

Bây giờ nó sẽ chỉ là vấn đề classifiersử dụng cái nào, vì vậy đối với OpenJPA, ví dụ:

<dependency>
   <groupId>org.example</groupId>
   <artifactId>data</artifactId>
   <version>1.0.0</version>       
   <classifier>openjpa</classifier>
</dependency>

và đối với EclipseLink, bạn sẽ chuyển đổi bộ phân loại thành:

<classifier>eclipselink</classifier>

Tôi có thể tìm lời giải thích về cú pháp này ở đâu: <classifier> [openjpa | eclipselink] </classifier>
Alan Snyder

@AlanSnyder nó chỉ là một "phím tắt dành cho lập trình viên lười biếng" chứ không phải bất kỳ cú pháp thực sự hoạt động nào. Tôi đã chỉnh sửa phần đó để làm cho nó rõ ràng hơn. [openjpa|eclipselink]chỉ là một "bộ chọn" để chọn một trong hai.
pirho

7

Ví dụ cho Bộ phân loại
Như một động lực cho phần tử này, hãy xem xét ví dụ một dự án cung cấp một tạo tác nhắm mục tiêu JRE 1.8 nhưng đồng thời cũng là một tạo tác vẫn hỗ trợ JRE 1.7. Tạo tác đầu tiên có thể được trang bị bộ phân loại jdk18 và tạo tác thứ hai với jdk14 để khách hàng có thể chọn cái nào để sử dụng.

Một trường hợp sử dụng phổ biến khác cho các bộ phân loại là cần phải đính kèm các tạo tác phụ vào hiện vật chính của dự án. Nếu bạn duyệt qua kho lưu trữ trung tâm Maven, bạn sẽ nhận thấy rằng nguồn phân loại và javadoc được sử dụng để triển khai mã nguồn dự án và tài liệu API cùng với các tệp lớp được đóng gói.


3

Nó cho phép phân biệt hai tạo tác thuộc cùng một POM nhưng được xây dựng khác nhau và được thêm vào tên tệp sau phiên bản.

Ví dụ: nếu bạn có các tạo tác khác trong kho lưu trữ của mình (tài liệu, nguồn ...), bạn có thể tham khảo chúng và thêm chúng vào dự án của mình dưới dạng phụ thuộc. trong mã này bằng cách thêm <classifier>sources</classifier>chúng tôi đang nhận các nguồn.jar từ kho lưu trữ.

    <dependency>
    <groupId>oauth.signpost</groupId>
    <artifactId>signpost-commonshttp4</artifactId>
    <version>1.2.1.2</version>
    <type>jar</type>
    ***<classifier>sources</classifier>***
    <scope>compile</scope>
    </dependency> 

thực sự Nó cho phép bạn xác định vị trí phụ thuộc của mình với mức độ chi tiết hơn.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.