ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Java質問&情報提供サイトコミュのクラスパスの追加方法

  • mixiチェック
  • このエントリーをはてなブックマークに追加
java初心者です。

プログラム上でクラスパスを追加するプログラムを作成しなければならないのですが
どうにも、動きません。
拡張クラスローダのメソッドで、"addUrls()"がありました。
そのメソッドは、下記のようになっています。

public void addUrls(URL[] urls) {
  for (int i = 0; i < urls.length; i++) {
try {
  String ext = urls[i].toExternalForm();
  String formatted = ext.substring(ext.indexOf("/") + 1);
  pool.appendClassPath(formatted);
} catch (NotFoundException e) {
  e.printStackTrace();
}
  }
}

コンストラクタで、"pool"は、インスタンス化されています。
で、引数"formatted"には、jarファイルのパス名が入っています。(c:\bdmv\00000.jar)
しかし、"pool.appendClassPath( )"を実行しても、クラスパスが追加されません。
例外エラーは、発生していません。
クラスパスの確認は、以下で確認しています。

String classpath = System.getProperty("java.class.path");

どうにもわかりません。
どのようなことでも構いませんので、ご教示ください。
よろしくお願いします。

コメント(6)

拡張クラスローダーって自作or課題で出されたクラスじゃない?
ClassLoader継承したら、なんでも拡張クラスローダーですよ?

poolの型は?
appendClassPathメソッドで追加してるのは、本当に"java.class.path"のプロパティーでいいの?

てことで、ぶっちゃけ誰も何も分からないと思います。
"java.class.path"はJava VMの起動時に決定されるものなので、pool.appendClassPath()で追加した結果を、"java.class.path"で確認することはできないです。

appendClassPath()で追加したjarが正しく設定されているかどうかは、
そのjarに含まれているクラスが次のいずれかのメソッドでロードできるかどうかを確認してみてください。

- Class.forName(String, boolean, ClassLoader)
- ClassLoader.loadClass(String, boolean)
例えばマニフェストを次のように作成して、JARにしたら駄目ですか?

Manifest-Version: 1.0
Class-Path: ./a.jar ./b.jar
Main-Class: Main

java初心者です。

>檸檬さん
public final class XletClassLoader extends ClassLoader {
です。
poolの型は、ClassPoolです。

>たぁぼさん
"java.class.path"で確認することはできないんですか!知りませんでした。

>角氏
マニフェストファイルは、さわれないんですよ。

もう一度、詳細を説明いたします。

オープンソースの"XletView"を使って、Blu-rayのBD-Jを動かそうとしています。
開発ツールは、"eclipse3.4.1"を使っています。

動かすアプリケーションは、ゲームです。
開発ツール上で、クラスパスを追加するとゲームは動きます。
(クラスパスの追加なのか、わかりませんが、、、)
(開発ツールのメニュのプロジェクト>プロパティ>Javaビルドパス>ライブラリ>外部jarファイルの追加、を行います)

動くときは、ゲームアプリケーションのプログラムで、画像ファイルURLを取得するメソッドで、正しい値が返ってきます。
しかし、動かないときは、NULLになります。
そのメソッドは、
URL up = getClass().getResource("/up.png");
です。

そしてプログラムでクラスパスを追加するために、appendClassPath()を見つけまして動かしてみたのですが、やはりNULLが返ってきます。

URL取得メソッドとappendClassPath()は、関係ないのでしょうか?
URLが取得できれば、いいだけなのですが、、、、

難しくて、お手上げ状態です。
以上、よろしくお願いします。

自己レスです。

クラスパス追加は、リフレクションを利用して行うみたいです。
試してみます。
クラスパスを実行時に変更する方法に付いては以前自身のブログに書きましたが、
おっしゃられている通りリフレクションで可能です。
http://shinoblogbyshiva.blogspot.com/2008/05/applet.html
ただし、実装依存になりますので、今後ずっと使える保証はありません。

リソースのURLが取得したいだけであれば、クラスパスを追加する必要はありません。
開発ツール上でクラスパスを追加でjarファイルを指定しているということは、コマンドラインからの実行時にjarへのクラスパスを指定していないのではないかと想像します。
もしそうであれば、VM引数としてクラスパスを指定(jarファイルの位置を指定)すれば大丈夫だと思います。

java -cp c:/bdmv/00000.jar YourMainClass

上記のような形で実行してみてください。
現在の情報からはこのぐらいしか推測できません。

エラー発生時のメッセージ等をのせていただければより詳しく分かるかもしれません。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Java質問&情報提供サイト 更新情報

Java質問&情報提供サイトのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング