マイグレーションに関するその他の制約

  • EJB 1.0 仕様に従う Enterprise bean のマイグレーション

WebSphere Application Server 4.0 は、EJB 1.0 仕様で開発された Enterprise bean をサポートします。しかし GlassFish アプリケーションサーバーは EJB 1.0 bean をサポートしません。マイグレーションツールは、この Enterprise bean を EJB 1.1 仕様に準拠するよう、最小限の面倒を見ますが、この実装には完全な信頼性が無く、移行したアプリケーションの配備時に明るみに出るような食い違いを引き起こす場合があります。
この制限を回避するには、マイグレーションの前に bean のコードを EJB 1.1 準拠となるよう修正してください。

  • WebLogic Application Server 6.0/6.1 からのアプリケーションのマイグレーション
  • WebLogic 6.1 は、CMP entity bean の主キーの値のために自動的にキーを生成する機能が組み込まれています。このキー生成の仕組みを使って bean を生成した場合、WebLogic EJB コンテナはデータベースへの挿入時にこの主キーを自動的に割り当てます。注意 - GlassFish アプリケーションサーバーには同等の機能が無いため、この機能はアプリケーションの一部としてマイグレートされません。

この制限を回避するには、CMP entity bean がこの機能を使わないように書き換えてください。Floyd Marinescu の EJB Design Paterns に役に立つ情報が書かれています。

  • WebLogic 6.0 は、EJB 2.0 仕様では禁止されている、リモートインターフェースを通しての 2つの bean 間の EJB relationships (CMRs) を使えます。EJB relationship は現在ローカルインターフェースでしか使えません。relationship に加わる enterprise bean はローカルインターフェースを持っている必要があります。リモートインターフェースを使っての relationship は EJB 2.0 仕様から削除されました。また、関連する bean は同じ EJB JAR ファイル内に配備されている必要があります。

WebLogic 6.0 がリリースされたときにはまだこの制約が無かったため、現在禁止されているこの機能を使ったアプリケーションは、手作業で EJB 2.0 仕様に従うよう修正する必要があります。
http://edocs.bea.com/wls/docs61/notes/migrate60to61.html
この制限を回避するには、CMP entity bean 間のすべての CMRs がローカルインターフェースで行われ、関連する bean が同じ EJB JAR ファイルの中にあるように、マイグレーションの前または後に手作業で修正してください。

  • WebLogic 6.0 は EJB-QL の替わりに ejb-jar.xml ファイルの中に WLQL を書けます。この WLQL はマイグレーションツールでは移行されません。

この制限を回避するには、マイグレーション後の GlassFish アプリケーションサーバーにアプリケーションを配備する前に、手作業で WLQL を同等の EJB-QL に置き換えてください。

  • アプリケーションの移行は、サーバーローカルを仮定しています。

マイグレーションツールは、移行されるアプリケーションがサーバーローカルにあることを仮定しています。すなわち、アプリケーションのすべてのメソッドコールやオブジェクトコールは、サーバーのローカルにあるメソッド/オブジェクトを参照するよう移行されます。この点を説明するため、接続情報を持ったコードがマイグレーションツールで修正されたところを以下にに示します。
元のコードは次のものです。

Properties h = new Properties();
h.put(Context.INITIAL_CONTEXT_FACTORY, m_INITIAL_CONTEXT_FACTORY);        
h.put(Context.PROVIDER_URL, m_PROVIDER_URL);        
h.put(Context.SECURITY_PRINCIPAL, user);        
h.put(Context.SECURITY_CREDENTIALS, password);        
.....        
InitialContext ctx = new InitialContext(h);

このコードの断片は、次に示すように空の IntialContext コンストラクタに置き換えられます。

InitialContext ctx = new InitialContext();
.....

従って、サーバーローカルではないアプリケーションの移行を行うときには、ツールはリモートオブジェクトコールが存在していないと仮定しているという、この問題を心に留めておいてください。
この制限を回避するには、移行前にリモートオブジェクトへのすべてのコールを調べておきます。次にマイグレーションツールでアプリケーションをパスさせます。そして、元のリモートオブジェクトコールに戻すよう、変更されたコードの断片を変更します。特に、元のコードにあった URL やその他の接続プロパティを手作業で追加してくださ。

  • マイグレーションツールは JSP カスタムタグの getter や setter メソッドを適切に扱えません。

