私はそれを行う1つの方法を見つけましたが、少し安っぽいです。
まず、次のヘルパー クラスをプロジェクトに追加します。
// other imports
import com.google.appengine.tools.development.DevAppServerMain;
public class DevServer {
public static void launch(final String[] args) {
Logger logger = Logger.getLogger("");
logger.info("Launching AppEngine server...");
Thread server = new Thread() {
@Override
public void run() {
try {
DevAppServerMain.main(args); // run DevAppServer
} catch (Exception e) { e.printStackTrace(); }
}
};
server.setDaemon(true); // shut down server when rest of app completes
server.start(); // run server in separate thread
URLConnection cxn;
try {
cxn = new URL("http://localhost:8888").openConnection();
} catch (IOException e) { return; } // should never happen
boolean running = false;
while (!running) { // maybe add timeout in case server fails to load
try {
cxn.connect(); // try to connect to server
running = true;
// Maybe limit rate with a Thread.sleep(...) here
} catch (Exception e) {}
}
logger.info("Server running.");
}
}
次に、エントリ クラスに次の行を追加します。
public static void main(String[] args) {
DevServer.launch(args); // launch AppEngine Dev Server (blocks until ready)
// Do everything else
}
最後に、適切な実行構成を作成します。
- [Run As] -> [Web Application] をクリックするだけです。デフォルトの実行構成を作成するには。
- 作成した実行構成の [メイン] タブで、デフォルトの [com.google.appengine.tools.development.DevAppServerMain] ではなく、独自のエントリ クラスを [メイン クラス] として選択します。
ここで、この実行構成を起動すると、最初に AppEngine サーバーが起動され、次にmain(...)
エントリ クラスの残りのメソッドが続行されます。サーバー スレッドはデーモン スレッドとしてマークされているため、他のコードがmain(...)
完了すると、アプリケーションは正常に終了し、サーバーもシャットダウンします。
これが最もエレガントなソリューションかどうかはわかりませんが、機能します。他の誰かがDevServer
ヘルパー クラスなしでこれを達成する方法を持っている場合は、投稿してください。
また、上記のように URL 接続で ping を実行する以外に、AppEngine サーバーが実行されているかどうかを確認するより洗練された方法があるかもしれません。
注: AppEngine Dev Serverは、 AppEngine のURL フェッチインフラストラクチャに自動的にマップするために、独自のものを登録しURLStreamHandlerFactory
ます。これは、クライアント コードで使用すると、url-fetch 機能が欠落しているというエラーが発生することを意味します。幸いなことに、これは次の 2 つの方法で修正できます: Java のデフォルトの http(s) URLStreamHandler への参照を取得します。Http(s)URLConnections
HttpURLConnections