从 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 中查找主机名的主要内容,如果未能解决你的问题,请参考以下文章
我可以使用客户端 Javascript 执行 DNS 查找(主机名到 IP 地址)吗?