Trouble 4: クラスパスに関する問題
<Q4-1>サーバプログラムもクライアントプログラムもクラスパス設定はあっているのに、Naming.bind()、Naming.lookup()でSkel/Stubクラスが見つからないことが原因のRemoteExceptionが発生してしまいます。
| <発生環境> |
| OS |
RedHatLinux6.1/6.2 |
| JDK |
JDK1.2/JDK1.3 |
| Vender |
Sun |
- <A4-1>
- サーバプログラムやクライアントプログラムのcodebaseを正しく設定することで解決できます。
rmiregistryにCLASSPATH環境変数で対象のクラスファイルを設定するという回避策もありますが、rmiregistryの環境設定が必要となるため、推奨されません。
また、codebaseを設定した場合はrmiregistryにCLASSPATHを設定してはいけません。
<Q4-2>java.lang.Stringなど、Java標準APIで用意されているクラスへパッチを適用したい時に、元の環境を壊すことなく実現する方法はありませんか。
| <発生環境> |
| OS |
any |
| JDK |
any |
| Vender |
any |
- <A4-2>
- 以下の方法を用いれば、標準jarファイルに手を加えることなく、パッチ適用を実現することができます。
set customClass=(修正したクラスへのパス)
java -Xbootclasspath/p:%customClass%
<Q4-3>「-classpath」と「-jar」オプションを併用し、それぞれ異なるjarファイルを指定して実行したところ、NoClassDefFoundErrorが発生しました。
クラスパスで指定していたクラス群を、otherlib.jarとしてまとめ、以下のように起動したのですが、otherlib.jarを読み込めずjava.lang.NoClassDefFoundErrorが発生しました。
なお、マニフェストファイルにてMain-Classの指定を正しく行っています。
java -classpath otherlib.jar -jar myprog.jar
※NoClassDefFoundErrorについての初心者向けのやさしい解説は、「初心者のためのJava講座」番外編3をご覧下さい。
| <発生環境> |
| OS |
any |
| JDK |
any |
| Vender |
any |
- <A4-3>
- Javaプログラムを-jar オプションで起動する際は、マニフェストファイルでClass-Pathエントリを設定する必要があります。
マニフェストファイルに以下のエントリを作成し、Jarファイルを作り直して下さい。
詳細はこちらを参照
-------------------------------------
Manifest-Version: 1.0
Created-By: Ant 1.4.1
Main-Class: test.jar.MainClass
Class-Path: otherlib.jar ←この行を追加
-------------------------------------
なお、-classpathは不要ですので、以下のように実行します。
java -jar myprog.jar
注意:本文書の内容に誤りがあり、またこの文書によって不利益を被っても、
Acroquest Technology 株式会社は一切関知いたしません。