Jaki jest cel właściwości klasyfikatora deklaracji zależności Mavensa?

81

Mam plik pom.xml i widzę, że są to 3 zależności, do których odnoszą się te same, <artifactId>różnica jest w tagach

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

Usunąłem zależności, które miały SOURCES/JAVADOCi zachowały tylko jedną zależność. Przetestowałem moją aplikację i wszystko działa dobrze.

Jaki jest cel używania tego tagu klasyfikatora? i dlaczego muszę dwukrotnie zduplikować zależności, aby dodać <classifier>tag z 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> 
pushya
źródło

Odpowiedzi:

65

Klasyfikator rozróżnia artefakty, które zostały zbudowane z tego samego POM, ale różnią się zawartością. Jest to jakiś opcjonalny i dowolny ciąg, który - jeśli występuje - jest dołączany do nazwy artefaktu tuż po numerze wersji.

Źródło

Biswajit
źródło
1
Zgodnie z dokumentem mówi się, że „źródła klasyfikatorów i javadoc są używane do wdrażania kodu źródłowego projektu i dokumentów API wraz z pakietami plików klas”, co to oznacza? Myślę, że to jest powód, dla którego mój pom.xml go używa. Dlaczego musisz wdrożyć dokumentację interfejsu API i kod źródłowy wraz z pakietami klas. Czy wdrażanie klas w pakiecie nie jest wystarczająco dobre?
pushya
6
@pushya zazwyczaj podczas wdrażania artefaktów w publicznym repozytorium, takim jak centrala Maven, dołącza się javadoc i źródła, aby środowiska IDE z obsługą Maven mogły wykonywać poprawne uzupełnianie kodu i wyskakujące okienka JavaDoc, a także mogły wejść do kodu biblioteki podczas debugowania.
Ian Roberts,
@IanRoberts, które mają teraz sens. więc oznacza to, że mogę usunąć zależności, które mają "SOURCE / JAVADOC" i są one opcjonalne i służą głównie jako przyjazne programistom podczas kodowania?
pushya,
1
@pushya Bardziej niż prawdopodobne, tak. Spróbuj i zobacz, co się stanie.
Ian Roberts,
16

Jeszcze jedna bardziej pragmatyczna odpowiedź na przykładzie, aby pomóc zrozumieć użyteczność classifierlepszego.

Załóżmy, że potrzebujesz dwóch wersji artefaktu: for openjpai for eclipselink- powiedzmy, ponieważ jar zawiera encje, które są szczególnie potrzebne do ulepszonej implementacji JPA.

Możesz mieć inną obsługę tych kompilacji zdefiniowanych w profilach Maven, a używane wówczas profile mają również właściwość <classifier />.

Budować inaczej sklasyfikowane wersje, w byłyby następnie skonfigurowany followinglypommaven-jar-plugin

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

Zainstalowanie obu spowoduje pliki w repozytorium coś takiego:

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

Teraz byłaby tylko kwestia tego, classifierdo którego z nich użyć, więc na przykład dla OpenJPA:

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

a dla EclipseLink należy zmienić klasyfikator jako:

<classifier>eclipselink</classifier>
pirho
źródło
Gdzie mogę znaleźć wyjaśnienie tej składni: <classifier> [openjpa | eclipselink] </classifier>
Alan Snyder
@AlanSnyder to był tylko "leniwy skrót do kodowania", a nie żadna faktycznie działająca składnia. Zredagowałem tę część, aby było jaśniejsze. [openjpa|eclipselink]był tylko „selektorem” do wyboru jednego z nich.
pirho
7

Przykład klasyfikatora
Jako motywację dla tego elementu rozważmy na przykład projekt, który oferuje artefakt skierowany na JRE 1.8, ale jednocześnie artefakt, który nadal obsługuje JRE 1.7. Pierwszy artefakt mógłby być wyposażony w klasyfikator jdk18, a drugi w jdk14, tak aby klienci mogli wybrać, którego użyć.

Innym częstym przypadkiem użycia klasyfikatorów jest potrzeba dołączenia drugorzędnych artefaktów do głównego artefaktu projektu. Jeśli przejrzysz centralne repozytorium Maven, zauważysz, że źródła klasyfikatorów i javadoc są używane do wdrażania kodu źródłowego projektu i dokumentów API wraz z spakowanymi plikami klas.

vishal sahasrabuddhe
źródło
3

Umożliwia rozróżnienie dwóch artefaktów, które należą do tego samego POM, ale zostały zbudowane w inny sposób, i jest dołączany do nazwy pliku po wersji.

Na przykład, jeśli masz inne artefakty w swoim repozytorium (dokumenty, źródła ...), możesz odwołać się do nich i dodać je do swojego projektu jako zależności. w tym kodzie, dodając <classifier>sources</classifier>plik otrzymujemy plik sources.jar z repozytorium.

    <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> 

w rzeczywistości pozwala zlokalizować zależności z dalszym poziomem szczegółowości.

Panie Q
źródło