Sun Java System Application Server Enterprise Edition 8.2 アップグレードと移行

第 5 章 J2EE 1.4 の互換性の問題

次にこの章の内容を示します。

バイナリ互換性

Application Server 8.2 に含まれる Java SDK は J2EE Version 1.4 SDK です。このバージョンの J2EE SDK は J2EE SDK, v1.3 と互換性があります。

ソース互換性

ソースの下位互換性は保たれていません。ソースファイルで新しい J2EE API が使用されている場合、これらは以前のバージョンの J2EE プラットフォームでは使用できません。

一般的なポリシーは次のようになります。

非推奨 API は下位互換性のみをサポートするメソッドやクラスであり、このような API を使用していると、-nowarn コマンド行オプションを指定していない限り、コンパイラは警告メッセージを生成します。非推奨メソッドやクラスを使用しないようにプログラムを変更することが推奨されますが、現在のところ、このようなメソッドやクラスを完全に削除する計画はありません。

J2EE 1.4 プラットフォーム (J2EE 1.3 リリース以降) との非互換性

Sun Java System Application Server 8.2 リリースは Java 2 Platform, Enterprise Edition, version 1.4 に基づいています。Sun Java System Application Server 7 リリースは Java 2 Platform, Enterprise Edition, version 1.3 に基づいています。

ほとんどの既存のプログラムは、何も変更しなくても Sun Java System Application Server 8.2 リリースで実行できるはずです。しかし、まれな状況や「コーナーケース」で発生するいくつかのマイナーな潜在的な非互換性も存在しているためその状況に対処できるように補足としてここで説明します。

JAXP と SAX の非互換性

Sun Java System Application Server 8.2 は JAXP 1.3 をサポートしています。つまり SAX 2.0.2 をサポートしていることになります。SAX 2.0.2 では、DeclHandler.externalEntityDecl が、DTDHandler.unparsedEntityDecl との整合性を保つために、絶対的なシステム識別子を返すようパーサーに要求します。このことによって、SAX 2.0.0 を使用するアプリケーションを移行するときに、いくつかの非互換性が発生します。

これまでの externalEntityDecl の動作を変更せずに、SAX 2.0.0 を使用するアプリケーションを SAX 2.0.2 に移行するには、resolve-dtd-uris 機能を false に設定します。次に例を示します。

SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setFeature("http://xml.org/sax/features/resolve-dtd-uris",false);

SAX 2.0.0 と SAX 2.0.2 との間のその他の非互換性については、『JAXP Compatibility Guide』を参照してください。

pass-by-reference 要素

Sun Java System Application Server 8.2 は、デフォルトで Java 2 Platform, Enterprise Edition 仕様と互換性があります。この場合、移植性のあるすべての J2EE プログラムは、変更なしで Application Server 上で実行できます。ただし、J2EE の互換性要件で許可されている内容に従って、J2EE 仕様と互換性がない Sun Java System Application Server 8.2 の機能を使用するようにアプリケーションを設定することもできます。

sun-ejb-jar.xml ファイル内の pass-by-reference 要素は、リモート呼び出しのみに適用されます。EJB 2.0 仕様、セクション 5.4 で定義されているように、ローカルインタフェースへの呼び出しは pass-by-reference (参照渡し) のセマンティクスを使用します。

pass-by-reference 要素のデフォルト値が false に設定されている場合、リモートインタフェースへの呼び出しのセマンティクスを渡すパラメータは、EJB 2.0 仕様、セクション 5.4 に準拠します。true に設定されている場合、この仕様とは逆に、リモート呼び出しでは pass-by-value (値渡し) のセマンティクスではなく pass-by-reference (参照渡し) のセマンティクスが必要になります。

移植性のあるプログラムでは、このような呼び出しのときにオブジェクトのコピーが作成されることは想定できないので、元のオブジェクトを変更しても安全です。コピーが作成されないことも想定できないので、オブジェクトへの変更は、呼び出し元と呼び出し先の両方に表示されます。このフラグが true に設定されている場合、パラメータと戻り値は読み取り専用であると見なされます。このようなパラメータや戻り値を変更するプログラムの動作は定義されていません。pass-by-reference 要素の詳細については、『Sun Java System Application Server Enterprise Edition 8.2 Developer’s Guide 』を参照してください。

delegate 属性

sun-web.xml ファイルの class-loader 要素にある delegate 属性のデフォルト値が true に設定されている場合、コンテナ全体のライブラリ JAR ファイルにあるクラスとリソースの方が、WAR ファイル内にパッケージされたクラスやリソースよりも優先して読み込まれます。これは、サーブレット 2.3 仕様、セクション 9.7.2 で推奨されている内容と相反しています。false に設定されている場合、クラスローダーの委任動作は、サーブレット 2.3 仕様、セクション 9.7.2 で推奨されている内容に準拠しています。

delegate 属性の値を true にして使用している移植性のあるプログラムを、J2EE 仕様の一部であるクラスやインタフェースと一緒にパッケージしないでください。このようなクラスまたはインタフェースが WAR ファイルに含まれているプログラムの動作は定義されていません。class-loader 要素の詳細については、『Sun Java System Application Server Enterprise Edition 8.2 Developer’s Guide 』を参照してください。