从 Maven 中查找主机名

Posted

技术标签:

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

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

这不适用于所有环境:

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

有什么建议吗?

【问题讨论】:

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

以上是关于从 Maven 中查找主机名的主要内容,如果未能解决你的问题,请参考以下文章

Python 从 IP 查找主机名,超时 1 秒

AIX如何获取主机名

我可以使用客户端 Javascript 执行 DNS 查找(主机名到 IP 地址)吗?

如何在 JAVA 中设置主机名?

为啥 PHP docker 容器无法查找 MYSQL 容器的主机名?

Docker Compose 主机名 DNS 查找失败