Was ist der Zweck der Klassifizierereigenschaft für Mavens-Abhängigkeitsdeklarationen?


80

Ich habe eine pom.xml-Datei und darin sehe ich, dass es 3 Abhängigkeiten gibt, auf die für dasselbe verwiesen wird, <artifactId>der Unterschied liegt in Tags

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

Ich habe die Abhängigkeiten gelöscht, die die hatten SOURCES/JAVADOCund nur eine Abhängigkeit beibehalten. Ich habe meine Anwendung getestet und alles funktioniert einwandfrei.

Was ist der Zweck der Verwendung dieses Klassifizierertags? und warum ich Abhängigkeiten zweimal duplizieren muss, um ein <classifier>Tag mit hinzuzufügen 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> 

Antworten:


64

Der Klassifikator unterscheidet Artefakte, die aus demselben POM erstellt wurden, sich jedoch im Inhalt unterscheiden. Es handelt sich um eine optionale und willkürliche Zeichenfolge, die - falls vorhanden - direkt nach der Versionsnummer an den Artefaktnamen angehängt wird.

Quelle


1
Laut dem Dokument "werden die Klassifiziererquellen und Javadoc verwendet, um den Projektquellcode und die API-Dokumente zusammen mit den gepackten Klassendateien bereitzustellen". Was bedeutet das? Ich denke, das ist der Grund, warum meine pom.xml es verwendet. Warum müssen Sie die API-Dokumente und den Quellcode zusammen mit gepackten Klassen bereitstellen? Ist die Bereitstellung gepackter Klassen nicht gut genug?
Pushya

6
@pushya Wenn Sie Ihre Artefakte in einem öffentlichen Repository wie Maven Central bereitstellen, schließen Sie normalerweise die Javadocs und Quellen ein, damit IDEs mit Maven-Unterstützung die Code-Vervollständigung und JavaDoc-Popups ordnungsgemäß ausführen und beim Debuggen in den Bibliothekscode wechseln können.
Ian Roberts

@ IanRoberts, die jetzt Sinn machen. das heißt also, ich kann die Abhängigkeiten entfernen, die "SOURCE / JAVADOC" haben und sie sind optional und dienen hauptsächlich dem Zweck, entwicklerfreundlich beim Codieren zu sein?
Pushya

1
@pushya Höchstwahrscheinlich ja. Probieren Sie es aus und sehen Sie, was passiert.
Ian Roberts

15

Noch eine pragmatischere Antwort anhand eines Beispiels, um die Nützlichkeit von classifierbesser zu verstehen .

Angenommen , Sie haben einen Bedarf für zwei Versionen eines Artefakts: für openjpaund für eclipselink- sagen wir , weil Glas enthält Einheiten, die JPA - Implementierung verbessert werden benötigt , um speziell.

Möglicherweise haben Sie eine andere Behandlung für diese Builds, die in Maven-Profilen definiert sind, und die verwendeten Profile haben dann auch die Eigenschaft <classifier />.

Um die unterschiedlich klassifizierten Versionen zu erstellen, würde in pomder maven-jar-plugindann folgend konfiguriert

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

Die Installation beider würde zu Dateien im Repo führen, die ungefähr so ​​aussehen:

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

Jetzt wäre es nur noch eine Frage der classifierVerwendung, also für OpenJPA zum Beispiel:

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

und für EclipseLink würden Sie den Klassifikator wie folgt wechseln:

<classifier>eclipselink</classifier>

Wo finde ich eine Erklärung für diese Syntax: <Klassifizierer> [openjpa | eclipselink] </ Klassifizierer>
Alan Snyder

@ AlanSnyder es war nur eine "Lazy Coder Shortcut" keine wirklich funktionierende Syntax. Ich habe diesen Teil bearbeitet, um es klarer zu machen. [openjpa|eclipselink]war nur ein "Selektor" für die Auswahl eines der beiden.
Pirho

7

Beispiel für einen Klassifikator
Als Motivation für dieses Element betrachten Sie beispielsweise ein Projekt, das ein Artefakt für JRE 1.8 bietet, gleichzeitig aber auch ein Artefakt, das JRE 1.7 weiterhin unterstützt. Das erste Artefakt könnte mit dem Klassifikator jdk18 und das zweite mit jdk14 ausgestattet sein, so dass Clients auswählen können, welches verwendet werden soll.

Ein weiterer häufiger Anwendungsfall für Klassifizierer ist die Notwendigkeit, sekundäre Artefakte an das Hauptartefakt des Projekts anzuhängen. Wenn Sie das zentrale Maven-Repository durchsuchen, werden Sie feststellen, dass die Klassifiziererquellen und Javadoc verwendet werden, um den Projektquellcode und die API-Dokumente zusammen mit den gepackten Klassendateien bereitzustellen.


3

Es ermöglicht die Unterscheidung von zwei Artefakten, die zum selben POM gehören, aber unterschiedlich erstellt wurden, und wird nach der Version an den Dateinamen angehängt.

Wenn Sie beispielsweise andere Artefakte in Ihrem Repository haben (Dokumente, Quellen ...), können Sie diese referenzieren und als Abhängigkeit zu Ihrem Projekt hinzufügen. In diesem Code erhalten <classifier>sources</classifier>wir durch Hinzufügen von die Datei sources.jar aus dem Repository.

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

Tatsächlich können Sie Ihre Abhängigkeiten mit der weiteren Granularitätsebene lokalisieren.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.