2012年6月5日火曜日

GAEのローカル実行時にJettyのプロセスを終了させて確実に起動させる方法

Google Apps EngineをAntで実行したのですがマニュアル通りにやってもJettyのjava.exeのプロセスが残ったままだったので利用しているポート番号からJettyのプロセスを終了させてからJettyを起動するようにするとうまくいきました。

 build.xmlのrunserverタスク部分
<target depends="datanucleusenhance" description="Starts the development server." name="runserver">
  <exec executable="kill-jetty.bat">
    <dev_appserver port="8888" war="war">
    </dev_appserver>
  </exec>
</target>
kill-jetty.bat
FOR /F "tokens=5 delims= " %P IN ('netstat -a -n -o ^| findstr :8888') DO TaskKill.exe /F /PID %P
他にもっと簡単な方法があるのか分からないがこういうノウハウがあまりないのはなんでだろうか?というかTOMCATだとデプロイするだけで自動的にアプリケーションをロードしてくれるからこんなことは考えなくてもよかったりする。

参考
 Google Apps Engine - Apache Ant の使用
 GAE/J の開発で ant を使うと java.exe プロセスが残る [NT]
 Kill a Process by Looking up the Port being used by it from a .BAT

追記(2013/1/27)

macでも試したところ同じようにjettyのプロセスが残っていたので起動時に一旦プロセスを削除する処理を書いてみました。ポート番号からプロセスをkillする処理が割と簡単に書けました。

<target name="runserver" depends="compile"
    description="Starts the development server.">
   <exec executable="/bin/bash">
      <arg value="kill-jetty.sh"/>
   </exec> 
   <dev_appserver war="war" port="8888"/>
</target>
kill-jetty.sh
kill -9 `lsof -a -t -i:8888 -c java`