我通过ant
进行了测试运行,其中包含一个组件,该组件检查以确保作为参数提供的路径是一个目录,使用:
File dir = new File(path);
if (!dir.isDirectory()) {
System.err.println("Invalid directory "+path+".");
通过ant任务运行时:
<java
classname="foo.bar"
classpath="${classpath}"
>
<arg value="-d ${testDir}"/>
如果testDir
是包含相对路径的位置属性,则该组件将失败并显示&#34;无效目录&#34;反映绝对(但正确)路径的消息。
使用java -cp[yada] foo.bar -d /the/exact/same/absolute/path
直接从同一位置s ant运行时,没有这样的问题。
我对蚂蚁很陌生并假设这里有some permission I have to grant?
请注意:
${testDir}
是一个子目录,即它不会超出项目树。${testDir}
及其中所有组件的绝对路径世界可读。答案 0 :(得分:1)
如果testDir
是相对路径,默认情况下将使用系统属性 user.dir 解析。在父目录中运行ant
快速解决方案。
您还可以添加dir
以在 java任务运行时指定当前目录。
<java
classname="foo.bar"
classpath="${classpath}"
dir="${parentDir}"
fork="true"
>
<arg value="-d ${testDir}"/>
如果您收到以下消息,则需要属性fork="true"
:
[java]使用相同的JVM时忽略工作目录。
答案 1 :(得分:0)
我注意到一些有趣的东西更贴近输出。项目目录是/home/devel/project/
(但是注意/home/devel
不是普通的主目录; devel
只是一个组,该目录是世界可读,也是可写的由执行用户)。 ${testDir}
是(再次)相对路径test/serverconf
,然后ant正确地解析为`/ home / devel / project / test / serverconf。
但这是我在组件的错误中注意到的:
Invalid directory /home/devel/project/test/serverconf.
^^
那里有两个空格,而错误消息本身只产生一个空格。如果我尝试运行应用程序java foo.bar.Server -d " /home/devel/project/test/serverconf"
,我当然会得到同样的错误。在这种情况下,它没有寻找绝对路径,它正在寻找以空格字符开头的相对路径(如果我在错误消息中使用错误arg上的引号,这会已经很清楚了。)
然而,这是一个蚂蚁错误,因为它explicitly contradicts the documentation,明确说明了&#34;示例&#34;:
<arg value="-l -a"/>
是包含空格字符的单个命令行参数,而不是单独的命令&#34; -l&#34;和&#34; -a&#34;。
在build.xml
中,-d ${testDir}
中只有一个空格。我试过-d${testdir}
,因为命令行解析器(org.apache.commons.cli)会接受它。它会阻碍的是-d " /whatever/path"
。
因此,ant正在解析${testDir}
,然后在"-d"
和" /home/devel/project..."
中传递两个参数。如果这只是蚂蚁如何替代变量的一个微妙之处,我会说好的,&#34;类似bug的&#34;但由于存在一个潜在的警告,它为记录的例子提供了一个例外,它只是一个问题。
但使用文字路径而不是变量:
<arg value="-d test/serverconf">
导致同样的问题:
Invalid directory test/serverconf
^^
再次清楚,当java foo.bar.Server
从与ant target
相同的目录运行时,相对路径将正常工作。但是如果使用-d " test/serverconf"
则不行,因为应允许用户使用引号并包含空格。
因此,文档中关于arg value
的声明是错误的。 Ant 不将其传递为&#34;包含单个命令行参数一个空间&#34;。它通过两个参数传递它,并在第二个参数中包含空格。
去图。