Sun Java System Application Server Platform Edition 9 リリースノート

第 3 章 既知の問題点と制限事項

この節では、Sun Java System Application Server Platform Edition 9 製品に関する既知の問題とそれに関連する回避策について説明します。問題の説明にプラットフォームが明記されていない場合、その問題はすべてのプラットフォームに当てはまります。この節は次の項目から構成されています。

管理

domain1 が存在しない場合、package-appclient スクリプトが動作しない。(ID 6171458)

デフォルトでは、asenv.conf によってポイントされる domain1AS_ACC_CONFIG 変数のハードコードされた値が $INSTALL/lib/package-appclient.xml にあります。domain1 を削除して新たなドメインを作成した場合、AS_ACC_CONFIG 変数は新たなドメイン名で更新されません。その結果、package-appclient スクリプトの処理が失敗します。

解決方法

次のいずれかの操作を行います。

JMX エージェントを追加した Application Server の起動はサポートされていない。(ID 6200011)

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 管理ガイド』を参照してください。

display-error-statistics で負の数値が返される

管理コンソール 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 が MANIFEST ファイルを上書きする。(ID 6193556)

クライアント JAR (たとえば reporter.jar) 内に最上位レベルの JAR ファイルがある場合、クライアント JAR を配備すると、その JAR の MANIFEST ファイルがクライアント JAR の MANIFEST ファイルを上書きします。

解決方法

現時点ではありません。

Windows プラットフォーム – クラスパスに APPCPATH が設定されていない (ID 6419847)

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 システムで、「完了」ボタンをクリックしたあとにインストールの終了でハングアップする。(5009728)

この問題は、いくつかの Linux システム上で発生していました。これは Java Desktop System 2 でもっとも一般的に見られますが、RedHat ディストリビューションでも見られます。

インストーラの最後の画面で「完了」ボタンをクリックすると、インストーラは製品の「バージョン情報」ページまたは製品登録ページを表示するブラウザウィンドウの起動に失敗し、コマンドプロンプトに戻ることなくハングアップしたままになります。

解決方法

インストーラを起動した端末ウィンドウで Ctrl+C を押してインストーラを終了します。そのあとで、製品の「バージョン情報」ページまたは登録ページを表示するブラウザウィンドウが起動することがあります。ブラウザウィンドウが現れない場合には、ブラウザを起動してから次の URL を入力して「バージョン情報」ページを確認してください。

file://install_dir/docs/about.html

製品を登録するインストールオプションを選択した場合には、「バージョン情報」ページ上の登録ページへのリンクをたどってください。

Linux 上のインストールラッパーで J2SE の検出およびブートストラップに問題が発生することがある。(6172980)

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 変数が存在する場合など環境設定に依存するようです。

解決方法

この問題を回避するには、次の手順を実行します。

ProcedureLinux 上のブートストラップの問題を回避するには

  1. シェルに応じて unset または unsetenv を実行して、JAVA_HOME 変数の設定を解除します。

  2. -javahome オプションを使用して setup を実行して、インストーラが使用する JAVA_HOME を指定します。

ライフサイクル管理

ここでは、ライフサイクル管理に関する既知の問題とその解決方法を示します。

ejb-timer-service プロパティー minimum-delivery-interval9000 に設定したあとで、ejb-timer-service プロパティー redelivery-interval-in-mills 7000 に設定しようとすると、set コマンドが次のエラーで失敗する。(ID 6193449)

