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/JAVADOC
i 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>
java
maven
dependency-management
pushya
źródło
źródło
Jeszcze jedna bardziej pragmatyczna odpowiedź na przykładzie, aby pomóc zrozumieć użyteczność
classifier
lepszego.Załóżmy, że potrzebujesz dwóch wersji artefaktu: for
openjpa
i foreclipselink
- 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 followingly
pom
maven-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:
Teraz byłaby tylko kwestia tego,
classifier
do 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>
źródło
[openjpa|eclipselink]
był tylko „selektorem” do wyboru jednego z nich.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.
źródło
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.
źródło
Zgodnie z następującym: https://blog.packagecloud.io/eng/2017/03/09/how-does-a-maven-repository-work/ tag klasyfikatora zawiera „Drugorzędny artefakt”, którego „zależność przechodnia” zostanie odcięty! Tak więc tag klasyfikatora nie tylko zmienia "współrzędną Maven" o $ artifactId- $ version- $ classifier.jar!
źródło