如何获取settings.xml中定义的服务器的值以在我的pom.xml中使用它们?

时间:2009-10-13 09:42:37

标签: maven-2 properties

我知道我可以使用属性检索一些 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}

但他们都没有工作......


关于这个page,这是不可能的。但是,由于这是一个没有正确记录的功能,我仍然希望以这种方式做到这一点......

5 个答案:

答案 0 :(得分:12)

如果您使用的是Maven 3+,可以使用servers-maven-extension来实现。注册后,可以使用$ {settings.servers.server。&lt; server id&gt;。&lt; property&gt;}(例如$ {settings.servers.server.server-dev.username})引用settings.xml / servers内容。

披露:我是该项目的维护者。

答案 1 :(得分:4)

我认为这是不可能的,并且相信暴露这些属性的价值是个坏主意。

<击>

正如Settings Reference中所述,<servers>settings.xml的要点是不分发username或{{}}等值{1}}以及password。因此,暴露属性以从任何地方读取它们只会破坏这一原则并且可能是一个安全问题。

编辑:我在想这个以及我说的不是真的。

AFAIK,Maven不公开设置中定义的服务器的pom.xmlusername属性和/或提供类似于OP描述的机制。 但是能够从password访问它们并不是错误的。

如上所述,正如Rich指出的那样,Maven API允许您访问设置中定义的服务器(请参阅org.apache.maven.settings.Settings#getServer(String serverId)),因此必须可以从Mojo设置属性(即在自定义插件中)

但我实际上并不确定你正在尝试做什么,也许使用pom.xml和配置文件将是一个更好的方法。处理公共环境属性(但具体值)是配置文件的一个很好的用例。查看 Maven:The Definitive Guide 一书中的11.5.1. Common Environments11.5.2 Protecting Secrets章节。

答案 2 :(得分:1)

我不知道一个简单的方法。但是你可以编写一个小插件并将其绑定到早期阶段,然后从插件中访问设置值,并直接在插件中使用它们,或者将它们作为属性公开。

您可以查看nexus-maven-plugin的来源,以及如何通过查看properties-maven-plugin

来设置这些值,从而了解如何从设置中读取值

答案 3 :(得分:0)

可能性1 将使用GMaven plugin。您可以轻松访问服务器设置,如:

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

然后将其放入公共属性

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

在以下阶段中,您可以像往常一样从POM访问属性:

${srvuser}

可能性2 将在settings.xml中定义属性,如here所示。它不是从服务器设置中获取的,而是来自某些基于配置文件的属性。

无论如何我发现默认情况下Maven应该提取所有服务器设置。

答案 4 :(得分:0)

如下所述:

Sonatype: Complete Reference 5.5.2

最好的方法是:

<settings>
    <profiles>
        <profile>
            <activeByDefault>true</activeByDefault>
            <properties>
                <environment.type>prod</environment.type>
                <database.password>m1ss10nimp0ss1bl3</database.password>
            </properties>
        </profile>
    </profiles>
</settings>