8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JavaのRuntime.exec()をWindowsで使った場合、拡張子がexe以外のファイルはファイル名だけでは起動できない

Posted at

#ことの起こり
ant の exec タスクを使っていたところ、 notepad は起動できるけど groovyConsole は起動できないという現象が発生。

色々ためしていたら、 groovyConsolegroovyConsole.bat にしたら起動できた。

#原因
調べてたら、 Ant のマニュアル にそれっぽい記述を見つける。

The task delegates to Runtime.exec which in turn apparently calls ::CreateProcess. It is the latter Win32 function that defines the exact semantics of the call. In particular, if you do not put a file extension on the executable, only ".EXE" files are looked for, not ".COM", ".CMD" or other file types listed in the environment variable PATHEXT.

exec タスクは Runtime.exec() を使っているが、それは最終的に CreateProcess という Windows の関数を使用している。
この CreateProcess は、拡張子を省略した場合 PATHEXT で指定している他の拡張子を全て無視して、 .EXE のファイルしか解決してくれないらしい。

このため、 Runtime.exec() メソッドを使った場合、たとえパスを通していても .bat などの非 exe ファイルはファイル名だけで起動することができない。

今回遭遇したケースでは、 notepadnotepad.exe だからファイル名だけで起動できたが、 groovyConsolegroovyConsole.bat しかなかったのでファイル名だけでは起動できなかった。

#Gradle の Exec も同じ
Gralde の Exec も同じ現象が発生する。

#参考

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?