Maven: использование унаследованного свойства в классификаторе зависимостей приводит к сбою сборки - PullRequest
4 голосов
/ 13 ноября 2010

Имеются три файла POM:

  • C зависит от B.
  • B наследуется от A.
  • Я могу построить А и В
  • C не удается построить из-за его зависимости от B.

Полный исходный код и выходные данные сборки приведены ниже для вашего обзора.

Вот POM А:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.foo</groupId>
    <artifactId>A</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>A</name>
    <repositories>
        <repository>
            <id>foo releases</id>
            <name>libs-releases-local</name>
            <layout>default</layout>
            <url>http://foo.net/artifactory/libs-releases-local</url>
        </repository>
    </repositories>
    <dependencies>
        <dependency>
            <groupId>org.eclipse.swt</groupId>
            <artifactId>swt</artifactId>
            <classifier>${swt.classifier}</classifier>
            <version>3.6.1</version>
        </dependency>
    </dependencies>
    <profiles>
        <profile>
            <id>windows-x86</id>
            <properties>
                <swt.classifier>win32-x86</swt.classifier>
            </properties>
        </profile>
    </profiles>
</project>

Вот POM B:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.foo</groupId>
        <artifactId>A</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../A</relativePath>
    </parent>
    <artifactId>B</artifactId>
    <packaging>jar</packaging>
    <name>B</name>
    <profiles>
        <profile>
            <id>windows-x86</id>
            <properties>
                <swt.classifier>win32-x86</swt.classifier>
            </properties>
        </profile>
    </profiles>
</project>

Вот POM C:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.foo</groupId>
    <artifactId>C</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>C</name>
    <dependencies>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>B</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>
</project>

Вот вывод сборки из C:

------------------------------------------------------------------------
Building C
   task-segment: [install]
------------------------------------------------------------------------
[compiler:compile]
Nothing to compile - all classes are up to date
Downloading: http://foo.net/artifactory/libs-releases-local/org/eclipse/swt/swt/3.6.1/swt-3.6.1-${swt.classifier}.jar
[WARNING] Unable to get resource 'org.eclipse.swt:swt:jar:${swt.classifier}:3.6.1' from repository foo releases (http://foo.net/artifactory/libs-releases-local): Error transferring file: foo.net
Downloading: http://repo1.maven.org/maven2/org/eclipse/swt/swt/3.6.1/swt-3.6.1-${swt.classifier}.jar
Unable to find resource 'org.eclipse.swt:swt:jar:${swt.classifier}:3.6.1' in repository central (http://repo1.maven.org/maven2)
------------------------------------------------------------------------
[ERROR]BUILD ERROR
------------------------------------------------------------------------
Failed to resolve artifact.

Missing:
----------
1) org.eclipse.swt:swt:jar:${swt.classifier}:3.6.1

Я знаю, что эта проблема связана с https://issues.apache.org/jira/browse/MNG-3228, но я не уверен, как это исправить. Пожалуйста, помогите!

UPDATE

Добавление классификатора в B помогло. Теперь C строит, пока репозиторий содержит только JAR-файл B. Если я загружаю POM-файл B вместе с JAR-файлом в хранилище, происходит сбой C с вышеуказанной ошибкой (${swt.classifier} не определено). Есть идеи?

Ответы [ 4 ]

2 голосов
/ 15 декабря 2010

В комментарии вы пишете: «Я ожидаю, что классификатор SWT будет разрешен во время сборки B, а не во время сборки C», но это неправильно - вам нужен классификатор во время сборки C, поскольку C зависит отSWT (переходной через A).Эта зависимость полностью определяется только свойством, поэтому у вас должен быть способ оценки свойства в pom C.

  • A зависит от swt - $ {classifier}
  • C зависит от A
  • , поэтому C зависит от swt - $ {классификатор}
  • , поэтому pom C должен определять свойство.Он может быть определен профилем (как в A) или вручную во время выполнения (плохо для воспроизводимости), но вы не можете построить C без него.

Это так же просто (и озадачивает), какэто.

Если вы ожидаете, что свойство каким-то образом будет полностью «разрешено» на этом пути и уже будет четко определено к моменту создания C, вы не понимаете, как Maven обрабатывает эти свойства.Это оставляет их в покое.Была попытка сделать что-то другое в Maven 2.1 (выражение свойства классификатора было бы преобразовано в его значение при установке A), но оно не было успешным, вызвало много неожиданных действий, оно было возвращено для 2.2 и фактически вызвало2.1 Быстрее не рекомендуется.Для получения более подробной информации и некоторых советов о том, насколько сложна проблема на самом деле, см. Ссылку ниже.

https://cwiki.apache.org/confluence/display/MAVENOLD/Artifact-Coordinate+Expression+Transformation

Пока разработчики Maven не примут иное решение, я думаю, что мы будем продолжатьповедение, которое существует с 2.0: «Выражения в координатах артефакта игнорируются. У пользователей есть множество веревок, с помощью которых можно повеситься»

Однако, как только вы к этому привыкнете, это больше не смущает.Только когда вы пытаетесь угадать Мейвена, вы удивляетесь.

1 голос
/ 31 января 2011

Это невозможно с Maven 3.1.0. Вот соответствующий запрос функции: https://issues.apache.org/jira/browse/MNG-1388

1 голос
/ 13 ноября 2010

Maven пытается найти артефакт org.eclipse.swt: swt: 3.6.1, но координаты не разрешаются правильно. Ошибка говорит о том, что $ {swt.classifier} не распознается из блока <properties/> в вашем POM.xml. Поскольку это значение отображается в блоке <profile/>, можете ли вы проверить, какую команду Maven вы используете?

Попробуйте это: mvn dependency:resolve -P windows-x86

Кроме того, убедитесь, что версия SWT и классификатор действительно верны. Последняя версия, которую я вижу в Maven Central, не 3.6.0, а 3.3.0-v3346

0 голосов
/ 13 ноября 2010

Я знаю, что эта проблема связана с https://issues.apache.org/jira/browse/MNG-3228, но я не знаю, как ее исправить.

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

На самом деле, я даже не уверен, что понял ожидаемый результат. Откуда должен появиться классификатор? Возможно, мне не хватает некоторых частей, но я думаю, что вы должны установить / развернуть квалифицированную версию B (с полностью разрешенным POM) и иметь C, зависящий от этой квалифицированной версии.

Как мне нужно изменить POM B для развертывания квалифицированной версии? Я ожидаю, что классификатор SWT будет разрешен во время сборки B, а не во время сборки C.

Да, но во время сборки C, C нужны зависимости B и B, поэтому установленное / развернутое .pom B должно быть полностью разрешено. По крайней мере, так я думаю, что вещи могут работать.

Но я должен признать, что я не уверен, как именно решить этот случай, и после прочтения таких проблем, как MNG-4140 или Преобразование выражения артефакта и координат , я полностью сбит с толку.

Я предлагаю опубликовать это в списке пользователей maven для правильного способа (и я буду внимательно следить за темой, потому что я думаю, что у меня есть несколько сломанных POM, использующих профили, свойства и зависимости, которые нужно исправить, спасибо:)

...