我很难找到如何在ant目标中正确使用args。
我有一个ant目标,"our-client",它应该有两个(或零)参数,一个主机和一个端口供客户端侦听。我认为通过输入
将参数传递给shell会很容易:ant our-client -Dhost.arg=127.0.0.1 -Dport.arg=8081
这似乎不起作用。在我的程序的main函数中,我有一个记录器,它打印传入的主机和端口。在我解释我的ant构建文件中有什么之后,我将得到它。
这是我为客户端编写的目标。
<target name="our-client" depends="package" description="compiles, packages, and runs the student client">
<java jar="${java.dist}/catan-client.jar" dir="${java.dist}" fork="yes">
<arg value="${host.arg}"/>
<arg value="${port.arg}"/>
<sysproperty key="com.sun.management.jmxremote" value=""/>
<assertions>
<enable/>
</assertions>
</java>
</target>
我似乎不能理解的部分是这些"参数"是如何工作的。在ant构建文件的顶部,我定义了这两个属性,如下所示:
<property name="port.arg" value="8081"/>
<property name="host.arg" value="localhost"/>
我这样做是为了这个特定目标的参数是可选的。如果没有提供,它将在默认设置下运行。
回到程序的主函数。无论我在命令行中输入什么,主机总是被设置为localhost,端口也同样被设置为8081。下面是main函数
中的日志部分public static void main(final String[] args)
{
...
if (args.length == 2)
{
String host = args[0];
String port = args[1];
LOGGER.info("host: " + host + ", port: " + port);
}
...
}
命令行总是显示:
INFO: host: localhost, port: 8081
我想我一定是在ant命令调用中搞砸了什么。在我看来,它忽略了输入,并使用每个属性的默认值。
问题来自于使用PowerShell。虽然你的ant命令可以在命令提示符中工作,但它不能像在PowerShell中那样工作。在PowerShell中,如果参数名称中有一个句点("."),PowerShell将把它读取为其他内容(可能是另一个ant命令)。相反,试着这样做:
ant our-client "-Dhost.arg=127.0.0.1" "-Dport.arg=8081"