0

これは非常に些細な質問かもしれませんが、答えを見つけるのに苦労しています:

Eclipse 用の Google プラグインを使用して、クラウド ストレージに AppEngine を使用する単純な古い Java アプリケーション (Web アプリケーションではない) を開発したいと考えています。

もちろん、このために単純に 2 つのプロジェクトを作成することもできます。1 つは AppEngine サーバーを含み、もう 1 つは Java アプリケーションを含みます。

しかし、サーバーとクライアントの両方のコードを含む単一のプロジェクトを Eclipse でセットアップすることが可能かどうか疑問に思っています (GWT プロジェクトの場合のように)。ローカル デバッグ用に実行するには、Eclipse で Tomcat を起動してサーブレットを使用できるようにし、プロジェクトが単純な Java アプリケーションであるかのように、プロジェクトのクライアント ディレクトリから Main.java を起動します。これは、「Google」->「Web アプリケーション」設定の「このディレクトリから起動してデプロイする」チェックボックスの目的ですか? もしそうなら、私はそれをどのように使用しますか?

4

2 に答える 2

1

私はそれを行う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)URLConnectionsHttpURLConnections

于 2013-07-19T11:58:33.797 に答える
0

どうしても appengine を使用したい場合は、2 つのプロジェクトを作成することになります。1 つは appengine で、もう 1 つはスタンドアロン (サーブレットなし) です。この場合、appengine Remote APIを見ることができます。

于 2013-07-19T11:26:48.400 に答える