GlassFish アプリケーションサーバーは JSP 1.2 と JSP 2.0 仕様をサポートしています。JSP 1.2 仕様の実装では、カスタムタグの中にあるアトリビュートの getter や setter メソッドを返し、同じデータ型を受け付けなければなりません。マイグレーションツールは、次の例で説明するように、このシナリオを扱うことができません。
つぎのコードは、元のタグハンドラークラスです。

public class Listtag extends TagSupport{
  int numIterms;  public int getNumItems() {
      return numItems;
  }
  
  public void setNumItems(String numItemsStr) 
    numItems = Integer.parseInt(numItemsStr);
  } 
  
}

GlassFish アプリケーションサーバーが要求するタグハンドラークラスは次のようになります。

public class Listtag extends TagSupport{
  int numIterms;  public int getNumItems() {
      return numItems;
  }
  
  public void setNumItems(int numItemsStr) 
    numItems = Integer.parseInt(numItemsStr);
  } 
  
}

この制限を回避するには、移行したアプリケーションが GlassFish アプリケーションサーバーが期待する動作をするようタグハンドラークラスの中を手作業で修正してください。

  • 移行されたコードにあるコメント化されたメソッドコールの影響

GlassFish アプリケーションサーバーは、System.setOut() のような、いくつかのシステムコールの使用に制限があり、使った場合には実行時アクセスコントロール例外を引き起こします。典型的な例としては、System.out ストリームが server.log ファイルに送られ、この送り先を変えると、サーバーのロギング機能に問題を起こします。実行時例外を回避するために、マイグレーションツールは、移行するコードでそのような呼び出しがある場合に次の例のようにコメントアウトします。
こちらが元のコードです。

public void init(ServletConfig config) throws ServletException{
        super.init(config);
        Logger.initialize("astp.query.log", "Console");
        Logger.log(Logger.LOGTYPEISMESSAGE, "SrvQueryControlloer", "init", "got here!");

        try{
        System.setOut(new PrintStream(new ServletOutputStreamAdapter
                (new FileOutputStream("sys.out"))));
        }catch(IOException eio){throw new ServletException(eio);}
}

こちらが、コメントアウトされた移行コードです。

public void init(ServletConfig config) throws ServletException{
        super.init(config);
        Logger.initialize("astp.query.log", "Console");
        Logger.log(Logger.LOGTYPEISMESSAGE, "SrvQueryControlloer", "init", "got here!");

        try{
        /*Removed call to System.setOut()*/
        }catch(IOException eio){throw new ServletException(eio);}
}

しかしながら、この例で注意して欲しいのは、try/catch ブロック内にそのメソッドコールしかなくて、これがコメントアウトされると、IOException は try/catch ブロックからスローされないため、コンパイル時にエラーとなる点です。マイグレーションツールは次のような問題を検出できないため、制限があります。

  • コメントアウトされたメソッドコールが try/catch ブロックが扱う例外を上げるものか。
  • コメントアウトされたメソッドコールが try/catch ブロックの唯一のコールか。

この制限を回避するには、この状況を知らせるマイグレーションレポートを見て、必要に応じて例外を引き起こす部分をコメントアウトするなどの対応をしてください。

  • 移行された EAR ファイル内のディレクトリ構成の影響

マイグレーションツールは JAR ファイルが EAR ファイルの直下にあることを想定しています。ツールでは入れ子になった JAR ファイルの移行をサポートしていません。移行を成功させるために、すべての JAR ファイルが EAR ファイルの直下に配置してください。
次の例は、サポートされない EAR ファイル構成を示しています。

EAR
 |
 |
 |---Lib/lib.jar
 |
 |
 |---EJBs
 |    |---EJB1.jar
 |    |---EJB2.jar
 |
 |---WEB
 |    |---WEB1.war
 |    |---WEB2.war

EAR ファイル構成を、次の例に示すように、移行が成功する形式に修正する必要があります。

EAR
 |
 |
 |---lib.jar
 |
 |---EJB1.jar
 |
 |---EJB2.jar
 |
 |---WEB1.war
 |
 |---WEB2.war
  • Solaris でサポートされないエンコーディングタイプ "Cp1252"

"Cp1252 エンコーディングタイプを配備記述子に使うことは Solaris ではサポートされません。この制限を回避するには、移行を Windows 2000/NT/XP といった Windows プラットフォームだけで行うか、エンコーディングタイプを Windows プラットフォームでも Solaris でもサポートできる "UTF-8" に変更します。


日本語翻訳: shioda

英文 (翻訳したバージョン: 5)