Какова цель свойства классификатора объявлений зависимостей 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!