2

この質問はこれに似ていますが、それで問題は解決しませんでした。

私は非常に単純な Google AppEngine / Java アプリケーションを持っています。これは 2011 年から実行されており、maven やその他必要のない凝ったものは使用していません。最近、このアプリケーションに Cloud Endpoints を追加しました。私は generated を使用しませんでしendpoint-libsた。これは必要ないように思われたためです。

アプリケーションには、しばらく前からフロントエンドとバックエンドがありました。これらをモジュールに変換しようとしています。フロントエンドはデフォルトのモジュールになり、バックエンドは別のモジュールになります。

私の古いプロジェクトの構造は次のようになります。

project
 |- src
 |   |- ... Java source files ...
 |
 |- war
 |   |- WEB-INF
 |   |   |- appengine.xml
 |   |   |- backends.xml
 |   |   |- cron.xml
 |   |   |- web.xml

Java クラスに適切な注釈を付けることで、クラウド エンドポイントを実装しました。派手な魔法を生成する魔法はありません。

次のように、モジュールごとにディレクトリを作成する必要があることを理解しています。

project
 |- default
 |   |- WEB-INF
 |   |   |- appengine.xml
 |   |   |- cron.xml
 |   |   |- web.xml
 |
 |- module
 |   |- WEB-INF
 |   |   |- appengine.xml
 |   |   |- web.xml
 |
 |- META-INF
 |   |- appengine-application.xml
 |   |- application.xml

私の質問は次のとおりです。

  • srcディレクトリはどこに置くべきですか?
  • でクラウド エンドポイント クラスを宣言する必要がありdefault/WEB-INF/web.xmlますか?
  • 各モジュールは独自のものを持つことができますWEB-INF/cron.xmlか?

自分が何をしているのかわからないように思われる場合は、おそらく正しいですが、すべてを maven pom ファイルに入れたり、gradle スクリプトなどを作成したり、代わりに実際のアプリケーションに集中したりする必要はありません。それはおそらく、自分たちでコードを書いていた時代に、私が vi と emacs とともに育ったからでしょう。;)

アップデート:

src ディレクトリをand とproject同じレベルに配置しました。コンパイルされた Java クラスが の下に表示されます。これは、正しいことを行ったことを示しています。GAE は でファイルを生成します。これは、モジュールを使用していないときは見られませんでした。defaultmoduledefault/WEB-INF/classes*.apidefault/WEB-INF

ローカルでは、クラウド エンドポイント API を確認でき、それらを使用できます。AppEngine にデプロイし、API エクスプローラーを使用しようとすると、例外が発生します。

/_ah/spi/BackendService.getApiConfigs java.lang.NullPointerException at com.google.api.server.spi.SystemServiceServlet.execute(SystemServiceServlet.java:100) at com.google.api.server.spi.SystemServiceServlet.doPost(SystemServiceServlet) .java:71) javax.servlet.http.HttpServlet.service(HttpServlet.java:637) で javax.servlet.http.HttpServlet.service(HttpServlet.java:717) で

など...

OAuth2 資格情報を追加して、クラウド エンドポイント構成に設定しました。のコードが見つかりませんSystemServiceServletでしたが、私の API クラス ( で構成されているdefault/WEB-INF/web.xml) が見つからないのではないかと推測されます。

別の更新:

AppEngine モジュールにはエンタープライズ アーカイブ (ear) 構造が必要であり、単純な GAE アプリケーションのようにデプロイするのはうまくいかないことを知りました。「ボタンを 1 回押す」展開はありません。Java を使用した Google App Engine のプログラミングの指示に従い、最終的に多数の Eclipse プロジェクトを作成しました。かなりエンタープライズ向けですが、以前にデプロイした単純なバージョンと同じ例外をスローすることができます。少しでも進歩したのだろうか。

4

3 に答える 3

2

ドキュメントは、これを行うには耳が必要であることを強く示唆していますが、そうではありません。モジュール定義を appengine-web.xml に追加するだけで、war が指定されたモジュールにデプロイされます。デフォルトのモジュール:

<module>default</module>

そしてバックエンドの場合

<module>backend</module>
<manual-scaling> ... </manual-scaling>

これには、デフォルトのモジュールと他のモジュールで同じコードを使用できるという利点がありますが、展開時に何らかの方法で切り替える必要があります (ギアを磨くことなく、Maven プロファイルを使用します)。別のブランチを作成するか、手動で行うことができます。その後、通常どおりデプロイできるはずですが、2 回行う必要があります。

これは私が見た中で最も簡単な移行パスです。すでに戦争をしている場合、耳を設定するのは苦痛です。

于 2015-12-10T21:14:47.703 に答える
0

最終的に、 Java を使用した Google App Engine のプログラミング(第 5 章)の指示に厳密に従い、古いコードを徐々に追加しました。これは機能し、ヌルポインター例外はもう発生しませんでした (何が原因かわかりません)。

注意すべきいくつかの点:

  • モジュールはコードを共有しません。Eclipse では、あるプロジェクト内に別のプロジェクト内のソース フォルダーへのリンクを作成できます。これは、私が見つけたコードを共有するための最良の方法です。
  • Eclipse で Java EE パースペクティブを使用する必要があります。これには「サーバー」タブがあり、「リモート サーバーにデプロイ」メニュー エントリのある GAE ボタンが含まれています。これは、モジュールをデプロイする方法です。「Google / Deploy to AppEngine」コンテキスト メニュー エントリは、モジュール / エンタープライズ プロジェクトでは機能しません。
  • cron.xml や datastore-indexes.xml などの特別なファイルは、「デフォルト」モジュールの WEB-INF ディレクトリにある必要があります。
  • Google サーバー上のモジュールへの URL のルーティングは、開発サーバーとは大きく異なります。
  • 開発サーバーでは、ローカル データストアは Eclipse ディレクトリのどこかに埋め込まれています。サーバー構成の作業ディレクトリを変更して、これを修正します。サーバーをダブルクリックします。これにより、「サーバー エディター」が開きます。追加の VM 引数を入力します。-Ddatastore.backing_store=/C:/wherever/local_db.bin

プロジェクトのディレクトリ構造は次のようになります。

project
 |- default
 |   |- src
 |   |- WebContent
 |   |   |- WEB-INF
 |   |   |   |- appengine.xml
 |   |   |   |- cron.xml
 |   |   |   |- web.xml
 |
 |- module
 |   |- WebContent
 |   |   |- <HTML, CSS etcetera>
 |   |   |- WEB-INF
 |   |   |   |- appengine.xml
 |   |   |   |- web.xml
 |
 |- ear     (the EAR project)
 |   |- EarContent
 |   |   |- META-INF
 |   |   |   |- appengine-application.xml
 |   |   |   |- application.xml

このほとんどは、前述の本の指示に従って生成されました。

これが、AppEngine プロジェクトをモジュール化するのに苦労している人々の助けになることを願っています。

于 2016-02-21T11:42:02.870 に答える