私は出力をより詳しく見て興味深いことに気付きました。プロジェクトディレクトリは/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番目の引数のスペースも含めます。
* "testDirが相対パスの場合、デフォルトでシステムプロパティuser.dirを使用して解決されます。" * - >質問に明示されているように、これはまさに何が起こっているか、そして私が望むものです。アプリケーションによって報告されたディレクトリは**絶対** **しかし正しい**パス**に解決されます**もし文字通り 'java [...]/exact /同じ/絶対/パス 'それは大丈夫です。私は 'fork 'を使ってこのことから私を取り除くかもしれないことに気がついていますが、それは価値があるよりも多くの制限を作ります。その時点で、私は1行のシェルラッパーからテストを実行するかもしれません。 – delicateLatticeworkFever
さらにポイントを明確にするために、 '$ {testDir}'をリテラルと絶対パスに置き換えると、私は同じ結果になります。さらに、 'fork = true'の*の両方の場合に発生します。フォークが私を救うのは、 'org.apache.tools.ant.ExitException:'(is java.lang.RuntimePermission "" exitVM ")が許可されていないということです。失敗する) - これは、私のことをantのパーミッションという概念全体に変えた理由であり、なぜ私がこれを推測するのかは、それに関係しています。コンポーネントは正しいパスを持っています。単にそれを読むことができません。 – delicateLatticeworkFever
'main'メソッドは引数' -d $ {testDir} 'をどのように扱い、それを変数' path'に設定しますか?私のテスト中に、自分のプログラムが入力変数を変更せずに '$ {testDir} 'を取得したい場合は、' ' build.xml。 –