[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(default)=7000
redelivery-interval-in-millis(default)=5000

これらデフォルト以外の値を指定するとエラーが発生します。

Java Persistence API

この節では、Java Persistence API に関する既知の問題とその解決方法を示します。

WHERE 句でサブクエリーを使用する UPDATE または DELETE クエリーを行うと、クエリーのコンパイル中に NullPointerException が発生する。

詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=572 を参照してください。

解決方法

この種のクエリーは使用しないでください。

クエリーコンパイラが、Java Persistence 言語仕様で定義されたすべてのルールをチェックしない。

クエリーコンパイラは、仕様の Java Persistence 言語の章で定義されたすべてのルールをチェックするわけではありません。具体的には、次のチェックは行われません。

無効なクエリーは、コンパイルできても実行時に SQLException が発生する可能性があります。また、配下のデータベースでは制約が少なく、生成された SQL がサポートされても、別のデータベースで同じクエリーを実行すると SQLException が発生して失敗する場合もあります。

解決方法

上の条件を手動で確認してください。

JOIN 変数別にグループ化し、JOIN 変数を直接選択するクエリーを行うと、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 を参照してください。

解決方法

クエリー内の間違いを手動で確認してください。

現在、同じクラスを含む 2 つの持続性ユニットを、同一の EAR ファイルに配備できない。

解決方法

異なるクラス名を使用してください。

persistence.xml のクラス要素を使用して、MappedSuperclass を明示的に一覧表示できない。

詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=558 を参照してください。

解決方法

MappedSuperclass の明示的な一覧表示はしないでください。

継承されたクラスで、@ManyToMany のエンティティーマッピングが失敗する。

詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=578 を参照してください。

解決方法

サブクラスでは ManyToMany 関係を使用しないでください。

関係に List<> を使用すると、MetadataHelper.getAttributeNameFromMethodNameStringIndexOutOfBoundException が発生する。

詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=557 を参照してください。

解決方法

代わりに java.util.Collection を使用してください。

Null のデータベース値をプリミティブにマップできない。

解決方法

Null にできるデータベース列にマップするには、Java ラッパータイプを使用してください。

クライアント側から LAZY 初期化関係にアクセスすると、NullPointerException が発生する場合がある。

詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=404 を参照してください。

解決方法

クライアントへインスタンスを返す前に、サーバー側コードで LAZY 初期化関係にアクセスしてください。

関係フィールドを選択するクエリーを行った場合、クエリー結果に Null が含まれない。

関係フィールドを選択するクエリーを行った場合、関係フィールドの値が 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 ...

単一値の関係フィールドに対して定義された JOIN 識別変数を選択するクエリーを行うと、無効な SQL になる場合がある。

次に例を示します。


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

EntityManager.find() を行うと、誤って IllegalArgumentException が発生する。

主キークラスが @IdClass 注釈で定義されている場合、EntityManager.find() を行うと、別のエントリのサブクラスであるエンティティーに対して IllegalArgumentException が誤って発生します。詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=595 を参照してください。

解決方法

find() メソッドへの引数として、最上位のスーパークラスのクラスを使用し、その結果をサブクラスへキャストしてください。

関係フィールドを java.util.HashSet に設定したエンティティーを持続できない。

詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=643 を参照してください。

解決方法

初期値として java.util.ArrayList を使用してください。

JavaServer Faces

ここでは、JavaServer Faces (JSF) に関する既知の問題とその解決方法を示します。JSF プロジェクトの Web サイトにアクセスすると、JSF プロジェクトの追加情報を確認したり、発生した JSF のバグを報告できます。

JSF 1.1 - 1.2 仕様違反: 変数およびプロパティーリゾルバ (ID 6419278)

VariableResolver 装飾を使用して Expression Language の機能を拡張する JavaServer Faces テクノロジアプリケーションが、正しく機能しない場合があります。

JavaServer Faces 技術仕様の第 10.4.5 項には、次のように記述されています。

「デフォルトの PropertyResolverVariableResolverActionListenerNavigationHandlerViewHandler、または StateManager の置換値を与えると、デコレータデザインパターンが活用されます。この結果、該当するタイプの単一の引数をとるコンストラクタを与えた場合に、カスタム実装は、以前にロールを実行していた実装への参照を受け取ります。このようにして、カスタム実装は、機能のサブセットだけを変更し、または一部の追加機能だけを提供して、残りを既存の実装に委任することができます。」

Application Server 9 では、VariableResolver のカスタム実装は、変数解決のロールを十分には実行していない「以前」の VariableResolver を受け取ります。

解決方法

式の解決を「以前」の VariableResolver に委任するのではなく、ValueExpression を作成して、これを評価することをお勧めします。


例 3–1 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;

    }
}

アップグレード

この節では、アップグレードとアップグレードツールの使用に関する既知の問題とその解決方法について説明します。

Application Server Platform Edition 8 から Application Server Platform Edition 9 へのアップグレードで、install_dir /domains ディレクトリ以外のカスタムパスに作成されたドメインが直接アップグレードされない。(ID 6165528)

アップグレードユーティリティーを実行しているときに、install_dir をソースインストールディレクトリとして指定すると、そのアップグレードプロセスは、install_dir /domains ディレクトリの下に作成されたドメインだけをアップグレードします。その他の場所に作成されたドメインはアップグレードされません。

解決方法

