2009-09-01 2 views
7

Я определил локальное зеркало для всех хранилищ в файле settings.xml:Maven не заменить переменную в «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> 

ответ

11

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

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

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

EDIT: в the settings page из Mavens документации, в последнем предложении раздела быстрого обзора (довольно скрытый) говорится:

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


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

set M2_MIRROR=D:\test 

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

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

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

+1

Не предполагается ли это '$ {env.M2_MIRROR}'. – OrangeDog

0

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

1

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

+0

Да, это возможно. Как я уже сказал в вопросе, мне удалось вставить переменную в тег url, вложенный в тег репозитория. Обратите внимание, что этот тег репозитория, который я упомянул, находится внутри файла settings.xml, а не внутри файла pom. –

+0

Извините, я неправильно понял. Часть профиля интерполируется, но не все «базовые» настройки, например, не очень хорошо работают, если вы пытаетесь использовать свойство для своего локального репозитория. –

+0

Это правильно, но из вашего ответа неясно, почему вы не можете установить свойства за пределами элемента профилей, я попытался разработать с моим ответом –

2

Это старый вопрос сейчас, но по состоянию на Maven 3, и, возможно, до того, вы можете обратиться к среде вары, если префикс «env»

Я делаю это так:

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

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

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