Как получить значения сервера, определенные в settings.xml, чтобы использовать их в моем pom.xml?

Я знаю, что могу получить некоторые параметры settings.xml, используя свойства, например, например, ${settings.localRepository}чтобы определить местоположение локального репозитория.

Теперь представьте, что мой файл settings.xml содержит следующее определение сервера:

<servers>
    <server>
        <id>server-dev</id>
        <username>devuser</username>
        <password>devpass</password>
    </server>
    <server>
        <id>server-hom</id>
        <username>homuser</username>
        <password>hompass</password>
    </server>
</servers>

Есть ли способ, учитывая idсервер для получения значения любого параметра? Например, что-то вроде ${settings.servers.server.server-dev.username}бы вернулось devuser.

Я уже пробовал следующее:

${settings.servers.server.server-dev.username}
${settings.servers.server-dev.username}
${settings.servers.server[server-dev].username}
${settings.servers[server-dev].username}

но никто из них не работал ...


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

13.10.2009 09:42:36
5 ОТВЕТОВ
РЕШЕНИЕ

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

Как объясняется в Справочнике по настройкам , смысл <servers>в том settings.xml, чтобы не распространять значения, такие как usernameили passwordвместе с pom.xml. Таким образом, предоставление свойств для чтения их из любого места просто нарушит этот принцип и может стать проблемой безопасности.

РЕДАКТИРОВАТЬ: я снова думаю об этом, и то, что я сказал, не соответствует действительности.

AFAIK, Maven не подвергать usernameи passwordсвойство сервера , определенный в настройках и / или обеспечивает механизм , аналогичный тому , что описано ОП. Но было бы неправильно иметь доступ к ним из pom.xml.

Сказав это, как указал Рич, API Maven предоставляет вам доступ к серверам, определенным в настройках (см. Org.apache.maven.settings.Settings # getServer (String serverId) ), поэтому должна быть возможность устанавливать свойства из Mojo. (т.е. в пользовательском плагине).

Но я на самом деле не уверен, что именно вы пытаетесь сделать, и, возможно, <properties>лучше использовать профили. Работа с общими свойствами среды (но с конкретными значениями) - хороший пример использования профилей. Проверьте главы 11.5.1. Общие Среды и 11.5.2 Защита секретов о Maven: The Definitive Guide книги.

4
13.10.2009 17:48:50
В общем, я согласен, но есть варианты использования для доступа к ним в рамках сборки, как показано в nexus-maven-plugin
Rich Seller 13.10.2009 10:27:09
По состоянию на март 2019 года ваша ссылка на класс «Настройки» в Maven API не работает.
DiegoAlfonso 8.03.2019 16:47:58

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

Вы можете увидеть, как читать значения из настроек, посмотрев на источник nexus-maven-plugin , и как их установить, посмотрев на свойства-maven-plugin

1
13.10.2009 09:59:52

Возможность 1 будет использовать плагин GMaven . Вы можете легко получить доступ к настройкам сервера, как:

<source>
    def server = settings.servers.find{ it.id.equals('server-hom') }

а затем положить его в общие свойства

    project.properties.srvuser = server.username
</source>

На следующих этапах вы не можете получить доступ к свойствам из POM, как всегда:

${srvuser}

Возможность 2 будет определять свойства в файле settings.xml, как показано здесь . Он берется не из настроек сервера, а из некоторых свойств профиля.

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

0
28.06.2012 10:02:00

Если вы используете Maven 3+, это может быть достигнуто с помощью server-maven-extension . После регистрации на содержимое settings.xml / servers можно ссылаться с помощью $ {settings.servers.server. <Идентификатор сервера>. <Property>} (например, $ {settings.servers.server.server-dev.username}).

Раскрытие информации: я поддерживаю проект.

12
3.04.2013 09:14:21
Имейте в виду, что это предоставляет имена пользователей и учетные данные всем, кто может видеть журнал любой сборки, которая была запущена с loglevel при отладке. Я работаю в финтех индустрии, и это большая нет-нет. (Стэнли, можешь ли ты интегрировать эту информацию в свой ответ?)
toolforger 16.07.2018 16:40:42

Как описано в:

Sonatype: полная ссылка 5.5.2

Лучший способ это:

<settings>
    <profiles>
        <profile>
            <activeByDefault>true</activeByDefault>
            <properties>
                <environment.type>prod</environment.type>
                <database.password>m1ss10nimp0ss1bl3</database.password>
            </properties>
        </profile>
    </profiles>
</settings>
0
16.03.2015 20:43:31