この節では、Sun Java System Application Server Platform Edition 9 製品に関する既知の問題とそれに関連する回避策について説明します。問題の説明にプラットフォームが明記されていない場合、その問題はすべてのプラットフォームに当てはまります。この節は次の項目から構成されています。
デフォルトでは、asenv.conf によってポイントされる domain1 の AS_ACC_CONFIG 変数のハードコードされた値が $INSTALL/lib/package-appclient.xml にあります。domain1 を削除して新たなドメインを作成した場合、AS_ACC_CONFIG 変数は新たなドメイン名で更新されません。その結果、package-appclient スクリプトの処理が失敗します。
次のいずれかの操作を行います。
domain1 はそのままにしておき、その前後に別のドメインを作成します。
domain1 を削除し、$INSTALL/lib/package-appclient.xml の domain1 にハードコードされた値を新しいドメイン名で置き換えます。domain1 がない場合、新たなドメインが作成されるたびにこれを行う必要があります。
J2SE 1.4.x、5.0、またはそれ以降のバージョンは、Application Server で設定できます。J2SE 5.0 プラットフォームの重要な特徴は、JMX エージェントを起動できることです。サーバーの起動時にシステムプロパティーを明示的に設定すると、JMX エージェントがアクティブになります。
次に例を示します。
name="com.sun.management.jmxremote" value="true" name="com.sun.management.jmxremote.port" value="9999" name="com.sun.management.jmxremote.authenticate" value="false" name="com.sun.management.jmxremote.ssl" value="false"
JMX プロパティーを設定してサーバーを起動すると、Application Server VM 内で新しい jmx-connector サーバーが起動します。この場合は、望ましくない副作用の 1 つとして、管理機能が悪影響を受け、Application Server の管理 GUI や CLI で予期しない結果が発生することがあります。問題は、組み込みの jmx-connector サーバーと新たな jmx-connector サーバーとの間で衝突が発生することにあります。
jconsole または何らかの JMX 互換クライアントを使用する場合には、Application Server とともに起動する標準の JMX コネクタサーバーを再利用することを検討してください。
サーバーの起動時に、次に示すような行が server.log に作成されます。ここで指定されている JMXServiceURL に接続し、資格を正常に指定したあと、同様の管理および設定操作を実行することができます。次に例を示します。
[#|2004-11-24T17:49:08.203-0800|INFO|sun-appserver-ee8.1|javax.enterprise. system.tools.admin|_ThreadID=10;|ADM1501: Here is the JMXServiceURL for the JMXConnectorServer: [service:jmx:rmi:///jndi/rmi://hostname:8686/management/ rmi-jmx-connector]. This is where the remote administrative clients should connect using the JSR 160 JMX Connectors.|#]
詳細については、『 Sun Java System Application Server 9 管理ガイド』を参照してください。
管理コンソール GUI では、実際のゼロ ( 0) と統計が利用できない状態 (N/A) とを区別できます。現在、コマンド行インタフェースでは、N/A の代わりにマイナス 1 (-1) が表示されます。たとえば、次の display-error-statics コマンドの出力では、N/A の代わりに —1 が表示されています。
# asadmin display-error-statistics Please enter the admin user name>admin Please enter the admin password> Timestamp Severity Warning --------------------------------------------------------- 1143659837750(Mar 29, 2006 11:17:17 AM) 0 0 1143656237750(Mar 29, 2006 10:17:17 AM) 0 0 1143652637750(Mar 29, 2006 9:17:17 AM) -1 -1 1143649037750(Mar 29, 2006 8:17:17 AM) -1 -1 1143645437750(Mar 29, 2006 7:17:17 AM) -1 -1 --------------------------------------------------------- Command display-error-statistics executed successfully. |
エラー統計値を表示するには、管理コンソール GUI を使用してください。この問題は、今後のリリースで解決されます。
ここでは、アプリケーションクライアントに関する既知の問題とその解決方法を示します。
クライアント JAR (たとえば reporter.jar) 内に最上位レベルの JAR ファイルがある場合、クライアント JAR を配備すると、その JAR の MANIFEST ファイルがクライアント JAR の MANIFEST ファイルを上書きします。
現時点ではありません。
Windows での実行時に、appclient.bat コマンドが APPCPATH を受け付けていないことがわかっています。この問題は、apppclient.bat ファイルで APPCPATH 文を引用符で囲むと確認できます。たとえば、次の文は失敗します。
set CLASSPATH="%JAXP_IMPL_JARS%";%JVM_CLASSPATH% if not %APPCPATH%x == x set CLASSPATH=%CLASSPATH%;"%APPCPATH%" |
これに対し、次の文は正しく機能します。
set CLASSPATH=%JAXP_IMPL_JARS%;%JVM_CLASSPATH% if not %APPCPATH%x == x set CLASSPATH=%CLASSPATH%;%APPCPATH% |
APPCPATH (および JAXP_IMPL_JARS) への参照を囲む二重引用符を削除してください。
この節では、インストールおよびアンインストールに関する既知の問題とその解決方法を示します。
この問題は、いくつかの Linux システム上で発生していました。これは Java Desktop System 2 でもっとも一般的に見られますが、RedHat ディストリビューションでも見られます。
インストーラの最後の画面で「完了」ボタンをクリックすると、インストーラは製品の「バージョン情報」ページまたは製品登録ページを表示するブラウザウィンドウの起動に失敗し、コマンドプロンプトに戻ることなくハングアップしたままになります。
インストーラを起動した端末ウィンドウで Ctrl+C を押してインストーラを終了します。そのあとで、製品の「バージョン情報」ページまたは登録ページを表示するブラウザウィンドウが起動することがあります。ブラウザウィンドウが現れない場合には、ブラウザを起動してから次の URL を入力して「バージョン情報」ページを確認してください。
file://install_dir/docs/about.html
製品を登録するインストールオプションを選択した場合には、「バージョン情報」ページ上の登録ページへのリンクをたどってください。
Linux インストーラを起動する setup 実行可能ファイルがハングすることがあります。J2SE の場所を解決してインストールウィザードを起動せずに、ラッパーがハングし、次のメッセージを返します。
Chcking available disk space.... Checking Java(TM) 2 Runtime Environment.... Extracting Java(TM) 2 Runtime Environment.... Deleting temporary files.....
この問題は Linux の一部のバージョンで見られ、特に JAVA_HOME 変数が存在する場合など環境設定に依存するようです。
この問題を回避するには、次の手順を実行します。
シェルに応じて unset または unsetenv を実行して、JAVA_HOME 変数の設定を解除します。
-javahome オプションを使用して setup を実行して、インストーラが使用する JAVA_HOME を指定します。
ここでは、ライフサイクル管理に関する既知の問題とその解決方法を示します。
[echo] Doing admin task set [exec] [Attribute(id=redelivery-interval-internal-in-millis) : Redelivery- Interval (7,000) should be greater than or equal to Minimum-delivery- interval-in-millis (9,000)] [exec] CLI137 Command set failed.
minimum-delivery-interval は、同一の周期タイマーの最小発生間隔。
redelivery-interval-in-mills は、失敗した ejbTimeout のあとに再発生を試みるまでタイマーサービスが待機する時間。
これは、再発生間隔のプロパティーを最小発生間隔のプロパティーと関連付けるロジックが間違っていて、GUI または CLI を使用して再発生間隔よりも最小発生間隔が大きくなるような値を設定できないという問題です。
minimum-delivery-interval-in-millis を、ejb-timer-service プロパティーの redelivery-interval-in-millis 以上の値に設定する必要があります。問題は、redelivery-interval-in-millis の値が minimum-delivery-interval-in-millis の値よりも大きいことを検証するための Application Server の処理にエラーがあることです。
次のように、これらプロパティーのデフォルト値を使用します。
minimum-delivery-interval(default)=7000 redelivery-interval-in-millis(default)=5000
これらデフォルト以外の値を指定するとエラーが発生します。
この節では、Java Persistence API に関する既知の問題とその解決方法を示します。
詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=572 を参照してください。
この種のクエリーは使用しないでください。
クエリーコンパイラは、仕様の Java Persistence 言語の章で定義されたすべてのルールをチェックするわけではありません。具体的には、次のチェックは行われません。
関数引数の型の互換性。
算術、論理、および比較演算子のオペランドの型の互換性。
ORDER BY クエリーの SELECT 句の要件。
無効なクエリーは、コンパイルできても実行時に SQLException が発生する可能性があります。また、配下のデータベースでは制約が少なく、生成された SQL がサポートされても、別のデータベースで同じクエリーを実行すると SQLException が発生して失敗する場合もあります。
上の条件を手動で確認してください。
JOIN 変数別にグループ化し、JOIN 変数を直接選択するクエリーを行うと、グループ化していない式が選択されていることを知らせる SQLException が発生する可能性があります。詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=197 を参照してください。次に例を示します。
SELECT AVG(o.totalPrice), c FROM Order o JOIN o.customer c GROUP BY c |
JOIN 変数を定義するのではなく、たとえば次のように直接関係を結びます。
SELECT AVG(o.totalPrice), o.customer FROM Order GROUP BY o.customer |
詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=550 を参照してください。
クエリー内の間違いを手動で確認してください。
異なるクラス名を使用してください。
詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=558 を参照してください。
MappedSuperclass の明示的な一覧表示はしないでください。
詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=578 を参照してください。
サブクラスでは ManyToMany 関係を使用しないでください。
詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=557 を参照してください。
代わりに java.util.Collection を使用してください。
Null にできるデータベース列にマップするには、Java ラッパータイプを使用してください。
詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=404 を参照してください。
クライアントへインスタンスを返す前に、サーバー側コードで LAZY 初期化関係にアクセスしてください。
関係フィールドを選択するクエリーを行った場合、関係フィールドの値が Null のときにクエリー結果に Null が含まれません。このエントリはたとえば次のように、クエリー結果から省略されます。
SELECT o.customer FROM Order o WHERE ... |
詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=637 を参照してください。
関連するインスタンスから状態フィールドを選択してください。
SELECT o.customer.customerId FROM Order o WHERE ... |
次に例を示します。
SELECT c FROM Order o LEFT OUTER JOIN o.customer c |
詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=638 を参照してください。
関連するインスタンスから状態フィールドを選択してください。
SELECT c.customerId FROM Order o LEFT OUTER JOIN o.customer c |
主キークラスが @IdClass 注釈で定義されている場合、EntityManager.find() を行うと、別のエントリのサブクラスであるエンティティーに対して IllegalArgumentException が誤って発生します。詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=595 を参照してください。
find() メソッドへの引数として、最上位のスーパークラスのクラスを使用し、その結果をサブクラスへキャストしてください。
詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=643 を参照してください。
初期値として java.util.ArrayList を使用してください。
ここでは、JavaServer Faces (JSF) に関する既知の問題とその解決方法を示します。JSF プロジェクトの Web サイトにアクセスすると、JSF プロジェクトの追加情報を確認したり、発生した JSF のバグを報告できます。
VariableResolver 装飾を使用して Expression Language の機能を拡張する JavaServer Faces テクノロジアプリケーションが、正しく機能しない場合があります。
JavaServer Faces 技術仕様の第 10.4.5 項には、次のように記述されています。
「デフォルトの PropertyResolver、VariableResolver、ActionListener、NavigationHandler、ViewHandler、または StateManager の置換値を与えると、デコレータデザインパターンが活用されます。この結果、該当するタイプの単一の引数をとるコンストラクタを与えた場合に、カスタム実装は、以前にロールを実行していた実装への参照を受け取ります。このようにして、カスタム実装は、機能のサブセットだけを変更し、または一部の追加機能だけを提供して、残りを既存の実装に委任することができます。」
Application Server 9 では、VariableResolver のカスタム実装は、変数解決のロールを十分には実行していない「以前」の VariableResolver を受け取ります。
式の解決を「以前」の VariableResolver に委任するのではなく、ValueExpression を作成して、これを評価することをお勧めします。
public class CustomVR extends VariableResolver { private VariableResolver previous = null; public CustomVR(VariableResolver previous) { this.previous = previous; } public Object resolveVariable(FacesContext context, String name) throws EvaluationException { Object result = null; // Do some action that may resolve the variable. If not, you // may be tempted to simply do: // result = previous.resolveVariable(context, name); // But this would not work due to bug 6419278. A fix is // available, please see the Release Notes. However, a // workaround is the following. ValueExpression ve = context.getApplication().getExpressionFactory(). \ createValueExpression(context.getELContext(), "#{" + name + "}", Object.class); try { result = ve.getValue(context.getELContext()); } catch (PropertyNotFoundException pnfe) { throw new EvaluationException(pnfe); } catch (ELException ele) { throw new EvaluationException(ele); } return result; } }
この節では、アップグレードとアップグレードツールの使用に関する既知の問題とその解決方法について説明します。
アップグレードユーティリティーを実行しているときに、install_dir をソースインストールディレクトリとして指定すると、そのアップグレードプロセスは、install_dir /domains ディレクトリの下に作成されたドメインだけをアップグレードします。その他の場所に作成されたドメインはアップグレードされません。
アップグレードプロセスを起動する前に、すべてのドメインディレクトリを、それぞれの場所から install_dir /domains ディレクトリに移動します。
この問題はさまざまな Linux システムで発生しています。Java Desktop System 2 でもっとも一般的ですが、RedHat ディストリビューションでも発生しています。
インストーラの最後の画面で「アップグレードツールの起動」ボタンをクリックすると、インストーラはアップグレード処理を完了するためのアップグレードツールの起動に失敗し、コマンドプロンプトに戻ることなくハングアップしたままになります。
この問題は、コマンド行インストールモードを使って代替アップグレードを実行している場合には発生しません。
GUI モードで代替アップグレードを実行してこの問題が発生した場合には、インストールプログラムを起動した端末ウィンドウで Ctrl+C を押すことにより、そのインストールプログラムを終了します。
その端末ウィンドウから次のコマンドを使ってアップグレードツールを起動します。
install_dir/bin/asupgrade --source install_dir/domains --target install_dir --adminuser adminuser--adminpassword adminpassword --masterpassword changeit |
adminuser および adminpassword は、アップグレード中のインストールで使用されている値に一致する必要があります。
アップグレードツールがアップグレードプロセスを完了したあとは、ブラウザを起動して次の URL を入力することにより、「バージョン情報」ページを参照できます。
file://install_dir/docs/about.html
製品を登録するインストールオプションを選択した場合には、「バージョン情報」ページ上の登録ページへのリンクをたどってください。
アップグレードツールでは、スタックサイズとヒープサイズに関連した JVM オプションなどは、インストール中に指定された値を保持すべきであるので移行しません。これは、これらのオプションの値が、現バージョンの製品に対する特定の理由のために設定されることが多いからです。アップグレードツールは、どのオプションが移行されなかったかを示すメッセージを記録します。
Application Server インストールをアップグレードしたら、docroot ディレクトリ内のすべての静的ドキュメントを新しい docroot ディレクトリにコピーしてください。同じ場所でアップグレードを行った場合は、インストール時の domaindir の下にあるバックアップされたドメインディレクトリからドキュメントをコピーしてください。
Windows 上でアップグレードツールを実行している間は、アップグレードするインストールですべてのファイルを閉じください。ファイルを開いておくと、アップグレードツールがハングアップすることが報告されています。
アップグレード後の Application Server で XWSCLientProvider および XWSServerProvider を使用するには、これらのプロバイダを使用するアプリケーションの配備記述子を、XWSClientProvider および XWSServerProvider を参照するように変更する必要があります。
変更する必要のある配備記述子は、sun-web.xml と sun-ejb-jar.xml です。アップグレードツールは、sun-web.xml または sun-ejb-jar.xml に ClientProvider および ServerProvider を見つけると、アップグレードログにメッセージを記録します。
ここでは、Web コンテナに関する既知の問題とその解決方法を示します。
web.xml のオプションの load-on-startup 要素は、サーブレットを宣言する Web アプリケーションの起動の一環として、そのサーブレットをロードおよび初期化すべきことを示します。
この制限は、Servlet 2.4 ベースの web.xml だけに適用されます。Servlet 2.5 ベースの web.xml を使用して、空の load-on-startup 要素を指定することは可能です。
この要素のオプションの内容は、Web アプリケーションのその他のサーブレットとの関係で、そのサーブレットをロードおよび初期化する順序を示す整数です。空の <load-on-startup/> は、そのサーブレットを含む Web アプリケーションの起動時にそのサーブレットがロードおよび初期化される場合、その順序は意味を持たないことを表します。
web.xml の Servlet 2.4 スキーマでは、空の <load-on-startup/> はサポートされなくなりました。つまり、Servlet 2.4 ベースの web.xml を使用する場合は整数値を指定する必要があります。<load-on-startup/> の場合と同様に、空の <load-on-startup/> を指定すると、web.xml が web.xml のサーブレット 2.4 スキーマに対する妥当性検証に失敗するため、Web アプリケーションの配備も失敗します。
下位互換性の問題もあります。空の <load-on-startup/> は、Servlet 2.3 ベースの web.xml では有効です。
Servlet 2.4 ベースの web.xml を使用する場合は、<load-on-startup/>0</load-on-startup/> を指定して、サーブレットの読み込み順序が問題にならないことを示します。
JSP ページにアクセスしてもコンパイルに失敗し、サーバーログには「Unable to execute command」というエラーメッセージと次のスタックトレースが記録されます。
at org.apache.tools.ant.taskdefs.Execute$Java13CommandLauncher.exec (Execute.java:655) at org.apache.tools.ant.taskdefs.Execute.launch (Execute.java:416) at org.apache.tools.ant.taskdefs.Execute.execute (Execute.java:427) at org.apache.tools.ant.taskdefs.compilers. DefaultCompilerAdapter.executeExternalCompile(DefaultCompilerAdapter. java:448) at org.apache.tools.ant.taskdefs.compilers.JavacExternal. execute(JavacExternal.java:81) at org.apache.tools.ant.taskdefs.Javac. compile(Javac.java:842) at org.apache.tools.ant.taskdefs.Javac.execute (Javac.java:682) at org.apache.jasper.compiler.Compiler.generateClass (Compiler.java:396)
JSP のコンパイルスイッチを fork から false に設定します。
これは、次のいずれかの方法で行えます。
グローバルに行うには、次のように、${S1AS_HOME}/domains/domain1/config/default-web.xml 内の JspServlet の fork init パラメータを false に設定します。
<servlet\> <servlet-name\>jsp</servlet-name\> <servlet-class\>org.apache. jasper.servlet.JspServlet</servlet-class\> .... <init-param\> <param-name\> fork</param-name\> <param-value\>false</param-value\> </init-param\> .... </servlet\>
Web アプリケーションごとに、sun-web.xml の JSP 設定プロパティー fork を false に設定します。次のようにします。
<sun-web-app\> <jsp-config\> <property name="fork" value="false" /\> </jsp-config\> </sun-web-app\>
これらのいずれかを設定することにより、ant が javac コンパイルのための新規プロセスを生成することが防止されます。
JSP にアクセスすると、特定の状況下で次の例外が記録されます。
java.lang.AbstractMethodError: org.apache.xerces.dom.DeferredDocumentImpl. setDocumentURI(Ljava/lang/String;)V |
次のシステムプロパティーを domain.xml ファイルに追加してください。
<jvm-options>-Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces. \ internal.jaxp.DocumentBuilderFactoryImpl</jvm-options> |
または、org.apache.xerces パッケージを含む JAR ファイルを、Web アプリケーションの WEB-INF/lib から削除します。
EAR ファイルにバンドルされた JAR パック JSP タグライブラリは、EAR の一部である WAR ファイルの JSP ページから参照できません。WAR ファイルの META-INF/MANIFEST.MF リソースが、その Class-Path マニフェスト属性でタグライブラリ JAR ファイルをリストしている場合でも参照できません。
EAR ファイルの JAR ファイルにパッケージされたタグライブラリをインポートする JSP ページにアクセスすると、次のようなエラーメッセージがサーバーログに表示され、JSP ページのコンパイルが失敗します。
The absolute uri: <taglib_uri> cannot be resolved in either web.xml or the jar files deployed with this application |
すべての JSP タグライブラリ JAR ファイルを、これらのタブライブラリをインポートする JSP ページを持つすべての WAR ファイルの WEB-INF/lib ディレクトリにバンドルしてください。
このバグに関する詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=590 の Glassfish のサイトを参照してください。
Windows システムでは、hostname や ipconfig /all などの Windows コマンドや、Java API InetAddress.getLocalHost().getHostName() が簡易ホスト名を返す場合でも、IP ベースの要求フィルタリングプロパティーの設定時には、Windows ホストに対し簡易名 (単なる myhost など) ではなく、完全修飾されたドメイン名 (myhost.mydomain.com など) を使用する必要があります。
たとえば、次のコマンドは、Windows ホスト foobar によるアクセスを拒否します。
asadmin --user adminuser --password adminpasswd --echo server.http-service.virtual-server.server.property.denyRemoteHost=foobar.sun.com
ホスト名は、DNS ドメイン名 foobar.sun.com で完全修飾されています。