この付録では、JDeveloperを使用して開発したアプリケーションの実行時に発生する可能性のある代表的な問題と、その解決方法について説明します。次のトピックが含まれます。
この項では、代表的な問題点とその解決方法について説明します。次のトピックが含まれます。
JSPファイルを含むADF WebアプリケーションをWARファイルで問題なくデプロイしたにもかかわらず、アプリケーションを実行しようとするとブラウザに「HTTP 404-Page Not Found
」というエラーが表示されます。
問題点
WebページのURLが、アプリケーション・サーバーに対して構成されているコンテキスト・ルートと一致していません。アプリケーションのコンテキスト・ルートが違っている原因として、JDeveloperでデフォルトが使用されている可能性があります。これはオーバーライドする必要があります。Enterprise Managerを使用してWARファイルをデプロイすると、Oracle Application Serverで選択されたコンテキスト・ルートが指定されます。
解決方法
WebページのURLが次の書式になっていることを確認します。
http://<host>:<http port for iAS>/context-root/<sub-directory structure within public_html>/<the page>.jsp
アプリケーションのコンテキスト・ルートは、Oracle Application Serverインストールの<mypath>
/j2ee/home/config
にある、http-web-site.xml
ファイルまたはdefault-web-site.xml
ファイルに記載されています。
たとえば、コンテキスト・ルートが/war1
の場合、Oracle Application Serverインストールのmod_oc4j.conf
ファイルには、次のエントリが含まれます。
Oc4jMount /war1 home Oc4jMount /war1/* home
つまり、表示されるURLのコンテキスト・ルートは1つのみで、その後にサブディレクトリが続いている必要があります。
JDeveloperでWARファイルのコンテキスト・ルートを変更するには、次のようにします。
ナビゲータでwebappx.deployをダブルクリックし、「WARデプロイメント・プロファイルのプロパティ」ダイアログの「一般」を選択します。
「J2EE Webコンテキスト・ルートを指定」を選択し、フィールドに値を入力します。
Oracle Application ServerインストールにWARファイルを再度デプロイします。
JSTLタグを含むJSPをコンパイルしようとすると、次のエラーが発生してコンパイルに失敗します。
Error(1): "http://java.sun.com/jstl/core" is not a registered TLD namespace
.
Error(1): Unable to load tag handler class: http://java.sun.com/jstl/core
問題点
プロジェクトのWEB-INF/lib
ディレクトリにstandard.jar
ファイルがありません。JSTLライブラリを手動で含める場合でも、コンポーネント・パレットを使用せずにJSPページにJSTLタグを手動で挿入すると、この問題が発生する可能性があります。
解決方法
プロジェクトのlib
ディレクトリにstandard.jar
ファイルを追加します。
ファイルを追加するには、次のようにします。
<JDEV_HOME>/jakarta-taglibs/jstl-1.0/lib/
ディレクトリを開きます。
standard.jar
ファイルをコピーします。
プロジェクトの.../public_html/WEB-INF/lib/
ディレクトリにstandard.jar
ファイルを貼り付けます。
JSPページをコンパイルします。
JSPファイルおよびStruts-Config.xml
ファイルを含むADF Webアプリケーションを問題なくデプロイしたにもかかわらず、アプリケーションを実行しようとすると空のページが表示されます。この場合、WebページのURLは間違っておらず、ブラウザにはHTTPエラーは表示されません。
問題点
問題のWebアプリケーションは、Strutsコントローラを使用してStrutsアクションからページへのフォワードを行っています。Strutsアクション・クラスは、レンダリングの前にページ用のデータを準備するためにアプリケーションに実装されています。適切なStrutsアクション・クラスを実行しないまま、Webページを実行しようとしました。
解決方法その1
StrutsベースのWebアプリケーションは、JSPページのURLを指定して実行しないでください。Strutsアクションを起動してアプリケーションを実行する必要があります。そのためには、通常、<action name>
.do
という名前のリンクを含むWebページを表示します。拡張子 .do
はリンクをStrutsコントローラへリダイレクトし、コントローラがStruts-Config.xml
ファイルから該当するアクションを実行します。ブラウザは、Struts-Config.xml
ファイルでこのアクションにマップされているWebページを表示します。
解決方法その2
JDeveloper内でWebアプリケーションを実行する場合、JSPを直接実行しないでください。JDeveloperでは、Strutsベースのアプリケーション内のJSPファイルにも「実行」を選択できますが、実際にはStruts-Config.xml
ファイルからWebページを起動する必要があります。ナビゲータでStruts-Config.xmlを右クリックし、必要なアクションに対応する「実行」を選択してください。選択したアクションによって、Strutsコントローラでは、対応するマップされたJSPファイルの実行が可能になります。
サイズの大きいJSPページを実行しようとすると、次のエラーが返されます。
java.lan.VerifyError: "Illegal target of jump or branch
"
問題点
Sun JDKには、生成済のページ実装クラスのサービス・メソッドに64KBのサイズ制限があります。JSPページのサイズが64KB未満でも、サービス・メソッドにソースJSPページの生成済コードが含まれることにより、対応するクラス・ファイルのサイズが64KBを超える可能性があります。したがって、静的HTML、静的インクルードおよびタグ・ライブラリが原因で、クラス・ファイルのサイズが大きくなる場合があります。
解決方法
次の対応策を検討してください。
JSPページをより小さいサイズのページに分割します。次に、動的インクルード・コマンド(jsp:include
)を使用して、一方のJSPページを他方のページに挿入します。実行時にはコンテンツ全体が表示されます。
JSPページに静的インクルードが含まれる場合、静的HTMLを個別のファイルに配置します。次に、動的インクルード・コマンド(jsp:include
)を使用して、実行時にそのファイルの出力を挿入します。
静的HTMLをJavaリソース・ファイルに配置します。Oracle JSPコンテナを使用している場合、JSPのexternal_resource
構成パラメータを有効にすると、コンテナによってこの操作が自動的に実行されます。これにより、ページ内のすべての静的コンテンツが変換時にリソース・ファイルに配置されます。このパラメータの使用方法の詳細は、Oracle9i Databaseドキュメント・セットに含まれる『Oracle9i JavaServer Pagesサポート・リファレンス』を参照してください。変換前の場合、ojspc
コマンドライン・ツールの-extres
オプションでも、この機能を使用できます。
サイズの大きなスクリプトレットのJavaコードをJavaBeansに移行します。
Webアプリケーションを作成後、JDeveloperが埋込みOC4Jサーバーへの接続を確立しようとすると、アプリケーションが終了します。プロキシ・サーバーから送信されたエラー・メッセージが表示されます。
問題点
デフォルトでは、同じマシン上にあるデフォルトのブラウザのプロキシ設定がJDeveloperで使用されます。ただし、プロキシ例外のリストにlocalhost
および127.0.0.1
が表示されず、これらの例外をJDeveloper内に指定していない場合、JDeveloperと同じマシンにあるアプリケーション・サーバーへの接続を試みたにもかかわらず、実際にはローカル・マシン用の接続がプロキシ・サーバー上でかわりに開いてしまうことがあります。
たとえば、localhost
がプロキシ・リストから除外されていない場合、http://localhost/MyApp/index.html
などのブラウザ内のリクエストはプロキシ・サーバーに送信され、サーバーはlocalhost
をローカル・マシンではなくサーバー自身に対して解決します。この場合、表示されるメッセージは、ローカル・マシン上で実行しているサーバーではなく、プロキシ・サーバーから送信されたものです。
解決方法
プロキシ・サーバーの背後のIPアドレスに接続しようとしていて、ローカル・マシンも同じプロキシ・サーバーの背後にある場合、JDeveloperのWebプロキシ設定から接続しようとしているIPアドレスを除外してください。
JDeveloperでプロキシ設定を確認および変更するには、次のようにします。
「ツール」メニューから「設定」を選択し、ダイアログからプロキシ・サーバーを選択します。
「HTTPプロキシ・サーバーを使用」が選択されていることを確認し、プロキシ・ポートとプロキシ・ホストを指定します。
指定したプロキシ設定が使用されていることを確認するには、JDeveloperを起動し、コンソール・ウィンドウに表示される埋込みOC4Jサーバー起動用のコマンドをチェックします。このコマンドにはプロキシ設定が含まれます。
Webアプリケーションを作成後、データソースにカスタムのドライバ・クラス(oracle.jdbc.pool.OracleConnectionPoolDataSource
やoracle.jdbc.pool.OracleConnectionCacheImpl
など)を指定しようとしても、IDE接続によって指定されるデフォルトの接続の詳細設定が使用されてしまいます。IDE接続定義に依存しない、カスタマイズした方法でクラスと場所のパラメータを指定できません。
問題点
プロジェクトに含まれるdata-sources.xml
ファイルが、埋込みOC4Jの場合のアプリケーションの実行およびデバッグ、またはスタンドアロンのOracle Application Serverインストールへのデプロイに使用されている可能性があります。JDeveloperでは、data-sources.xml
ファイルは接続マネージャ・ウィザードで定義された接続で上書きされます。data-sources.xml
ファイルが上書きされる際、ユーザー定義のデータソースはすべて削除されます。また接続マネージャで定義されたデータベース接続が、アプリケーションでの必要性にかかわらずすべてデータソースとして定義されます。
ただしこの問題はグローバル・アプリケーションのレベルでは発生しないため、サーバー全体に適用されるカスタム・エントリは定義可能です。OC4Jディレクトリ<ORACLE_HOME>/j2ee/config/
にあるグローバル・アプリケーション用のdata-sources.xml
ファイルは編集できます。プロジェクト・レベルのdata-sources.xml
ファイルと異なり、このファイルはJDeveloperで上書きされません。
JDeveloper 9.0.4.x以下での解決方法
data-sources.xml
ファイルのクラス・ドライバを編集してカスタム・エントリを指定し、Windowsのエクスプローラでファイルを読取り専用に設定します。これにより、JDeveloperによるファイルの上書きを防止できます。ファイルは、その制御対象別に次の2つの場所に格納されています。
プロジェクト・レベルのdata-sources.xml
ファイルは、<JDEV_HOME>/mywork/
<project>
/src/META-INF/
にあります。独自のデータソース定義を使用してアプリケーションをデプロイする場合には、このファイルを変更してください。
埋込みOC4Jサーバー・レベルのdata-sources.xml
ファイルは、<JDEV_HOME>/system
XXX
/oc4j-config/
にあります。カスタムのデータ・ソース定義を使用してJDeveloperでアプリケーションを実行する場合には、このファイルを変更してください。
ユーザー定義のデータソースを追加するには、<data-source>
要素にname
属性を指定します。たとえば、次のように入力します。
<data-source name="myConnection" ... />
9.0.3.xのJDeveloperは、jdev-connection:
で始まるname
属性値を認識し、接続マネージャに定義された接続にマップします。
9.0.4では、使用される接頭辞がjdev-connection-
に変更されましたが、jdev-connection:
も継続して認識されるため、どちらの接頭辞も接続マネージャの接続にマップされます。
name
属性の値に応じて、次の3通りに処理されます。
name
が認識される接頭辞で始まる場合、接続マネージャに変更があれば、変更内容を使用して<data-source>
要素が自動的に更新されます。
name
が認識される接頭辞で始まらない場合、<data-source>
要素に対して何も処理されません。独自のデータソース接続情報を定義する場合には、この方法をお薦めします。
name
が指定されていない場合、<data-source>
要素が削除されます。
JDeveloperではファイルorion-application.xml
がパッケージされ、このファイルはプロジェクト内のdata-sources.xml
ファイルをポイントします。
正しいdata-sources.xml
ファイルをプロジェクトとともにデプロイするためには、次の手順で標準のJ2EEに対するデプロイメント・プロファイルを構成する必要があります。
ナビゲータでXxx.deployをダブルクリックし、デプロイメント・プロファイルのプロパティ・ダイアログを表示します。
ダイアログで「プラットフォーム」を選択し、「ターゲット接続」を<なし>に設定します。
これで、OC4J専用のファイルがアーカイブの一部としてデプロイされることはありません。
JDeveloper 9.0.5.x以上での解決方法
JDeveloper 9.0.5.xからは、JDeveloper IDEを使用して、データソースの値およびデータソースとIDE接続定義の同期化オプションを指定できます。IDEで更新されるdata-sources.xml
ファイルは、その制御対象別に次の2つの場所に格納されています。
プロジェクト・レベルのdata-sources.xml
ファイルは、<JDEV_HOME>
/mywork/
<project>
/src/META-INF/
にあります。独自のデータソース定義を使用してアプリケーションをデプロイする場合には、このファイルを更新してください。
ナビゲータで、data-sources.xmlを右クリックして「プロパティ」を選択します。
「データソース・プロパティ」ダイアログで、「データソース」を選択します。
オプション「実行時またはOC4Jへのデプロイ時にdata-sources.xmlを自動更新」の選択を解除します。
これにより、JDeveloperによるファイルの上書きを防止できます。または、IDE接続に基づいてdata-sources.xml
ファイル内の定義を作成、更新または削除するオプションの選択を個別に解除できます。
必要な接続ドライバ・クラスを指定するには、左側の「データソース」リストから必要な接続を選択します。
「接続」タブで、必要なクラス名を指定します。
埋込みOC4Jサーバー・レベルのdata-sources.xml
ファイルは、<JDEV_HOME>
/system
XXX
/oc4j-config/
にあります。カスタムのデータ・ソース定義を使用してJDeveloperでアプリケーションを実行する場合には、このファイルを更新してください。
「ツール」メニューから「埋込みOC4Jサーバーの設定」を選択します。
ダイアログで、「現在のワークスペース」および「データソース」を選択します。
IDE接続に基づいてdata-sources.xml
ファイル内の定義を作成、更新または削除する各オプションの選択を解除してください。これにより、JDeveloperによるファイルの上書きを防止できます。
必要な接続ドライバ・クラスを指定するには、左側の「データソース」リストから必要な接続を選択します。
「接続」タブで、必要なクラス名を指定します。
JDeveloperではファイルorion-application.xml
がパッケージされ、このファイルはプロジェクト内のdata-sources.xml
ファイルをポイントします。
正しいdata-sources.xml
ファイルをプロジェクトとともにデプロイするためには、次の手順で標準のJ2EEに対するデプロイメント・プロファイルを構成する必要があります。
ナビゲータでXxx.deployをダブルクリックし、デプロイメント・プロファイルのプロパティ・ダイアログを表示します。
ダイアログで「プラットフォーム」を選択し、「ターゲット接続」を<なし>に設定します。
これで、OC4J専用のファイルがアーカイブの一部としてデプロイされることはありません。
Oracle Application Server上のEJB参照を使用するJ2EEアプリケーションを作成しましたが、次の場合に接続に失敗します。
アプリケーション・サーバー接続の作成ウィザードを使用してサーバーへの接続を試みたとき
接続を使用してWARファイルのデプロイを試みたとき
アプリケーションの実行を試み、クライアントがサーバー上のコンポーネントにアクセスしようとしたとき
エラーは、「Connection refused: connect
」または「java.net.ConnectException: Connection refused: connect Io exception: Connection refused: connect (DESCRIPTION=(TMP=) (VSNNUM=135286784)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4))))
」です。
問題その1
SQL例外のエラーではなく、「Connection refused: connect
」というメッセージが表示される場合、OC4Jサーバーが別のRMIポートでリスニングしている可能性があります。そうでなければ、OC4Jコンテナが稼働していないか、または指定されたホスト上でリスニングしていません。
接続を確立できない問題は、スタンドアロンのOracle Application Serverインストールによくある問題で、RMIポートがデフォルトとして提供されていないにもかかわらず指定されたレンジから採用されることが原因です。
JDeveloperの埋込みOC4Jサーバー向けの解決方法
アプリケーションを実行またはデプロイする際にJDeveloperが使用しているポートを、メッセージ・ログ・ウィンドウで確認します。このウィンドウには、最初に次のようなメッセージが表示されます。
[Starting OC4J using the following ports: HTTP=8988, RMI=23891, JMS=9227.]
または、rmi.xml
ファイルをチェックしてOC4Jサーバーが同じRMIポート上でリスニングしているかどうかを確認します。また、<JDEV_HOME>
/system
XXX
/oc4j-config/log/
にあるrmi.log
ファイルでエラーをチェックすることもできます。
リリース9.0.2〜9.0.4のJDeveloperでポートを変更するには、次のようにします。
「ツール」メニューから「設定」を選択します。
ダイアログで「埋込みOC4J」を選択し、変更を行います。
JDeveloper 9.0.5.xでポートを変更するには、次のようにします。
「ツール」メニューから「設定」を選択します。
ダイアログで「埋込みOC4Jサーバーの設定」を選択します。
ダイアログで「グローバル」および「起動」選択し、変更を行います。
新しいサーバー・ポート設定は、<JDEV_HOME>
/system
XXX
/oc4j-config/
のrmi.xml
ファイルで更新されます。
Oracle Application Server上のスタンドアロンOC4J向けの解決方法
rmi.xml
ファイルをチェックしてOC4Jサーバーが同じRMIポート上でリスニングしているかどうかを確認します。また、<OC4J_HOME>
/j2ee/home/log/
にあるrmi.log
ファイルでエラーをチェックすることもできます。<OC4J_HOME>
/j2ee/home/config/
にあるrmi.xml
ファイルでサーバー・ポートを編集します。
または、Oracle Application Serverインストールの管理に関するEnterprise ManagerのWebサイトにアクセスする方法もあります(http://host:portと入力、デフォルトは1810)。OC4Jインスタンスについての最初のページにある「ポート」リンクをクリックしてください。このページを使用して、各OC4JインスタンスのUMIポートをチェックおよび構成できます。
追加の解決方法は、Oracle MetaLink(http://metalink.oracle.com
)で参照できます。問題に対する解決方法が見つからない場合は、サービス・リクエストに記録してください。
関連資料:
|