Ant和File.isDirectory()

时间:2016-05-14 17:02:52

标签: java ant

我通过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}及其中所有组件的绝对路径世界可读

2 个答案:

答案 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;。它通过两个参数传递它,并在第二个参数中包含空格。

去图。