アップグレードプロセスを起動する前に、すべてのドメインディレクトリを、それぞれの場所から install_dir /domains ディレクトリに移動します。

一部の Linux システムで「アップグレードウィザードを起動」ボタンをクリックしたあとに、「同じ場所にアップグレード」を実行するインストーラがアップグレードツールの起動に失敗する。(6207337)

この問題はさまざまな Linux システムで発生しています。Java Desktop System 2 でもっとも一般的ですが、RedHat ディストリビューションでも発生しています。

インストーラの最後の画面で「アップグレードツールの起動」ボタンをクリックすると、インストーラはアップグレード処理を完了するためのアップグレードツールの起動に失敗し、コマンドプロンプトに戻ることなくハングアップしたままになります。

解決方法

この問題は、コマンド行インストールモードを使って代替アップグレードを実行している場合には発生しません。

Procedureコマンド行インストールモードを使用するには

  1. GUI モードで代替アップグレードを実行してこの問題が発生した場合には、インストールプログラムを起動した端末ウィンドウで Ctrl+C を押すことにより、そのインストールプログラムを終了します。

  2. その端末ウィンドウから次のコマンドを使ってアップグレードツールを起動します。


    install_dir/bin/asupgrade --source install_dir/domains --target install_dir 
    --adminuser adminuser--adminpassword adminpassword --masterpassword changeit

    adminuser および adminpassword は、アップグレード中のインストールで使用されている値に一致する必要があります。

  3. アップグレードツールがアップグレードプロセスを完了したあとは、ブラウザを起動して次の URL を入力することにより、「バージョン情報」ページを参照できます。

    file://install_dir/docs/about.html

    製品を登録するインストールオプションを選択した場合には、「バージョン情報」ページ上の登録ページへのリンクをたどってください。

アップグレードツールで、JVM オプションの一部が移行されない (ID 6409650)

アップグレードツールでは、スタックサイズとヒープサイズに関連した JVM オプションなどは、インストール中に指定された値を保持すべきであるので移行しません。これは、これらのオプションの値が、現バージョンの製品に対する特定の理由のために設定されることが多いからです。アップグレードツールは、どのオプションが移行されなかったかを示すメッセージを記録します。

アップグレード後、静的ドキュメントを docroot ディレクトリにコピーする必要がある (ID 6409641)

Application Server インストールをアップグレードしたら、docroot ディレクトリ内のすべての静的ドキュメントを新しい docroot ディレクトリにコピーしてください。同じ場所でアップグレードを行った場合は、インストール時の domaindir の下にあるバックアップされたドメインディレクトリからドキュメントをコピーしてください。

Windows 上でアップグレードツールを実行するときに、Application Server のファイルを閉じる必要がある

Windows 上でアップグレードツールを実行している間は、アップグレードするインストールですべてのファイルを閉じください。ファイルを開いておくと、アップグレードツールがハングアップすることが報告されています。

XWSClientProvider および XWSServerProvider を使用した場合、ユーザー名トークンが暗号化されない (ID 6409652)

アップグレード後の Application Server で XWSCLientProvider および XWSServerProvider を使用するには、これらのプロバイダを使用するアプリケーションの配備記述子を、XWSClientProvider および XWSServerProvider を参照するように変更する必要があります。

変更する必要のある配備記述子は、sun-web.xml sun-ejb-jar.xml です。アップグレードツールは、sun-web.xml または sun-ejb-jar.xml に ClientProvider および ServerProvider を見つけると、アップグレードログにメッセージを記録します。

Web コンテナ

ここでは、Web コンテナに関する既知の問題とその解決方法を示します。

空の <load-on-startup/> 要素を持つ Servlet 2.4 ベースの web.xml を使用して WAR を配備できない。(ID 6172006)

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.xmlweb.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 ページをコンパイルできない。(ID 6184122)

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 に設定します。

これは、次のいずれかの方法で行えます。

これらのいずれかを設定することにより、antjavac コンパイルのための新規プロセスを生成することが防止されます。

ParserUtils が Web アプリケーションからのパーサーを選択する (ID 6412405)

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 に TLD がない。(Glassfish の問題 590)

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 XP および Windows Server 2003 で denyRemoteHost および allowRemoteHost プロパティーを設定するときに、完全修飾されたドメイン名を使用する必要がある (ID 6377272)

Windows システムでは、hostnameipconfig /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 で完全修飾されています。