|
10.0Jのデフォルト状態なら、C:\bea\wlserver_10.0にインストールされる。
10.3tpはC:\bea\wlserver_10.3tp。[2008-08-05]
なお、WebLogic Server10.0のデフォルトはJDK1.5、10.3のデフォルトはJDK1.6のようだ。[2008-08-05]
ドメイン作成の途中で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のバージョンについては何も書かれてないんだけど)
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を一旦クリアして出直すことにする。
そして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とはけっこう変わったが、内容自体はそんなに変わってない…のかな?
管理コンソール上で色々な値を設定(登録・変更)することが出来るが、その際はまずロックする必要がある。(そうしないと、値の入力欄が入力可能状態にならない)
画面に「チェンジセンタの[ロックして編集]ボタンをクリックします」と書いてある通り、画面左上にある「チェンジセンタ」という枠の中にある「ロックして編集」ボタンを押すことで
編集(登録・変更)できるようになる。
最後に(「ロックして編集」ボタンの位置にあった)「変更のアクティブ化」ボタンを押せば、登録完了。
メッセージ欄に「すべての変更がアクティブ化されました。再起動は不要です。」と表示される。
のだが、再起動しないと実際に反映されないことがあるような気がする。
(ただ単に即座に反映されないだけで、(再起動しなくていいんだけど)しばらく待つ必要はある、ということなのだろうか)
まず最初に動作確認したい場合は、WebLogicの自動デプロイを使うのが簡単(開発モードのWebLogicで使用可能)。[2008-08-02]
オートデプロイ用ディレクトリーの下にEAR・WARファイルやそれに相当するディレクトリーを作ると、自動的にデプロイしてくれる。
C:\bea\user_projects\domains\base_domain\autodeploy
の下にディレクトリーを作り、WEB-INF/web.xmlを置く。web.xmlは、HTMLやJSPを
表示してみたいだけなら最小構成でよい。
そして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ディレクトリーに入っている説明ファイル │ └─test │ sample.jsp │ test.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のクラスファイルを置けばよい。
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-classとservlet-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を記述する
<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でコンパイルして自動デプロイディレクトリーにコピーしたりしたら、このエラーになる)
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」があるはず。
WebLogic10でJMSの新しいキューを登録する手順。[2008-08-01]
きちんと登録されているかどうかは、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]
JNDI名「weblogic.jms.ConnectionFactory」の場合だと、以下のような感じになる。
JNDIツリー構造 AdminServer ├ejb ├javax ├MyQueue0 └weblogic ├cluster ├common ├consnaming ├fileSystem ├jms │├backend │├ConnectionFactory │├MessageDrivenBeanConnectionFactory 〜
サーブレット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>の定義を書かなくても
サーブレットコンテナが自動的に認識してくれるようになる。
と謳われているように思われるのだが、実際に試しても認識されんぞ。