Какова цель свойства классификатора объявлений зависимостей Mavens?

У меня есть файл pom.xml, и в этом я вижу, что их 3 зависимости, на которые ссылаются для того же <artifactId> разница в тегах

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

Я удалил зависимости, которые имели SOURCES/JAVADOCи сохранил только одну зависимость. Я проверил свое приложение, и все работает нормально.

Какова цель использования этого тега классификатора? и почему мне нужно дублировать зависимости дважды для добавления <classifier> пометить с 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> 

5 ответов

Решение

Классификатор позволяет различать артефакты, которые были созданы из одного и того же POM, но различаются по своему содержанию. Это некоторая необязательная и произвольная строка, которая - если присутствует - добавляется к имени артефакта сразу после номера версии.

подробности смотрите http://maven.apache.org/pom.html

Еще один более прагматичный ответ на примере, чтобы помочь понять полезность classifier лучше.

Предположим, вам нужны две версии артефакта: для openjpa и для eclipselink - скажем, потому что jar содержит сущности, которые необходимы для конкретной реализации JPA.

У вас может быть другая обработка этих сборок, определенных в профилях Maven, и используемые профили также имеют свойство <classifier />,

Для построения по-разному классифицированных версий, в 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>

Установка обоих приведет к тому, что файлы в репо будут примерно такими:

орг / пример / данные / 1.0.0 / данные 1.0.0.pom
орг / пример / данные / 1.0.0 / данные 1.0.0-openjpa.jar
орг / пример / данные / 1.0.0 / данные 1.0.0-eclipselink.jar

Теперь это будет только вопрос classifier для какой пользы, так

<dependency>
   <groupId>org.example</groupId>
   <artifactId>data</artifactId>
   <version>1.0.0</version>
   <classifier>[openjpa|eclipselink]</classifier>
</dependency>

Пример для классификатора
В качестве мотивации для этого элемента рассмотрим, например, проект, который предлагает артефакт, нацеленный на JRE 1.8, но в то же время также и артефакт, который все еще поддерживает JRE 1.7. Первый артефакт может быть снабжен классификатором jdk18, а второй - jdk14, чтобы клиенты могли выбирать, какой из них использовать.

Другим распространенным вариантом использования классификаторов является необходимость присоединения вторичных артефактов к основному артефакту проекта. Просматривая центральный репозиторий Maven, вы заметите, что источники классификаторов и javadoc используются для развертывания исходного кода проекта и документов API вместе с упакованными файлами классов.

Он позволяет различать два артефакта, принадлежащих одному и тому же POM, но построенных по-разному, и добавляется к имени файла после версии.

Например, если у вас есть другие артефакты в вашем хранилище (документы, источники...), вы можете ссылаться на них и добавлять их в свой проект в качестве зависимости. в этом коде, добавив <classifier>sources</classifier> мы получаем исходники.jar из хранилища.

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

на самом деле это позволяет вам находить ваши зависимости с дальнейшим уровнем детализации.

В соответствии со следующим: https://blog.packagecloud.io/eng/2017/03/09/how-does-a-maven-repository-work/ тег-классификатор имеет в виду "вторичный артефакт", который является его "транзитивной зависимостью" будет отрезан! Таким образом, тег-классификатор не только меняет "Maven Coordinate" на $artifactId-$version-$classifier.jar!

Другие вопросы по тегам