Maven не заменяет переменную в файле «settings.xml» при ее вызове - PullRequest
7 голосов
/ 01 сентября 2009

Я определил локальное зеркало для всех репозиториев в файле settings.xml:

<mirror>
  <id>myMirror</id>
  <mirrorOf>*</mirrorOf>
  <url>file://${mypath}/maven/.m2/repository</url>
</mirror>

Я хочу, чтобы мое зеркало указывало на локальный путь, в этом случае путь:

file://${mypath}/maven/.m2/repository

Где $ {mypath} - это переменная, которую я передаю при вызове Maven:

 mvn -Dmypath="/D:/test" package

Проблема в том, что Maven не заменяет переменную при ее вызове. Я вижу, что эта ошибка происходит путем проверки журнала сборки. Например, Maven сообщает, что загружает файл из файла: // $ {mypath} /maven/.m2/repository, когда правильным будет файл: /// D: /test/maven/.m2/repository.

Я также отметил, что Maven правильно заменяет мою переменную, когда она вставляется в дочерний тег url тега репозитория:

<repository>
        <id>central</id>
        <url>http://${mypath}/maven/.m2/repository</url>
</repository>

Сборка работает правильно, когда я заменяю переменную в файле settings.xml на полный URL-адрес, как показано в следующем примере:

<mirror>
        <id>myMirror</id>
        <mirrorOf>*</mirrorOf>
        <url>file:///D:test/maven/.m2/repository</url>
</mirror>

Ответы [ 4 ]

11 голосов
/ 06 сентября 2009

Подстановка свойства в settings.xml не работает так, как вы ожидаете.

Он будет заменять свойства внутри элемента профилей (как вы видели, он заменяет ваш URL-адрес хранилища, который будет определен внутри профиля), но не на элементы вне профилей (как вы видели, что происходит в зеркалах). раздел). Это различие сделано потому, что элемент профиля в файле settings.xml является усеченной версией элемента профиля pom.xml. Это механизм, позволяющий устанавливать конфигурацию в вашем POM, поэтому подстановка свойств в элементах профилей разрешена, поскольку они фактически являются частью POM.

Части настроек вне элемента profile представляют конфигурацию платформы, на них не должны влиять отдельные сборки, поэтому они не заменяют свойства командной строки. Это имеет смысл, но в действительности нигде не ясно.

РЕДАКТИРОВАТЬ: в страница настроек документации mavens, в последнем предложении раздела быстрого обзора (довольно скрыто) говорится:

Обратите внимание, что свойства, определенные в профилях в файле settings.xml, нельзя использовать для интерполяции.


Существует обходной путь, однако вы можете подставить переменные среды в файл settings.xml. Если вы установите переменную среды:

set M2_MIRROR=D:\test

и настройте URL хранилища следующим образом:

<url>file://${M2_MIRROR}/maven/.m2/repository</url>

Затем вызовите Maven как обычно, переменная окружения подставляется, и ваша сборка должна работать как требуется.

3 голосов
/ 07 мая 2013

Это старый вопрос сейчас, но начиная с Maven 3 и, возможно, раньше, вы можете ссылаться на переменные окружения, если вы используете префикс 'env'

Мне так нравится:

  <localRepository>${env.M2_LOCAL_REPO}</localRepository>

Затем каждый разработчик устанавливает M2_LOCAL_REPO в соответствующем месте.

1 голос
/ 01 сентября 2009

Файл settings.xml не интерполируется, как pom, поэтому свойство нельзя использовать, как показано выше.

0 голосов
/ 01 сентября 2009

Вероятно, это ошибка - к сожалению, замена свойств не выглядит согласованной в плагинах Maven. Я сам столкнулся с ошибкой, связанной с указанием более двух свойств в элементе конфигурации в другом плагине.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...