2016-05-14 5 views
1

File.isDirectory()の引数として提供されるパスが使用して、ディレクトリであることを確認:ANTを介して実行するとAntとIが作るためにチェック成分を含む<code>ant</code>介してテストランを有する

File dir = new File(path); 
if (!dir.isDirectory()) { 
     System.err.println("Invalid directory "+path+"."); 

タスク:testDir相対パスを含む位置プロパティがある

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

は、コンポーネントが絶対(しかし正しい)パスを反映する「無効なディレクトリ」メッセージで失敗。

java -cp[yada] foo.bar -d /the/exact/same/absolute/pathを使用して同じ場所から直接実行すると、このような問題はありません。

私はかなりアリに慣れていて、ここにsome permission I have to grantがあるとしますか?

注こと:

  • ${testDir}がサブディレクトリ、すなわち、それはプロジェクトツリーの外にまでは至らない。
  • ${testDir}の絶対パスおよびその中のすべてのコンポーネントは、世界中で可読ですです。

答えて

0

testDirが相対パスであれば、それはデフォルトではuser.dirシステムプロパティを使用して解決されます。素早い解決策が親ディレクトリにantで実行されます。

javaタスクが実行されている場合は、dirを追加して現在のディレクトリを指定することもできます。

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

メッセージ次取得する場合の属性fork="true"が必要となります。同じJVMを使用する場合は無視

[javaの]作業ディレクトリ。

+0

* "testDirが相対パスの場合、デフォルトでシステムプロパティuser.dirを使用して解決されます。" * - >質問に明示されているように、これはまさに何が起こっているか、そして私が望むものです。アプリケーションによって報告されたディレクトリは**絶対** **しかし正しい**パス**に解決されます**もし文字通り 'java [...]/exact /同じ/絶対/パス 'それは大丈夫です。私は 'fork 'を使ってこのことから私を取り除くかもしれないことに気がついていますが、それは価値があるよりも多くの制限を作ります。その時点で、私は1行のシェルラッパーからテストを実行するかもしれません。 – delicateLatticeworkFever

+0

さらにポイントを明確にするために、 '$ {testDir}'をリテラルと絶対パスに置き換えると、私は同じ結果になります。さらに、 'fork = true'の*の両方の場合に発生します。フォークが私を救うのは、 'org.apache.tools.ant.ExitException:'(is java.lang.RuntimePermission "" exitVM ")が許可されていないということです。失敗する) - これは、私のことをantのパーミッションという概念全体に変えた理由であり、なぜ私がこれを推測するのかは、それに関係しています。コンポーネントは正しいパスを持っています。単にそれを読むことができません。 – delicateLatticeworkFever

+0

'main'メソッドは引数' -d $ {testDir} 'をどのように扱い、それを変数' path'に設定しますか?私のテスト中に、自分のプログラムが入力変数を変更せずに '$ {testDir} 'を取得したい場合は、' ' build.xml。 –

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"のアプリケーションを実行しようとすると、もちろん同じエラーが発生します。この場合、絶対パスを探しているわけではありません。スペース文字で始まる相対パスを探しています(エラーメッセージの不正な引数に引用符を使用した場合、これは明らかです)。

しかし、これは明らかに「例」の下に述べてそれexplicitly contradicts the documentation、という意味でアリバグです:

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

は、空白文字を含む単一のコマンドライン引数ですコマンド "-l"と "-a"を区別するのではありません。

build.xmlでは、-d ${testDir}にスペースが1つしかありません。私は-d${testdir}を試しました。コマンドラインパーサー(org.apache.commons.cli)はそれを受け入れるためです。それが詰まるのは-d " /whatever/path"です。

だから、アリは、の引数で、"-d"、および" /home/devel/project..."を渡し、${testDir}を解決しています。もしこれが、antがどのように変数を置き換えるかの微妙なものだったら、私は大丈夫、「バグのような」と言っていますが、文書化された例に例外を与える潜在的な警告があるので、それはちょっとした問題です。代わりに、変数のリテラルパスを使用して

しかし

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

が同じ問題につながる:

Invalid directory test/serverconf 
       ^^ 

そして再び明確にするために、相対パスは、ここに正常に動作しますjava foo.bar.Serverは、ant targetと同じディレクトリから実行されます。しかし、-d " test/serverconf"を使用した場合、ユーザは引用符を使用してそのようなスペースを含めることが許可されるべきであるからです。

したがって、ドキュメント内のarg valueに関する文は偽です。 Antはではありません。では、「スペースを含む単一のコマンドライン引数」として渡されます。それはと2つのという引数を通し、2番目の引数のスペースも含めます。

関連する問題