【问题标题】:Look up hostname from Maven从 Maven 中查找主机名
【发布时间】:2011-11-18 11:14:19
【问题描述】:

我正在寻找一种方法来查找主机名并将其设置为 Maven 中的属性。

这不适用于所有环境:

...
<properties>
   <hostname>${env.HOSTNAME}</hostname>
</properties>
...

有什么建议吗?

【问题讨论】:

  • 您需要在实际构建中还是仅在 CI 环境中使用它?
  • 我想过滤测试属性文件,将 ${hostname} 替换为运行它的主机名。这对于本地构建和 CI 环境很有用。对于“真实”构建,属性文件中的主机名是硬编码的。这是为了确保属性文件适用于正确的环境。
  • 为什么不为您需要的每个环境创建工件,而不是让构建环境依赖?这个怎么样:blog.soebes.de/index.php?/archives/…
  • 这将要求每个开发人员都有自己的配置并手动添加他们的主机名。生成的工件不依赖于环境。相同的二进制文件部署到任何环境。在每个环境中,我都有一个带有“秘密”密码的属性文件,不应将其签入源代码控制或存在于其他环境中。当开发人员出于测试目的在本地构建时,我希望构建能够基于过滤属性文件为本地环境生成适当的属性文件,用 pom 中的属性替换占位符。

标签: maven properties environment-variables localhost pom.xml


【解决方案1】:

使用 groovy 脚本设置项目属性

    <plugin>
        <groupId>org.codehaus.groovy.maven</groupId>
        <artifactId>gmaven-plugin</artifactId>
        <executions>
            <execution>
                <phase>generate-resources</phase>
                <goals>
                    <goal>execute</goal>
              </goals>
               <configuration>
                  <source>
                  project.properties["hostname"] = InetAddress.getLocalHost().getHostName()
                 </source>
             </configuration>
         </execution>
      </executions>
 </plugin>

【讨论】:

  • 很难相信 Maven 不能以任何其他方式公开此信息。不过,不错的 hack。您知道其他通常以这种方式设置的属性吗?
  • @cwash 黑客?同意。对于 Maven 无法作为系统或环境属性使用的信息项,它是必需的。见:books.sonatype.com/mvnref-book/reference/…
  • 请记住,一个主机可能有不同的名称/IP地址/接口,因此主机名称没有唯一可用的属性。我不确定 InetAdress.getLocalHost() 在这种情况下会做什么。当然,对于开发机器,大多数时候情况并非如此。
  • 你是如何使用这个的?我在 build > plugingManagement > plugins 中有那个插件。够了吗?之后我可以在属性中使用${hostname} 吗?
  • 是的,您可以使用 ${hostname}
【解决方案2】:

${env.COMPUTERNAME} 对我有用..

【讨论】:

  • 虽然我猜这是特定于 Windows 的
【解决方案3】:

Maven Build Helper 插件 3.1.0 刚刚发布,目标是获取主机名、IP 地址、端口保留等 (http://www.mojohaus.org/build-helper-maven-plugin/usage.html)。

添加这个来构建插件:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>3.1.0</version>
    <executions>
        <execution>
            <id>init-build-properties</id>
            <goals>
                <goal>hostname</goal>
            </goals>
            <configuration>
                <hostnameProperty>my.hostname</hostnameProperty>
            </configuration>
        </execution>
    </executions>
</plugin>

【讨论】:

    【解决方案4】:

    我最终得到了一个跨平台问题的简单解决方案:

    <manifestEntries>  
        <Build-Host-Linux>${env.HOSTNAME}</Build-Host-Linux>
        <Build-Host-Windows>${env.COMPUTERNAME}</Build-Host-Windows>
    </manifestEntries>
    

    【讨论】:

    • 这很奇怪。 RHEL6 可以。你确定你有 env.HOSTNAME 而不仅仅是 HOSTNAME?
    【解决方案5】:

    user1885834 发布的评论对我来说效果最好:为 Windows 和 Linux 创建配置文件并使用各自的环境变量定义一个新属性 ${hostname},以便在任何地方使用。

    <profile>
       <id>unix</id>
       <activation>
          <os>
             <family>unix</family>
          </os>
       </activation>
       <properties>
          <hostname>${env.HOSTNAME}</hostname>
       </properties>
    </profile>
    <profile>
       <id>windows</id>
       <activation>
          <os>
             <family>Windows</family>
          </os>
       </activation>
       <properties>
          <hostname>${env.COMPUTERNAME}</hostname>
       </properties>
    </profile>
    

    【讨论】:

    • 只有在 RedHat 上没有定义 HOSTNAME :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 2013-01-31
    • 2010-10-14
    • 1970-01-01
    相关资源
    最近更新 更多