S-JIS[2008-08-01/2008-08-15] 変更履歴

BEA WebLogic Server 10


インストール

  1. ダウンロードサイトからアーカイブをダウンロードしてくる。
    (Windows版のWLS10.0Jは800MBちょっとあって、ダウンロードだけで40分くらい時間がかかる。(約360kB/s)
    WLS10.3tech previewだと500MBちょっとなので、25分くらい[2008-08-05]
  2. アーカイブを実行するとインストーラーが立ち上がるので、指示にしたがって選択していく。
    (開発には、サンプルやPlatformは不要か?)

10.0Jのデフォルト状態なら、C:\bea\wlserver_10.0にインストールされる。
10.3tpはC:\bea\wlserver_10.3tp。[2008-08-05]


ドメインの作成

  1. Windowsの「スタート」→「プログラム(P)」→「BEA Products」→「Tools」→「Configration Wizard」で「BEA WebLogic Configutation Wizard」が起動する。
  2. 「新しいWebLogicドメインの作成」を選択して「次へ」
  3. 「WebLogic Server」(デフォルト)を選択して「次へ」
  4. パスワードを決めて入力し、「次へ」
  5. 起動モードで「開発モード(開発モードが開発用、プロダクションモードは運用用?)を選択し、
    JDK(BEA提供のものを選択した方が面倒が無くてよい)を選択して「次へ」
  6. カスタマイズの種類は、ひとまず「いいえ」で「次へ」
    管理コンソールのポート番号(デフォルトは7001)や名称(デフォルトはAdminServer)を変えたい場合は「はい」を選ぶ。
  7. ドメイン名(base_domain)とドメインの場所(C:\bea\user_projects\domains)を入力して「作成(C)」
  8. 作成できたら「完了(D)」

なお、WebLogic Server10.0のデフォルトはJDK1.5、10.3のデフォルトはJDK1.6のようだ。[2008-08-05]


WLS10.0JではJavaSE6(Java6)は不可?

ドメイン作成の途中でJDKの場所が聞かれる[2008-08-03]
WLS10.0JのデフォルトはJDK1.5なのだが、ここで自分でインストールしたSunのJDK1.6を選択すると、うまく動かない。(WinxowsXP SP3・C:\Program Files\Java\jdk1.6.0

まず第一に、ドメインの起動で失敗する。

The JRE was not found in directory C:\PROGRA~1\Java\JDK16~1.0.6.0. (JAVA_HOME)
Please edit your environment and set the JAVA_HOME
variable to point to the root directory of your Java installation.

起動に使われるC:\bea\user_projects\domains\base_domain\bin\setDomainEnv.cmdの中に以下のような箇所がある。

set JAVA_HOME=%JAVA_HOME%
for %%i in ("%JAVA_HOME%") do set JAVA_HOME=%%~fsi

この%~sはWindowsの長いファイル名・ディレクトリー名を(8.3形式の)短縮名に変換する指定なのだが、たまに変な値が語尾に付いて、正しい名前にならない事がある。WindowsXPのバグ?
jdk1.6.0」というディレクトリー名の正式な短縮名は「JDK16~1.0」なのに、語尾に「.6.0」という余計なものが付いてくる。
そのため、実際には存在しないディレクトリーを指すことになり、エラーになってしまう。

そこで、試しに固定でJAVA_HOMEに正しい短縮形を入れてみた。

rem set JAVA_HOME=%JAVA_HOME%
rem for %%i in ("%JAVA_HOME%") do set JAVA_HOME=%%~fsi
set JAVA_HOME=C:\PROGRA~1\Java\JDK16~1.0

すると、ドメインは起動するようになった。
のだが、いざウェブアプリをデプロイしようとすると失敗する。

<2008/08/03 3時37分37秒 JST> <Warning> <Deployer> <BEA-149189> <デプロイメント _appsdir_sample_dir の
 null BasicDeploymentMBean に対して 'deploy' を使用しようとしています。サーバを再起動するまで操作を実行できません。>
<2008/08/03 3時37分38秒 JST> <Warning> <Deployer> <BEA-149004> <アプリケーション'_appsdir_sample_dir' の
 deploy タスクの開始中にエラーが検出されました。>
<2008/08/03 3時37分38秒 JST> <Warning> <Deployer> <BEA-149078> <メッセージ 149004 のスタック トレース
weblogic.management.DeploymentException: [Deployer:149189]デプロイメント _appsdir_sample_dir の
 null BasicDeploymentMBean に対して 'deploy' を使用しようとしています。サーバを再起動するまで操作を実行できません。
	at weblogic.deploy.internal.targetserver.DeploymentManager.assertDeploymentMBeanIsNonNull(DeploymentManager.java:1281)
	at weblogic.deploy.internal.targetserver.DeploymentManager.findDeploymentMBean(DeploymentManager.java:1322)
	at weblogic.deploy.internal.targetserver.DeploymentManager.createOperation(DeploymentManager.java:1022)
	at weblogic.deploy.internal.targetserver.DeploymentManager.createOperations(DeploymentManager.java:1368)
	at weblogic.deploy.internal.targetserver.DeploymentManager.handleUpdateDeploymentContext(DeploymentManager.java:160)
	Truncated. see log file for complete stacktrace

こうなると、門外漢には原因はさっぱり分からないなぁ…。
(ちなみに、長いディレクトリー名のままダブルクォーテーションでくくってJAVA_HOMEに入れると、tools.jarが見つけられなくてcom.sun.tools.javac.Mainが無いというエラーになる)

試しにSunのJDK1.5のディレクトリーを 短縮名で指定した場合はちゃんと動いたので、やはりJDK1.6だと何かがまずいのだろう。

まぁ、WebLogic10.0のサポート対象にはWindowsXP SP3は入っていないし、JDK1.6も含まれてはいないからなぁ。
(というか、JDKのバージョンについては何も書かれてないんだけど)


WLS10.3tpでJavaSE6(Java6)は?

WebLogic Server10.3tp(英語版)のConfigutation Wizardでは、JDK1.6がBEA提供のJDK一覧にちゃんと含まれている。[2008-08-05]

しかしながら、ドメインの起動で失敗。

Unable to start WebLogic Server!
Error: Can not find: WebLogic Server 10.3 in the license file.
Please make sure you have a valid license.bea

「C:\bea\license.bea」というライセンスファイルがあるのだが、そこに10.3の定義が入っていないらしい。

    <license-group format="1.0" product="WebLogic Server" release="10.3"/>

…これじゃ入っている内に入らないのかな?
10.0の所には内容がいっぱい書かれているから、10.3はたぶん中身が無いのがおかしいのだろう。

そしてしかも、先に入れていたWebLogic Server10.0Jのドメインも起動しなくなった(爆)

<2008/08/05 23時37分21秒 JST> <Critical> <WebLogicServer> <BEA-000386> <Server subsystem failed.
 Reason: java.lang.StringIndexOutOfBoundsException: String index out of range: -10
java.lang.StringIndexOutOfBoundsException: String index out of range: -10
	at java.lang.String.substring(String.java:1768)
	at com.bea.utils.misc.ProcessParserHelper.getComponentList(Unknown Source)
	at com.bea.utils.misc.ProcessParser.getProcessGroup(Unknown Source)
	at com.bea.utils.misc.ProcessManager.getProcessGroup(Unknown Source)
	at com.bea.utils.misc.ProcessManager.memCheck(Unknown Source)
	at com.bea.utils.misc.ProcessManager.memCheck(Unknown Source)
	at weblogic.t3.srvr.LicenseService.start(LicenseService.java:21)
〜

明らかにライセンスファイルが壊れたとしか思えない(嘆)

インストールしたWebLogicを一旦クリアして出直すことにする。

  1. 10.0Jと10.3tpをアンインストールする。
  2. c:\beaを削除する。
  3. Windowsの「スタート」→「プログラム(P)」→「BEA Products」を削除する。(「BEA Products」を右クリック→「削除(D)」)

そして10.3tpをインストールし直してドメインも再作成して起動すると…、ライセンス期限切れとか言われるし!

Unable to start WebLogic Server!
WebLogic: license has expired on 2008-04-15!
Please make sure you have a valid license.bea

話にならん。

さらにもう一度クリアして10.0Jをインストールし直したら、こちらは動くようになった。ふぅ。危ない危ない。
日本語版の10.3が出るまで待った方が良さそうだ。


ドメインの起動/停止

ドメイン(サーバー)の起動は、以下の手順で行う。

Windowsの「スタート」→「プログラム(P)」→「BEA Products」→「User Projects」→「base_domain」→「Start Admin Server for Weblogic Server Domain」

実体は、以下の場所にあるバッチファイル
C:\bea\user_projects\domains\base_domain\bin\startWebLogic.cmd

コマンドプロンプト(のウィンドウ)が起動する。
以下のメッセージが出れば起動完了。

<2008/08/01 20時21分22秒 JST> <Notice> <WebLogicServer> <BEA-000360> <Server started in RUNNING mode>

このコマンドプロンプトのウィンドウを閉じるとサーバーが終了するが、正式には停止コマンドを実行する。
Windowsの「スタート」→「プログラム(P)」→「BEA Products」→「User Projects」→「base_domain」→「Stop Admin Server」
C:\bea\user_projects\domains\base_domain\bin\stopWebLogic.cmd


管理コンソールを開く

管理コンソールを開くには、ドメイン(サーバー)を起動してから、以下の手順で行う。

Windowsの「スタート」→「プログラム(P)」→「BEA Products」→「User Projects」→「base_domain」→「Admin Server Console」

(現在開いているブラウザーが適当に使われるので、素直に「http://localhost:7001/console/」にアクセスするのが良さげ)

それにしても、ログイン画面でパスワードを入れてから実際に画面が開くまで、やけに時間が(50秒以上も)かかるような気がする。


画面イメージ(デザイン)はWebLogic8.1とはけっこう変わったが、内容自体はそんなに変わってない…のかな?

管理コンソール上で色々な値を設定(登録・変更)することが出来るが、その際はまずロックする必要がある。(そうしないと、値の入力欄が入力可能状態にならない)
画面に「チェンジセンタの[ロックして編集]ボタンをクリックします」と書いてある通り、画面左上にある「チェンジセンタ」という枠の中にある「ロックして編集」ボタンを押すことで 編集(登録・変更)できるようになる。

最後に(「ロックして編集」ボタンの位置にあった)「変更のアクティブ化」ボタンを押せば、登録完了。
メッセージ欄に「すべての変更がアクティブ化されました。再起動は不要です。」と表示される。

のだが、再起動しないと実際に反映されないことがあるような気がする。
(ただ単に即座に反映されないだけで、(再起動しなくていいんだけど)しばらく待つ必要はある、ということなのだろうか)


サンプル実験

最も単純なHTML・JSP

まず最初に動作確認したい場合は、WebLogicの自動デプロイを使うのが簡単(開発モードのWebLogicで使用可能)。[2008-08-02]
オートデプロイ用ディレクトリーの下にEARWARファイルやそれに相当するディレクトリーを作ると、自動的にデプロイしてくれる。

C:\bea\user_projects\domains\base_domain\autodeploy
の下にディレクトリーを作り、WEB-INF/web.xmlを置く。web.xmlは、HTMLJSPを 表示してみたいだけなら最小構成でよい。
そしてHTMLファイルやJSPファイルを入れればよい。

>cd C:\bea\user_projects\domains\base_domain\autodeploy
C:\bea\user_projects\domains\base_domain\autodeploy>tree /f
フォルダ パスの一覧
ボリューム シリアル番号は BYYY-9ZZZ です
C:.
│  readme.txt	…最初からautodeployディレクトリーに入っている説明ファイル
│
└─testsample.jsptest.html
    │
    └─WEB-INF
            web.xml

この例の場合、以下のURLでアクセスできる。
http://localhost:7001/test/test.html
http://localhost:7001/test/sample.jsp

(autodeploy直下のディレクトリー名がそのままコンテキストルートになる)

コンテンツのファイル類は置き換えれば自動的に反映される(再起動などは不要)。
しかしweb.xmlはWebLogicを再起動しないと反映されないようだ。

ウェブアプリ(EAR・WARファイルやそれらのディレクトリー)を削除する場合は、WebLogic起動中に行わなければならない。
そうでないと、次回起動時に設定だけ残ってしまって、同名のウェブアプリを作ろうとして誤動作に苦しむことになるかも…?
(というか、エラーのあるウェブアプリを修正した際のデプロイが、正常に実行されているのかどうかよく分からない。管理コンソールから状態を見れば分かるんだけど、管理コンソールへのログインがいちいち時間かかってしょうがないし)


最も単純なサーブレット

HTTPサーブレットを呼び出すにはweb.xmlを記述する必要がある。 (この辺りはTomcat5.5と同様)[2008-08-02]

そして、WEB-INF直下にclassesディレクトリーを作り、Javaのクラスファイルを置けばよい。


web.xmlの記述エラー

WebLogic10はXMLのチェックにうるさいみたいで、例えば以下のような記述だとWebLogic起動時にエラーになってデプロイされない。[2008-08-02]

C:\bea\user_projects\domains\base_domain\autodeploy\sample\WEB-INF\web.xml:

<?xml version="1.0" encoding="Shift_JIS"?>
<web-app>
	<servlet>
		<servlet-class>jp.hishidama.sample.SampleServlet</servlet-class>
		<servlet-name>test</servlet-name>
	</servlet>
</web-app>
<2008/08/02 13時00分12秒 JST> <Error> <HTTP> <BEA-101064> <[WebAppModule(_appsdir_sample_dir:sample)]
Web アプリケーション "C:\bea\user_projects\domains\base_domain\autodeploy\sample" の記述子を解析できません。
weblogic.application.ModuleException: VALIDATION PROBLEMS WERE FOUND
problem: cvc-complex-type.2.4a: Expected element 'servlet-name@http://java.sun.com/xml/ns/javaee'
instead of 'servlet-class@http://java.sun.com/xml/ns/javaee'
here in element servlet@http://java.sun.com/xml/ns/javaee:<null>
problem: cvc-complex-type.2.4c: Expected elements 'servlet-class@http://java.sun.com/xml/ns/javaee jsp-file@http://java.sun.com/xml/ns/javaee'
before the end of the content in element servlet@http://java.sun.com/xml/ns/javaee:<null>

何が間違っているかというと、servlet-classservlet-nameの順序。
普通は(というか正しくは)servlet-nameが先に来る。
(beaのweb.xml デプロイメント記述子の要素には、順序については特に書かれていないが…)

エラーメッセージの1つ目は、「servlet要素のこの位置では、servlet-classでなくservlet-nameでなければならない」。
エラーメッセージの2つ目は、「servlet要素が終わる前にservlet-classかjsp-fileが必要」。
って感じかな?外国語にはさっぱり自信なし

「http://java.sun.com/xml/ns/javaee」っていうのは、XMLスキーマらしい。
J2EE1.4では、本来は「<web-app xmlns="http://java.sun.com/xml/ns/javaee">」と書くらしいが、省略してもそれが使われているのだろう。

参考: @ITのJ2EE1.4に対応したweb.xmlを記述する

web.xmlを使わない方法?


クラスロードエラー

<servlet-class>で指定されているクラスが見つからないと、以下のようなエラーがコンソールに出力される。[2008-08-02]

Failed to load servlet Class: jp.hishidama.sample.SampleServlet
Ignoring: unable to load class:java.lang.ClassNotFoundException: jp.hishidama.sample.SampleServlet
at: weblogic.xml.schema.binding.util.ClassUtil.loadClass(ClassUtil.java:76)

ここで掲示するに当たって適宜改行を入れてみたけれど、実際にはこれが全く改行されずに繋がって出力される!
最初に「SampleServletIgnoring」という語を見て、「そんなクラスは作った覚えが無い。勝手に生成されたのか?」と悩んでしまった(苦笑)

また、新しいJDKバージョンでコンパイルしたクラスを使おうとすると、以下のような(似て非なる)メッセージのエラーになる。

Failed to load servlet Class: jp.hishidama.sample.SampleServlet
Ignoring: unable to load class:java.lang.ClassNotFoundException:
Class bytes found but defineClass() failed for: 'jp.hishidama.sample.SampleServlet'
at: weblogic.xml.schema.binding.util.ClassUtil.loadClass(ClassUtil.java:76)

コンパイルする際のバージョンは、WebLogic10を動かしているJREのバージョン以下でなければならない。(JavaVMは、自分より新しいバージョンでコンパイルされたクラスファイルを実行できない為
WebLogic10のデフォルトはJDK1.5なので、そこで動かすクラスファイルはJDK1.5以下でなければならない。(例えばEclipseでJDK1.6でコンパイルして自動デプロイディレクトリーにコピーしたりしたら、このエラーになる)


EJBのデプロイ

EJB3.0でインターフェースやビーンをコーディングしたら、JDK1.5でコンパイルして(WebLogic10.0はJDK1.5対応だから)、以下のような場所にコピーする。[2008-08-15]
WebLogic10の自動デプロイのディレクトリーの下にejb1というディレクトリーを作った)

C:\bea\user_projects\domains\base_domain\autodeploy>tree /f ejb1
フォルダ パスの一覧
ボリューム シリアル番号は BYYY-9ZZZ です
C:\BEA\USER_PROJECTS\DOMAINS\BASE_DOMAIN\AUTODEPLOY\EJB1
├─sample
│  └─ejb3
│      └─stateless
│              Ejb3Sample.class
│              Ejb3SampleBean.class
│
└─META-INF

jarファイルを展開した形になっている必要がある為、META-INFディレクトリが必要。ただし中身は空でOK。
(こういうejb1というディレクトリーでなく、jarファイル化して、autodeploy直下にそのjarファイルを置いてもよい)

この状態でWebLogic10(ドメイン)を起動すると、自動的にデプロイされてEJBとして使えるようになる。
管理コンソールの「デプロイメント」で見ると、名前は「_appsdir_ejb1_dir (自動デプロイ)」、種類は「EJB」。状態が「アクティブ」になっていればOK。
また、JNDIツリーで見ると「ejb3_sample#sample/ejb3/stateless/Ejb3Sample」があるはず。


JMSキューの登録

WebLogic10でJMSの新しいキューを登録する手順。[2008-08-01]

  1. JMSサーバーを作成する(既にあれば不要)
    1. 管理コンソールから「サービス」→「メッセージング」→「JMSサーバ」をクリックする。
    2. 「新規作成」ボタンをクリックする。
    3. JMSサーバーの名前JMSServer-0とか)を入れて「次へ」
    4. 対象にサーバー(AdminServer)を選択して「完了」
       
  2. JMSモジュールを作成する(既にあれば不要)
    1. 管理コンソールから「サービス」→「メッセージング」→「JMSモジュール」をクリックする。
    2. 「新規作成」ボタンをクリックする。
    3. システムモジュールの名前SystemModule-0とか)を入れて「次へ」
    4. 対象のサーバー(AdminServerとか)にチェックを入れて「次へ」
    5. 「このモジュールにリソースを追加しますか」にチェックを入れて「完了」
       
  3. サブデプロイメントを作成する(既にあるか、キュー作成時に一緒に作るのであれば不要)
    1. 管理コンソールから「サービス」→「メッセージング」→「JMSモジュール」をクリックする。
    2. JMSモジュール(SystemModule-0とか)をクリックする。
    3. 「サブデプロイメント」(画面上部のタブみたいな感じ)をクリックする。
    4. 「新規作成」ボタンをクリックする。
    5. サブデプロイメント名sub-deployment-0とか)を入力して「次へ」
    6. 対象のJMSサーバー(JMSServer-0とか)にチェックを入れて「完了」
       
  4. キューを作成する
    1. 管理コンソールから「サービス」→「メッセージング」→「JMSモジュール」をクリックする。
    2. JMSモジュール(SystemModule-0とか)をクリックする。
    3. リソースの概要の「新規作成」ボタンをクリックする。
    4. キューを選択して「次へ」
    5. 名前(Queue-0とか。これはWebLogicで管理される(管理コンソール上に表示される)名前)と
      JNDI名MyQueue0とか。送信受信プログラムからはこの名前を指定する)を入れて「次へ」
    6. サブデプロイメント(sub-deployment-0とか)を選択して「完了」
      (選択せずに「新しいデプロイメント作成」ボタンで作ることも可)

