Nano Hash - криптовалюты, майнинг, программирование

Почему дочерние версии maven, ссылающиеся на версии из спецификации, не работают?

Я создал этот пример POM-файла, так что мне не нужны версии зависимостей, реплицированные в каждом дочернем проекте. Мое требование состоит в том, что сторонняя версия не должна предоставляться для каждого проекта. Каждый проект должен наследовать версии библиотек из файла bom. Я создал пример на основе документации зависимостей Maven. Моя версия maven: Apache Maven 3.2.5.

Я получаю ошибку ниже

[INFO] Scanning for projects...
[ERROR] The build could not read 1 project -> [Help 1]
[ERROR]   
[ERROR]   The project org.test.testapp:test-app:1.0-SNAPSHOT (/Users/skoya/workspace/test-app/pom.xml) has 2 errors
[ERROR]     'dependencies.dependency.version' for junit:junit:jar is missing. @ line 22, column 17
[ERROR]     'dependencies.dependency.version' for commons-cli:commons-cli:jar is missing. @ line 26, column 17

корневой файл bom 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/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>

        <groupId>org.test</groupId>
        <artifactId>bom</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>pom</packaging>
        <name>test-dependencies-bom</name>
        <url>http://myorg.org</url>

        <properties>
                <commons-cli.version>1.3</commons-cli.version>
                <junit.version>3.8.1</junit.version>
        </properties>

        <modules>
            <module>test-dependencies</module>
        </modules>
</project>

тест-зависимости/pom.xml

<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/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>

        <groupId>org.test</groupId>
        <artifactId>test-parent-pom</artifactId>  
        <version>0.0.1-SNAPSHOT</version>
        <packaging>pom</packaging>

        <name>test-parent-pom</name>
        <url>http://maven.apache.org</url>
        <parent>
                <groupId>org.test</groupId>
                <artifactId>bom</artifactId>
                <version>0.0.1-SNAPSHOT</version>
        </parent>

        <prerequisites>
                <maven>3.0.0</maven>
        </prerequisites>


        <dependencies>
                <dependency>
                        <groupId>commons-cli</groupId>
                        <artifactId>commons-cli</artifactId>
                        <version>${commons-cli.version}</version>
                </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
                        <version>${junit.version}</version>
    </dependency>

        </dependencies> 
</project>

Файлы проекта Maven, ссылающиеся на файл bom

<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>org.test.testapp</groupId>
  <artifactId>test-app</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>test-app</name>
  <url>http://maven.apache.org</url>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.test</groupId>
        <artifactId>bom</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
    </dependency>
    <dependency>
      <groupId>commons-cli</groupId>
      <artifactId>commons-cli</artifactId>
    </dependency>
  </dependencies>
</project>

Ответы:


1

Есть 2 проблемы:

  1. Для импорта зависимостей импортированный проект pom (test-dependencies/pom.xml) должен определять зависимости для импорта в разделе <dependencyManagement>, а не только <dependencies>, как это было сделано в исходном образце.
  2. Проект, который импортирует этот pom, должен импортировать проект, объявляющий зависимости (test-dependencies/pom.xml), а не родительский pom.xml.

Я исправил это, внеся следующие изменения.

тест-зависимости/pom.xml

<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.test</groupId>
  <artifactId>test-parent-pom</artifactId>  
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
  <name>test-parent-pom</name>
  <url>http://maven.apache.org</url>

  <parent>
    <groupId>org.test</groupId>
    <artifactId>bom</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>

  <prerequisites>
    <maven>3.0.0</maven>
  </prerequisites>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>commons-cli</groupId>
        <artifactId>commons-cli</artifactId>
        <version>${commons-cli.version}</version>
      </dependency>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit.version}</version>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>

Файлы проекта Maven, ссылающиеся на файл bom

<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>org.test.testapp</groupId>
  <artifactId>test-app</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>test-app</name>
  <url>http://maven.apache.org</url>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.test</groupId>
        <artifactId>test-parent-pom</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
    </dependency>
    <dependency>
      <groupId>commons-cli</groupId>
      <artifactId>commons-cli</artifactId>
    </dependency>
  </dependencies>
</project>

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

mvn dependency:tree
...
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ test-app ---
[INFO] org.test.testapp:test-app:jar:1.0-SNAPSHOT
[INFO] +- junit:junit:jar:3.8.1:compile
[INFO] \- commons-cli:commons-cli:jar:1.3:compile

Обратите внимание, что он по-прежнему успешно извлекает номера версий, определенные в свойствах, из родительского файла pom.xml. Это совершенно правильный способ структурировать проект. Это просто нуждалось в 2 корректировках, которые я описал.

23.01.2017
  • Спасибо. Теперь это работает. Не правильно прочитал часть управления зависимостями в родительском файле pom.xml. 24.01.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..