Какова цель свойства классификатора зависимостей зависимостей 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>
Ответы
Ответ 1
Классификатор различает артефакты, которые были созданы из одного и того же POM, но различаются по содержанию. Это некоторая необязательная и произвольная строка, которая - если присутствует - добавляется к имени артефакта сразу после номера версии.
Источник
Ответ 2
Пример для классификатора
В качестве мотивации для этого элемента рассмотрим, например, проект, предлагающий артефакт, нацеленный на JRE 1.8, но в то же время также артефакт, который по-прежнему поддерживает JRE 1.7. Первый артефакт может быть оснащен классификатором jdk18, а второй - с jdk14, так что клиенты могут выбрать, какой из них использовать.
Другим распространенным вариантом использования классификаторов является необходимость подключения вторичных артефактов к основному артефакту проекта. Если вы просмотрите центральный репозиторий Maven, вы заметите, что источники классификаторов и javadoc используются для развертывания исходного кода проекта и документов API вместе с упакованными файлами классов.
Ответ 3
Еще один более прагматичный ответ на примере, чтобы лучше понять полезность 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
org/example/data/1.0.0/data-1.0.0-eclipselink.jar
Теперь будет только вопрос classifier
, который будет использоваться, поэтому
<dependency>
<groupId>org.example</groupId>
<artifactId>data</artifactId>
<version>1.0.0</version>
<classifier>[openjpa|eclipselink]</classifier>
</dependency>
Ответ 4
Он позволяет различать два артефактов, принадлежащих одному и тому же POM, но созданных по-разному и добавляется к имени файла после версии.
Например, если у вас есть другие артефакты в вашем репозитории (документы, источники...), вы можете ссылаться на них и добавлять их в свой проект как зависимость.
в этом коде, добавив <classifier>sources</classifier>
, мы получаем source.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>
Фактически Это позволяет вам находить ваши зависимости с дальнейшим уровнем детализации.
Ответ 5
В соответствии со следующим:
https://blog.packagecloud.io/eng/2017/03/09/how-does-a-maven-repository-work/
в теге классификатора подразумевается "Вторичный артефакт", который будет отключен "транзитивной зависимостью"!
Таким образом, тег классификатора не только меняет "Maven Coordinate" на $artifactId- $version- $classifier.jar!