きちんと登録されているかどうかは、JNDIツリーで確認する。


JNDIのコンテキスト取得

JNDIを使用するには最初にコンテキストを取得する必要があるが、WebLogicでは(サーブレット・EJB以外の場合は)以下のようにして取得する。
JMSでの使用例
サーブレットの場合のコンテキスト取得方法

import javax.naming.*;

	public static Context initContext() throws NamingException {
		Hashtable<String, String> ht = new Hashtable<String, String>();
		ht.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
		ht.put(Context.PROVIDER_URL, "t3://localhost:7001");

		InitialContext ctx = new InitialContext(ht);
		return ctx;
	}
import javax.naming.*;
import weblogic.jndi.Environment;

	public static Context initContext() throws NamingException {
		Environment env = new Environment();
		env.setProviderUrl("t3://localhost:7001");

		Context ctx = env.getInitialContext();
		return ctx;
	}

javax.namingパッケージはJava標準のライブラリーに入っているので普通に使える。
Environmentクラスを使う方式の場合は WL_HOME/server/lib/weblogic.jarをコンパイル時のクラスパスに加える必要がある。


稼動しているWebLogicのドメイン内に登録されているJNDI名を確認するにはJNDIツリーを使用する。[2008-08-03]

  1. 管理コンソールの「環境」→「サーバー」を選択する。
  2. 自分のサーバー(AdminServerとか)をクリックする。
  3. 「JNDIツリーの表示」をクリックする。メイン画面の説明「このページでは、デフォルトのネットワーク通信など、このサーバの 全般的な機能をコンフィグレーションします。」のすぐ下にある。
    すると、別ウィンドウで「JNDI Browser」が開く。
  4. 左側の「JNDIツリー構造」にJNDI名の一覧がツリー形式で表示されるので、その末端をクリックすると情報が表示される。

