GAE/J の開発で ant を使うと java.exe プロセスが残る [NT]
Google App Engine の Java 版(ここでは GAE/J と表記する)の話。
GAE/J で Web アプリケーションを開発してサーバにアップロードする前に local で動作確認をすることを考える。
GAE/J では ant スクリプトが用意されていて、ant runserver と記述するとテスト用のサーバが起動する。起動したサーバを停止しようとして「CTRL-C」をタイプすると、ant は終了するが、プロセスを確認すると java.exe が残ったままになる。
この java.exe はサーバプロセスであり、内部的には jetty のようだ。
The Java Development Server - Google App Engine - Google Code によると、Running the Development Web Server 節で、
appengine-java-sdk\bin\dev_appserver.cmd [options] war-location
を実行してサーバを起動して、終了するときは
To stop the web server, press Control-C (on Windows, Mac or Linux).
とある。 Google の資料のように dev_appserver.cmd を利用した場合、CTRL-C でサーバは停止し、java.exe プロセスは残らない。しかし、ant runserver の場合はプロセスが残ってしまう。
もしかして、ant.bat/ant.cmd を実行しているのが問題なのかと思い、ant を java コマンドで起動してみた。ant を java コマンドで起動するには Running Apache Ant の解説を読むと良い。ant を java コマンドで起動した場合であっても runserver すると java.exe プロセスが残ってしまった。
runserver で動作しているサーバは内部的には jetty のようだ。jetty の場合は、Running Jetty-6.1.x - Jetty - Codehaus の Stopping にある操作をすると別のシェルから jetty を停止できる。
java - Java アプリケーション起動ツール などによると、java コマンドの -D オプションは JVM に対して与えるプロパティである。ant runserver から呼び出される ant-macros.xml に jetty の -D オプションを追加したが netstat -a で確認すると、STOP 用のポートは開かれない。
ant-macros.xml を解析すると com.google.appengine.tools.KickStart を呼び出しているので、直接 java コマンドで KickStart と -D オプションを付けてみたりもしたが、やはり STOP 用のポートは開かれない。STOP 用のポートは jetty の start.jar で処理しているのかもしれない。
結局、 dev_appserver を直接呼び出した場合はプロスセスが残らないので、ant との組み合わせの問題か、ant スクリプトの記述方法が問題なのかもしれない。dev_appserver の末端まで CTRL-C が通知できていない気がするんだよね~。
※私は Windows 2000 で動作確認しているので、他の環境では結果が異なるかもしれません。
[追記]このエントリには続きがあります。
そうですよね。私もWindowsXPで同様に困っていて、、結局Eclipseさんを入れました。。。
by tf0054 (2009-06-13 22:20)
tf0054 さんコメントありがとうございます。
このエントリには続きがあり、「追記」に記載しました。
私は、最終的に java プロセスを探して kill するスクリプトを ant の build.xml に追加して、とりあえず回避しました。ant stopserver みたいなコマンドを打つ必要はあるし、複数の java プロセスがある場合はまずいのですが...
by p2 (2009-06-13 23:58)