サイトのトップへ戻る

Google App Engine ドキュメント日本語訳

Java ランタイム環境

Java用Google App Engine へようこそ!App Engineを使えば、標準のJavaテクノロジー を使ったウェブアプリケーションを構築でき、それをGoogleの拡張可能なインフラ上で実行できます。 Java 環境ではJava サーブレットインタフェースを使用でき、データストアおよびサービスへの標準インタフェース(JDO, JPA, JavaMail, JCacheのような)をサポートしています。 標準サポートを使うことによって開発が簡単になり、手に馴染んだ従来のやり方で開発を行えます。また、あなたのアプリケーションと独自サーブレット環境を相互に移行できるようになります。

  1. はじめに
  2. Java のランタイムを選択する
  3. サンドボックス
  4. クラスでの JAR 読み込み順番
  5. JRE ホワイトリスト
  6. 署名なし JAR ファイル
  7. Java SDK とツール


はじめに

App Engine は、セキュア"サンドボックス"環境上のJava 7 JVMを使ってJava ウェブアプリケーションを実行します。 あなたのアプリはこの環境とやり取りをすることでウェブのリクエストを受信し、処理を実行し、応答を返します。 この環境では、App Engineはあなたのアプリのサーブレットクラスを実行して処理を実行し、応答の準備をします。

Eclipse 用Google プラグインをインストールすると新たなプロジェクトウィザードが追加され、 App Engineプロジェクト用のEclipse IDEで設定のデバッグができるようになります。 Java用App Engine では、特にGoogle Web Toolkit (GWT)を使ったワールドクラスのウェブアプリケーションの開発と配置が簡単になります。 Eclipse プラグインにはApp EngineのSDKとGWT のSDKがバンドルされています。

同様に、他のJava IDEでもサードパーティ製プラグインは使用できます。 例えば、NetBeans の場合はGaelyk フレームワーク用NetBeans プラグインを参照してください。 IntelliJの場合はIntelliJをGoogle App Engineへ統合を参照してください。 (リンク先はサードパーティによって提供されているものになります。)

App Engine はウェブアプリケーションではJava サーブレット 2.5 標準を使用しています。 標準WARディレクトリ構造の中に、デプロイメントディスクリプタ (web.xml ファイル)とその他設定ファイルと共に、 アプリのサーブレットクラス(JSP)と静的ファイルとデータファイルを用意します。 App Engine はデプロイメントディスクリプタに従ってサーブレットを実行し、リクエストを処理します。

セキュア "サンドボックス" 環境は、サービスとセキュリティのためにあなたのアプリケーションを分けて管理します。 これによりアプリは他のアプリのパフォーマンスや拡張性に干渉しない動作のみを実行できるようになります。 例えば、アプリはローカルファイルシステムへのデータの書き込みや勝手にネットワークコネクションを作成するなどの場合には、スレッドを生成できません。 また、アプリは JNI やその他ネイティブコードを使用できません。 JVM は、サンドボックスの制限内の操作を行うJava バイトコードを実行できます。

App Engine プラットフォームは、あなたがコード上から呼び出すことができる サービス をたくさん提供しています。 また、アプリケーションでは指定した間隔で実行されるスケジュールタスクを実行することもできます。

まだ見ていない場合は、Javaテクノロジーと Google App Engineを使ったウェブアプリケーションの開発を対話的に学ぶことができる、Java 入門ガイドを参照してください。



Java のランタイムを選択する

アプリをアップロードする際に使うJava SDK のAppCfg ツールを使用すると、 アプリケーションがどのJava ランタイム環境を使用するのかをApp Engineに指示することができます。

App Engine Java API は、SDK に含まれるappengine-api-*.jarによって表されます(*はAPIとSDKのバージョンを表します)。 アプリケーションの WEB-INF/lib/ディレクトリにあるこのJARファイルをインクルードすることで、あなたのアプリケーションで使用するAPIのバージョンを選択します。 既存のアプリと互換性のない変更がされた新しいバージョンのJavaランタイム環境がリリースされた場合、そのランタイム環境には新しいバージョンナンバーが振られます。 新しいバージョンのJARファイルに置き換えてアプリを再アップロードしなければ、あなたのアプリケーションでは変更前のバージョンのランタイム環境を使い続けられます。



