May 8, 2002 onlax2, Digital UNIX V5.0 (Rev. 910) システムでのJavaRMIの実行 --- hello world実行#1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (http://www-online.kek.jp/~inoue/para-CAMAC/ Test/Hello-JavaRMI.html) 高エネルギー加速器研究機構 素粒子原子核研究所 物理、オンライングループ 井上 栄二 (1). 現状確認 (A). Webサーバ、onlax2にjava version "1.1.7B-6" がインストール されている。 (2). ここでやるべきこと Digital UNIX V5.0 (Rev. 910)、onlax2のマシン上でJavaRMIでのhello world を実行する。 (3). コンパイル (3-1). Javaのチェック onlax2.kek.jp[96]% java -version java version "1.1.7B-6" onlax2.kek.jp[97]% (3-2). 実行環境 onlax2.kek.jp[97]% env TERM=vt100 HOME=/people/inoue SHELL=/bin/csh USER=inoue LOGNAME=inoue PATH=.:/people/inoue/bin:/usr/jsy/bin:/usr/ucb:/bin:/usr/bin:/usr/local/X11/bin: /kek/bin:/people/inoue/onlsun1/bin:/usr/local/bin:/usr/bin/X11:/usr/new:/usr/loc al/bin/mh:/usr/sbin:/usr/jsy/new/emacs:/usr/hosts:/kek/local/bin SHLVL=1 I18NPATH=/usr/i18n LANG=ja_JP MANPATH=/usr/local/majordomo-1.94.4/man MAIL=/usr/spool/mail/inoue EXINIT=set redraw wm=8 PRINTER=ps KCODE=EUC WWW_HOME=http://www.kek.jp NNTPSERVER=keknews.kek.jp DOMAINNAME=kek.jp JSERVER=localhost CLASSPATH=/people/inoue/public_html/myclasses onlax2.kek.jp[98]% (3-3). サーバ側の準備 この実行で使用するソースコードは、以下のURLから入手した。 http://java.sun.com/j2se/1.4/ja/docs/ja/guide/rmi/archives/getStart.zip パッケージ名は examples.hello、ソースディレクトリは ~/JavaRMI/getStart/examples/hello である。 onlax2.kek.jp[98]% pwd /people/inoue/JavaRMI/getStart/examples/hello onlax2.kek.jp[99]% ls -l ディスク上の専有領域の合計 5 (KBytes) -rw-r--r-- 1 inoue kek 175 06月05日 1998 Hello.java -rw-r--r-- 1 inoue kek 751 06月05日 1998 HelloApplet.java -rw-r--r-- 1 inoue kek 956 06月05日 1998 HelloImpl.java -rw-r--r-- 1 inoue kek 245 10月01日 1998 hello.html -rw-r--r-- 1 inoue kek 81 10月01日 1998 policy onlax2.kek.jp[100]% *.java ソースファイルをコンパイルして、.class ファイルを作成する。 次に rmic コンパイラを実行してスタブとスケルトンを作成する。 javac や rmic コンパイラを使うときは、生成されるクラスファイルをどの ディレクトリに置くかを指定しなければならない。 アプレットの場合には、 すべてのファイルをアプレットのコードベースディレクトリに置く必要がある。 この例では、コードベースディレクトリはonlax2:$HOME/public_html/myclasses になる。 (3-3-1). ランタイムパスを設定する onlax2.kek.jp[105]% setenv CLASSPATH .:$HOME/public_html/myclasses:$HOME/JavaRMI /getStart/examples/hello onlax2.kek.jp[106]% printenv CLASSPATH .:/people/inoue/public_html/myclasses:/people/inoue/JavaRMI/getStart/examples/he llo onlax2.kek.jp[107]% onlax2.kek.jp[125]% pwd /people/inoue/public_html/myclasses onlax2.kek.jp[126]% ls -l ディスク上の専有領域の合計 0 (KBytes) onlax2.kek.jp[127]% (3-3-2). ソースファイルをコンパイルする onlax2.kek.jp[130]% pwd /people/inoue/JavaRMI/getStart/examples/hello onlax2.kek.jp[131]% ls -l ディスク上の専有領域の合計 5 (KBytes) -rw-r--r-- 1 inoue kek 175 06月05日 1998 Hello.java -rw-r--r-- 1 inoue kek 751 06月05日 1998 HelloApplet.java -rw-r--r-- 1 inoue kek 956 06月05日 1998 HelloImpl.java -rw-r--r-- 1 inoue kek 245 10月01日 1998 hello.html -rw-r--r-- 1 inoue kek 81 10月01日 1998 policy onlax2.kek.jp[132]% onlax2.kek.jp[132]% cat Hello.java package examples.hello; import java.rmi.Remote; import java.rmi.RemoteException; public interface Hello extends Remote { String sayHello() throws RemoteException; } onlax2.kek.jp[133]% onlax2.kek.jp[133]% cat HelloApplet.java package examples.hello; import java.applet.Applet; import java.awt.Graphics; import java.rmi.Naming; import java.rmi.RemoteException; public class HelloApplet extends Applet { String message = "blank"; // "obj" is the identifier that we'll use to refer // to the remote object that implements the "Hello" // interface Hello obj = null; public void init() { try { obj = (Hello)Naming.lookup("//" + getCodeBase().getHost() + "/HelloServer"); message = obj.sayHello(); } catch (Exception e) { System.out.println("HelloApplet exception: " + e.getMessage()); e.printStackTrace(); } } public void paint(Graphics g) { g.drawString(message, 25, 50); } } onlax2.kek.jp[134]% onlax2.kek.jp[134]% cat HelloImpl.java package examples.hello; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.RMISecurityManager; import java.rmi.server.UnicastRemoteObject; public class HelloImpl extends UnicastRemoteObject implements Hello { public HelloImpl() throws RemoteException { super(); } public String sayHello() { return "Hello World!"; } public static void main(String args[]) { // Create and install a security manager if (System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); } try { HelloImpl obj = new HelloImpl(); // Bind this object instance to the name "HelloServer" Naming.rebind("HelloServer", obj); System.out.println("HelloServer bound in registry"); } catch (Exception e) { System.out.println("HelloImpl err: " + e.getMessage()); e.printStackTrace(); } } } onlax2.kek.jp[135]% onlax2.kek.jp[135]% cat hello.html <HTML> <title>Hello World</title> <center> <h1>Hello World</h1> </center> The message from the HelloServer is: <p> <applet codebase="myclasses/" code="examples.hello.HelloApplet" width=500 height=120> </applet> </HTML> onlax2.kek.jp[136]% onlax2.kek.jp[136]% cat policy grant { // Allow everything for now permission java.security.AllPermission; }; onlax2.kek.jp[137]% onlax2.kek.jp[137]% javac -d $HOME/public_html/myclasses Hello.java HelloImpl.ja va HelloApplet.java onlax2.kek.jp[138]% onlax2.kek.jp[138]% ls -lR $HOME/public_html/myclasses ディスク上の専有領域の合計 1 (KBytes) drwxr-x--x 3 inoue kek 512 05月08日 14:12 examples/ /people/inoue/public_html/myclasses/examples: ディスク上の専有領域の合計 1 (KBytes) drwxr-x--x 2 inoue kek 512 05月08日 14:12 hello/ /people/inoue/public_html/myclasses/examples/hello: ディスク上の専有領域の合計 5 (KBytes) -rw-r--r-- 1 inoue kek 282 05月08日 14:12 Hello.class -rw-r--r-- 1 inoue kek 1364 05月08日 14:12 HelloApplet.class -rw-r--r-- 1 inoue kek 1306 05月08日 14:12 HelloImpl.class onlax2.kek.jp[139]% (3-3-3). rmic を使ってスタブまたはスケルトンを生成する onlax2.kek.jp[139]% pwd /people/inoue/JavaRMI/getStart/examples/hello onlax2.kek.jp[140]% ls -l ディスク上の専有領域の合計 5 (KBytes) -rw-r--r-- 1 inoue kek 175 06月05日 1998 Hello.java -rw-r--r-- 1 inoue kek 751 06月05日 1998 HelloApplet.java -rw-r--r-- 1 inoue kek 956 06月05日 1998 HelloImpl.java -rw-r--r-- 1 inoue kek 245 10月01日 1998 hello.html -rw-r--r-- 1 inoue kek 81 10月01日 1998 policy onlax2.kek.jp[141]% rmic -d $HOME/public_html/myclasses examples.hello.HelloImpl onlax2.kek.jp[142]% onlax2.kek.jp[142]% ls -lR $HOME/public_html/myclasses ディスク上の専有領域の合計 1 (KBytes) drwxr-x--x 3 inoue kek 512 05月08日 14:12 examples/ /people/inoue/public_html/myclasses/examples: ディスク上の専有領域の合計 1 (KBytes) drwxr-x--x 2 inoue kek 512 05月08日 14:18 hello/ /people/inoue/public_html/myclasses/examples/hello: ディスク上の専有領域の合計 9 (KBytes) -rw-r--r-- 1 inoue kek 282 05月08日 14:12 Hello.class -rw-r--r-- 1 inoue kek 1364 05月08日 14:12 HelloApplet.class -rw-r--r-- 1 inoue kek 1306 05月08日 14:12 HelloImpl.class -rw-r--r-- 1 inoue kek 1569 05月08日 14:18 HelloImpl_Skel.class -rw-r--r-- 1 inoue kek 1854 05月08日 14:18 HelloImpl_Stub.class onlax2.kek.jp[143]% (3-3-4). HTML ファイルを配置ディレクトリに移す onlax2.kek.jp[144]% pwd /people/inoue/JavaRMI/getStart/examples/hello onlax2.kek.jp[145]% ls -l ディスク上の専有領域の合計 5 (KBytes) -rw-r--r-- 1 inoue kek 175 06月05日 1998 Hello.java -rw-r--r-- 1 inoue kek 751 06月05日 1998 HelloApplet.java -rw-r--r-- 1 inoue kek 956 06月05日 1998 HelloImpl.java -rw-r--r-- 1 inoue kek 245 10月01日 1998 hello.html -rw-r--r-- 1 inoue kek 81 10月01日 1998 policy onlax2.kek.jp[146]% cp hello.html $HOME/public_html onlax2.kek.jp[147]% ls -l $HOME/public_html/hello.html -rw-r--r-- 1 inoue kek 245 05月08日 14:22 /people/inoue/public_htm l/hello.html onlax2.kek.jp[148]% (4). RMI レジストリ、サーバ、およびアプレットを起動する (4-1). RMI レジストリを起動する RMI レジストリは、単純なサーバ側のネームサーバで、これによりリモート クライアントは、リモートオブジェクトへの参照を取得できる。 onlax2.kek.jp[156]% ps PID TTY S TIME CMD 222558 pts/5 I + 0:00.83 -csh (csh) 217202 pts/11 S 0:01.98 -csh (csh) 223862 pts/12 I + 0:00.90 -csh (csh) 52373 pts/14 I + 0:00.57 -sh (csh) onlax2.kek.jp[157]% rmiregistry & [1] 224727 onlax2.kek.jp[158]% (4-2). サーバを起動する onlax2.kek.jp[159]% java -Djava.rmi.server.codebase=http://onlax2.kek.jp/~inoue/ myclasses/ -Djava.security.policy=$HOME/JavaRMI/getStart/examples/hello/policy e xamples.hello.HelloImpl HelloServer bound in registry (4-3). アプレットを実行する この状態でWebブラウザで "http://onlax2.kek.jp/~inoue/hello.html" に アクセスすると、"Hello World!" と表示される。 (4-4). サーバ側プロセスの停止 onlax2.kek.jp[159]% java -Djava.rmi.server.codebase=http://onlax2.kek.jp/~inoue/ myclasses/ -Djava.security.policy=$HOME/JavaRMI/getStart/examples/hello/policy e xamples.hello.HelloImpl HelloServer bound in registry onlax2.kek.jp[160]% ps PID TTY S TIME CMD 222558 pts/5 I + 0:00.83 -csh (csh) 217202 pts/11 S 0:02.03 -csh (csh) 224727 pts/11 I 0:00.15 /usr/ucb/../bin/alpha/native_threads/rmiregist 224868 pts/11 S 0:05.90 /usr/ucb/../bin/alpha/native_threads/java sun/ 223862 pts/12 I + 0:00.97 -csh (csh) 52373 pts/14 I + 0:00.57 -sh (csh) onlax2.kek.jp[161]% kill -KILL 224868 onlax2.kek.jp[162]% /usr/ucb/../bin/alpha/native_threads/rmiregistry: 224868 Kil led [1] 終了コード -119 rmiregistry onlax2.kek.jp[162]% ps PID TTY S TIME CMD 222558 pts/5 I + 0:00.83 -csh (csh) 217202 pts/11 S 0:02.04 -csh (csh) 223862 pts/12 I + 0:00.97 -csh (csh) 52373 pts/14 I + 0:00.57 -sh (csh) onlax2.kek.jp[163]% ---xxxx