有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaAnt和文件。isDirectory()

我通过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是一个包含相对路径的位置属性时,组件会出现“Invalid directory”消息,该消息反映了绝对(但正确)路径

当使用java -cp[yada] foo.bar -d /the/exact/same/absolute/path直接从同一位置运行sans-ant时,不存在这样的问题

我对ant很陌生,我想这里有some permission I have to grant

请注意:

  • ${testDir}是一个子目录,也就是说,它不会从项目树中引出
  • ${testDir}的绝对路径和其中的所有组件都是世界可读的

共 (2) 个答案

  1. # 1 楼答案

    如果testDir是一个相对路径,则将使用系统属性用户来解析它。默认情况下为dir。快速解决方案是在父目录中运行ant

    java任务运行时,还可以添加dir来指定当前目录

    <java
        classname="foo.bar"
        classpath="${classpath}"
        dir="${parentDir}"
        fork="true"
    >
        <arg value="-d ${testDir}"/>
    

    如果收到以下消息,则需要属性fork="true"

    [java] Working directory ignored when same JVM is used.

  2. # 2 楼答案

    我注意到一些有趣的东西,更仔细地观察输出。项目目录是/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",当然会出现同样的错误。在本例中,它不是寻找一个绝对路径,而是寻找一个以空格字符开头的相对路径(如果我在错误消息中的坏参数上使用引号,这一点就很清楚了)

    然而,这是一个蚁虫,因为它explicitly contradicts the documentation,在“示例”下明确指出:

    <arg value="-l -a"/>

    is a single command-line argument containing a space character, not separate commands "-l" and "-a".

    build.xml中,-d ${testDir}中只有一个空格。我尝试了-d${testdir},因为命令行解析器(org.apache.commons.cli)会接受这两种方式。它会窒息的是-d " /whatever/path"

    所以ant解析${testDir},然后在"-d"" /home/devel/project..."中传递两个参数。如果这只是ant如何替换变量的一个微妙之处,我会说“类似于bug”,但由于存在一个潜在的警告,它为记录的示例提供了一个例外,这只是一个问题

    但是使用文本路径而不是变量:

    <arg value="-d test/serverconf">
    

    导致了同样的问题:

    Invalid directory  test/serverconf
                     ^^
    

    再说一次,当java foo.bar.Server从与ant target相同的目录运行时,相对路径在这里可以正常工作。但是如果使用-d " test/serverconf"就不会,因为应该允许用户以这种方式使用引号并包含空格

    所以文档中关于arg value的陈述是错误的Ant是而不是将其作为“包含空格的单个命令行参数”传递的。它将其作为两个参数传递,并将空格包含在第二个参数中

    想想看