サンドボックス

複数のウェブサーバーにまたがったアプリケーションへのリクエストを分散し、アプリケーションが別のアプリケーションへ干渉しないようにするために、 App Engineでは制限された"サンドボックス"環境内でアプリケーションを実行させます。 この"サンドボックス"環境では、アプリケーションはコードを実行し、App Engineデータストア内でデータを保存したり呼び出したり、App EngineメールやURLフェッチやUsers サービスを使用したり、ユーザーのウェブリクエストを精査して応答の準備をしたりできます。

App Engine アプリケーションでは以下のことができません:

  • ファイルシステムへの書き込み。データを永続的に保存する場合、アプリケーションではApp Engine データストアを使用しなければなりません。ファイルシステムからの読み込みは可能で、アプリケーションと一緒にアップロードされた全てのファイルも読み込み可能です。

  • ゆっくり応答する。アプリケーションへのウェブからのリクエストは、数秒以内に処理されなければなりません。 応答にかなり時間がかかる処理は、ウェブサーバーへの負荷を避けるために終了されます。

  • 他の種類のシステムコールを作成する。



スレッド

Java アプリケーションは新規にスレッドを作成できますが、その作成方法にはいくつかの制限があります。 これらのスレッドは、自身作成したリクエストよりも"長生き"できません。 (バックエンドサーバでは、自身を作成したリクエストよりも"長生き"できる バックグラウンドスレッドを生成できます。)

アプリケーションでは以下のことができます

or use the factory object returned by com.google.appengine.api.ThreadManager.currentRequestThreadFactory() with an ExecutorService (e.g., call Executors.newCachedThreadPool(factory)).

しかし、ThreadManagerの属するメソッドのうち一つを使ってスレッドを作成しなければなりません。 あなたが自分自身で new Thread()を実行したり、 既定のスレッドファクトリを使用することはできません。

アプリケーションは、カレントスレッドに対して thread.interrupt()のような操作を実行できます。

各リクエストで同時にリクエストできるスレッドは50に制限されます。 一つリクエストで50スレッド以上作成しようとして場合、Java ランタイムはjava.lang.IllegalStateExceptionを発生させます。



ファイルシステム

Java アプリケーションでは、java.io.FileWriterのようなファイルシステムへの書き込みに使われるクラスは使用できません。 java.io.FileReaderのようなクラスを使ってファイルシステムから所持ファイルを読み込むことができます。 また、Class.getResource()ServletContext.getResource()を使って所持ファイルに"リソース"としてアクセスすることもできます。

"リソースファイル" と見なされたファイルのみがファイルシステムを介してアプリケーションへアクセスできます。 既定では、WAR 内の全てのファイルは"リソースファイル"と見なされます。appengine-web.xml ファイルを使い、この既定設定からファイルを除外することができます。



java.lang.System

App Engineに適用されないjava.lang.Systemクラスの機能は無効になります。

以下のシステムメソッドは、App Engineで実行しても何も起きません: exit(), gc(), runFinalization(), runFinalizersOnExit()

以下の システム メソッドは nullを返します: inheritedChannel(), console()

アプリはJNIネイティブコードを提供したり直接実行したりできません。以下の システム メソッドではjava.lang.SecurityExceptionが発生します: load(), loadLibrary(), setSecurityManager()



Reflection

An application is allowed full, unrestricted, reflective access to its own classes.

It may query any private members, call the method java.lang.reflect.AccessibleObject.setAccessible(), and read/set private members.

An application can also reflect on JRE and API classes, such as java.lang.String and javax.servlet.http.HttpServletRequest. しかし、アクセスできるのは public メンバのみで、 protectedメンバや privateメンバにはアクセスできません。

An application cannot reflect against any other classes not belonging to itself, and it can not use the setAccessible() method to circumvent these restrictions.



