Яке призначення властивості класифікатора оголошень залежностей Mavens?


81

У мене є файл 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> 

Відповіді:


65

Класифікатор відрізняє артефакти, які були побудовані з одного і того ж POM, але відрізняються за змістом. Це якийсь необов’язковий та довільний рядок, який - якщо він присутній - додається до імені артефакту відразу після номера версії.

Джерело


1
Згідно з документом, "що класифікатори джерел та javadoc використовуються для розгортання вихідного коду проекту та документів API разом із упакованими файлами класів", що це означає? Я думаю, що це причина, чому мій pom.xml використовує його. Навіщо потрібно розгортати документи API та вихідний код разом із упакованими класами. Хіба розгорнуті пакувальні класи недостатньо хороші?
пуш'я

6
@pushya, як правило, коли ви розгортаєте свої артефакти у загальнодоступному сховищі, такому як Maven central, ви включаєте javadocs та джерела, щоб IDE з підтримкою Maven могли виконувати належне заповнення коду та спливаючі вікна JavaDoc, а також могли входити в код бібліотеки під час налагодження.
Ian Roberts

@IanRoberts, що зараз має сенс. так що це означає, що я можу видалити залежності, які містять "SOURCE / JAVADOC", і вони є необов'язковими і в основному служать тому, щоб бути зручним для розробників при кодуванні?
pushya

1
@pushya Більше ймовірно, так. Спробуйте і подивіться, що станеться.
Ian Roberts

15

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

Припустимо, вам потрібні дві версії артефакту: for openjpaі for eclipselink- скажімо, тому що jar містить сутності, які потрібні для покращення реалізації JPA.

Можливо, у вас є інша обробка для цих збірок, визначених у профілях Maven, і використовувані профілі також мають властивість <classifier />.

Для побудови різнокласифікованих версій, в pommaven-jar-plugin потім буде налаштований followingly

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

Встановлення обох результатів призведе до файлів у репозиторії приблизно так:

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

Тепер це було б лише питанням classifier для якого використання, наприклад, для OpenJPA, наприклад:

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

а для EclipseLink ви б змінили класифікатор як:

<classifier>eclipselink</classifier>

Де я можу знайти пояснення цього синтаксису: <classifier> [openjpa | eclipselink] </classifier>
Алан Снайдер,

@AlanSnyder це був просто "ярлик ледачого кодера", а не будь-який фактично діючий синтаксис. Я відредагував цю частину, щоб зробити її більш зрозумілою. [openjpa|eclipselink]був просто "селектором" для вибору того чи іншого.
pirho

7

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

Іншим поширеним випадком використання класифікаторів є необхідність приєднання вторинних артефактів до основного артефакту проекту. Якщо ви переглядаєте центральне сховище Maven, ви помітите, що джерела класифікаторів та javadoc використовуються для розгортання вихідного коду проекту та документів API разом із упакованими файлами класів.


3

Це дозволяє розрізнити два артефакти, які належать одному POM, але були побудовані по-різному, і додається до імені файлу після версії.

Наприклад, якщо у вашому сховищі є інші артефакти (документи, джерела ...), ви можете посилатися на них і додавати їх до свого проекту як залежність. у цьому коді, додавши те, що <classifier>sources</classifier>ми отримуємо sources.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> 

насправді Це дозволяє знаходити ваші залежності з подальшим рівнем деталізації.


0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.