Учитывая библиотеку, которая имеет различные зависимости в зависимости от профиля, скажем, например,
<profile>
<id>default</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<envClassifier>cuda-10.1</envClassifier>
</properties>
<dependencies>
<dependency>
<groupId>org.jcuda</groupId>
<artifactId>jcuda</artifactId>
<version>10.1.0</version>
</dependency>
</dependencies>
</profile>
<profile>
<id>cuda-10.0</id>
<properties>
<envClassifier>cuda-10.0</envClassifier>
</properties>
<dependencies>
<dependency>
<groupId>org.jcuda</groupId>
<artifactId>jcuda</artifactId>
<version>10.0.0</version>
</dependency>
</dependencies>
</profile>
Я создаю артефакты с различными классификаторами, например,
library-1.0.0-cuda-10.0
и
library-1.0.0-cuda-10.1
(здесь cuda-10.0
и cuda-10.1
- классификаторы артефакта library-1.0.0
).
Если другой проект ссылается на эту библиотеку, скажем, например, как
<dependency>
<groupId>net.finmath</groupId>
<artifactId>library</artifactId>
<version>1.0.0</version>
<classifier>cuda-10.0</classifier>
</dependency>
затем извлекается правильный артефакт (здесь library-1.0.0-cuda-10.0.jar), но дерево зависимостей (через mvn dependency:tree
) показывает неправильные зависимости зависимости . В этом примере он показывает jcuda-10.1.0, а не juda-10.0.0.
Эта проблема связана с тем, что у артефакта есть один pom. xml для всех классификаторов (и включается профиль по умолчанию) .
Вопрос 1: Можете ли вы выделить pom. xml в репозиториях для различных классификаторов, чтобы отразить правильные зависимости?
Видимо, проблема не может быть решена путем установки профиля (параметр -P
) во внешнем проекте, потому что селекторы профиля не передаются в pom
s зависимостей. Выглядит так, как будто профили не идут по дереву зависимостей.
Вопрос 2: Есть ли способ передать селектор профиля в pom зависимости, чтобы выбрать правильное Зависимости зависимости ?
Я нашел два варианта решения проблемы, но я не очень доволен ими.
Первым будет не иметь профиль по умолчанию с зависимостью в pom библиотеки. В этом случае пользователь библиотеки (здесь library-1.0.0) должен указать правильный классификатор и правильные нисходящие зависимости. Это кажется громоздким. Также обратите внимание, что в этом случае сборка библиотеки не удастся без указания профиля.
Можно использовать профиль для изменения имени (или версии) артефакта. Поскольку каждая версия или артефакт поставляется со своим собственным pom, это позволяет указывать профили, определяющие c зависимостей, которые необходимо разрешить.
Однако я считаю, что должно быть лучшее решение, потому что в противном случае похоже, что спецификация зависимостей в профилях не имеет смысла для артефактов, которые являются библиотеками, то есть сами являются зависимостями других проектов.
Вопрос 3: Что такое путь Maven решить эту проблему?
PS: В этом проекте возник вопрос: http://finmath.net/finmath-lib-cuda-extensions/