JNDI名「weblogic.jms.ConnectionFactory」の場合だと、以下のような感じになる。

JNDIツリー構造
AdminServer
├ejb
├javax
├MyQueue0weblogic
 ├cluster
 ├common
 ├consnaming
 ├fileSystem
 ├jms
 │├backend
 │├ConnectionFactory
 │├MessageDrivenBeanConnectionFactory
〜

サーブレット2.5

サーブレット2.5の仕様では、サーブレットに対してアノテーションを付けてもいいことになったらしく、
WebLogic10では、WLServletという独自アノテーションが用意された。

このアノテーションは、web.xmlの<servlet>や<servlet-mapping>に相当する情報が入れられる。

import weblogic.servlet.annotation.WLServlet;

@WLServlet(name = "sample", mapping = { "/test/*", "/sample/*" })
public class SampleServlet extends HttpServlet {
	〜
}

WL_HOME/server/lib/weblogic.jarをコンパイル時のクラスパスに加える必要がある。

このアノテーションを付けることにより、web.xmlへの<servlet>や<servlet-mapping>の定義を書かなくても
サーブレットコンテナが自動的に認識してくれるようになる。

と謳われているように思われるのだが、実際に試しても認識されんぞ


WebLogicへ戻る / 技術メモへ戻る
メールの送信先:ひしだま