2016-11-17 5 views
-3
  • Предположим, что есть 2 артефакта maven (локальный) с тем же groupId, но с другим artifactId.
  • Различные artifactId должны сделать каждый артефакт maven уникальным.
  • Однако, если оба из уникальных артефактов имеют класс с тем же именем. этот класс не будет уникальным, потому что, когда он импортируется в java, он будет использовать формат groupId.className. и ни groupId, ни className не являются уникальными (в обсуждаемом случае).
  • Это приведет к проблеме двусмысленности в определении того, какой класс использовать.
  • После тестирования кажется, что будет использоваться зависимость, объявленная первым в файле pom.xml.

Вопрос лиУникальность artifactId in maven

  1. Что является лучшей практикой решения/избежать этой проблемы?
  2. Почему артефактная координата maven вносит вклад в уникальность артефакта maven в репозитории, но не внутри java-кода?

Пример кода: Maven - Same Class Name Same GroupId Different ArtifactId

  • Проект1 является первым артефактом.
  • Project2 - второй артефакт.
  • «Project User» - это артефакт/проект, который будет зависеть как от Project1 & Project2.
  • Project1 & Project2 оба имеют класс с именем Utilities.
  • Класс Utilities имеет статический метод public static String getDescription(), который возвращает string, содержащий координаты артефакта текущего проекта, а также название проекта.
  • Utilities.getDescription() вызывает String, чтобы увидеть, произойдет ли ошибка где-нибудь, и посмотреть, как он будет разрешен.
  • Результат зависит от того, какая зависимость была объявлена ​​сначала в файле pom.xml артефакта «Project User».

Отредактировано: Развейте Вопрос

  • Есть ли архетип, который будет создан пакет Java, используя как артефакта и GroupID вместо того, чтобы делать это вручную каждый раз ?
+1

имя класс не имеет ничего общего с артефактом или идентификатор_группы – Jens

+0

классами Java доступны как 'com.mypackage. MyClass 'не' groupId.MyClass'. Наверное, у вас есть два артефакта, которые имеют одинаковые пакеты и один и тот же класс. – NewUser

+0

Имя пакета должно быть уникальным. Например, вы должны использовать контролируемый домен или какой-либо уникальный псевдоним или что-то еще, а затем имя проекта. – xenteros

ответ

2

Что является лучшей практикой решения/избежать этой проблемы?

Мы включаем groupId и artifactId в качестве базового пакета в модуле.Таким образом, невозможно иметь один и тот же класс в двух модулях, поскольку пакеты будут отличаться.

например.

<groupId>net.openhft</groupId> 
<artifactId>chronicle-bytes</artifactId> 

имеет все под пакет

package net.openhft.chronicle.bytes; 

Кроме того, если вы знаете, пакет класса вы знаете, какой JAR он должен быть.

, если у вас есть класс два JAR-файлы нужно, Я предлагаю создать общий модуль, от которого оба зависят.

Примечание: в качестве основы вашего пакета обычно используется доменное имя вашей компании (и условное подразделение). Maven рекомендует использовать ваше доменное имя в качестве groupId, и если вы выйдете на Maven Central, это теперь является обязательным требованием. Вышеупомянутая стратегия поддерживает обе рекомендации.

Почему артефактная координация maven влияет на уникальность артефакта maven в репозитории, но не внутри java-кода?

Maven не принимает никакого уведомления о содержании JAR.

+1

Я также хотел бы добавить информацию о том, что Maven предлагает использовать ваш домен в качестве groupId – xenteros

2

@Peter следует за вашим руководством, предлагая рекомендации, чтобы избежать этой проблемы.

  1. Идентификатор группы: требуется уникальная идентификация вашего проекта. Revee вашего доменного имени ex: com.github.dibyaranjan
  2. artifactId - это название банки без версии.

Чтобы отличить два класса от разных JAR, создайте пакет как groupId.artifactId.

Например, я бы создал проект TestDummy, я хочу, чтобы имя JAR было TestDummy-1.1, тогда будет выглядеть мой пакет.

com.github.dibyaranjan.testdummy

Класс будет выглядеть - com.github.dibyaranjan.testdummy.MyClass

Справочную визит: https://maven.apache.org/guides/mini/guide-naming-conventions.html

Смежные вопросы