カスタムクラスの読み込み

App Engineでは、カスタムクラスの読み込みは完全サポートされています。 An application is allowed to define its own subclass of ClassLoader that implements application-specific class loading logic. Please be aware, though, that App Engine overrides all ClassLoaders to assign the same permissions to all classes loaded by your application. If you perform custom class loading, be cautious when loading untrusted third-party code.



クラスでの JAR 読み込み順番

場合によっては、クラス名の衝突を回避するために、クラスでJAR ファイルがスキャンされる順番を再定義することが必要になります。 この場合は、appengine-web.xmlファイルに<priority-specifier>エレメントを内包した<class-loader-config>エレメントを追加することで、特定のJAR ファイルに優先読み込みを付与することができます。例えば:

<class-loader-config>
	<priority-specifier filename="mailapi.jar"/>
</class-loader-config>

war/WEB-INF/classes/ディレクトリにこれらのファイルがない場合、クラスで最初に検索されるJARファイルとして"mailapi.jar"が置かれます。

複数の JAR ファイルに優先読み込みが設定されている場合は、元の順番が適用されます(優先読み込みが設定されているファイル同士に関しては)。 言い換えれば、<priority-specifier> エレメント自身の順番は重要でありません。



JRE ホワイトリスト

Java 標準ライブラリ (Java ランタイム環境やJRE)のクラスへのアクセスは、App Engine JRE ホワイトリストに登録されたクラスにのみ制限されます。



署名なし JAR ファイル

App Engineのプリコンパイルは、署名付きJARファイルとの互換性がありません。あなたのアプリケーションがプリコンパイルされる場合 (既定)、署名付きJAR ファイルを読み込むことができません。アプリケーションが署名付きJARを読み込もうとした場合、App Engine は実行時に以下のような例外を発生させます

java.lang.SecurityException: SHA1 digest error for com/example/SomeClass.class
    at com.google.appengine.runtime.Request.process-d36f818a24b8cf1d(Request.java)
    at sun.security.util.ManifestEntryVerifier.verify(ManifestEntryVerifier.java:210)
    at java.util.jar.JarVerifier.processEntry(JarVerifier.java:218)
    at java.util.jar.JarVerifier.update(JarVerifier.java:205)
    at java.util.jar.JarVerifier$VerifierStream.read(JarVerifier.java:428)
    at sun.misc.Resource.getBytes(Resource.java:124)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:273)
    at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)

これに対処するには二つの方法があります:



Java SDK とツール

App Engine Java SDK には、アプリケーションをテストし、アプリケーションのファイルをアップロードし、ログデータをダウンロードするためのツールが含まれています。 The SDK には、App Engineプロジェクトでの一般的な共通作業を簡素化できるApache Ant用コンポーネントも含まれています。 Eclipse用Google プラグインをインストールすると、 Eclipse IDEにApp Engineでの開発やテストや配置用の機能が追加されます。またプラグインにはApp Engine SDKの完全版も含まれています。 また、 Eclipse プラグインを使うと App EngineでのGoogle Web Toolkitアプリケーションの開発やその実行も簡単になります。

App Engine Java SDK には、Apache Mavenでの開発をサポートしているプラグラインも含まれています。

デベロップメントサーバを使うと、あなたのアプリケーションをローカル環境で開発やテストすることができます。 このサーバではApp Engineデータストア、サービス、サンドボックス制限をシミュレートします。 デベロップメントサーバ では、テスト中のアプリクエリー処理に基づくデータストアインデックスの設定を生成することもできます。

AppCfgと呼ばれる多目的ツールでは、App Engine上で動作するアプリケーションとのコマンドラインでの全てのやり取りを制御できます。 AppCfg はあなたのアプリケーションを App Engineにアップロードしたり、単にデータストアインデックスの設定を変更してコードを更新する前に新たなインデックスを構築したりもできます。 またアプリのログデータもダウンロードできるので、あなたの独自ツールを使ってアプリのパフォーマンスを解析することもできます。