• ベストアンサー

Classの起動パスの取得方法

Javaで public static void main( String args[] ) が呼び出されたとき、Cであればargv[0]に 自身の起動パスが設定されていますが、 JavaではArgs[0]は1番目の引数が入るだけなので その目的には使えないようです。 起動されたClassファイルが置かれているパス を知る方法を教えていただけないでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • UKY
  • ベストアンサー率50% (604/1207)
回答No.1

Java の標準機能ではそれをすることは出来ません。というのも、クラスファイルがどのような形態にあるのかわからないからです。 クラスファイルが Jar ファイルの中にある場合を考えてみてください。この場合、クラスファイルはディスクのファイルシステム上にそのまま存在するわけではありません。そうなると、クラスファイルを「ディスク上のひとつのファイル」として扱うことは出来なくなりますから、必然的にクラスファイルの場所を通常の方法で表すことは出来なくなります。 しかし、クラスファイルの場所を取得する裏技がないわけでもありません。 java.lang.Class クラスにある getResource メソッドを使って、クラスファイル自身をリソースとして検索すると、クラスファイルの URL がわかります。URL から、クラスファイルの絶対パスを調べることが出来ます。ただし、100%確実にいくという保障はありません。

uemon
質問者

お礼

UKYさん、さっそくの回答ありがとうございます。 |クラスファイルが Jar ファイルの中にある場合を考えてみてください そうですか。(私はまだjarファイルを扱ったことが ないのでよく分かっていません(^^;) |しかし、クラスファイルの場所を取得する裏技がないわけでもありません ~以下略~ 丁寧な解説ありがとうございます。こちらの方法は 望みありそうですね。 実験してみます。 (そもそも、main()関数を持つClassファイルと 同一ディレクトリに初期化ファイルのようなもの を置いて使うというUNIX/Winでよくやるような 発想自体が、ひょっとしたらJava的ではないのか なという気もしてきました) 重ねてありがとうございました。

その他の回答 (1)

  • takaP-
  • ベストアンサー率79% (83/105)
回答No.2

#1さんと、他の方の質問からヒントを得てソースを 書いてみたのですが、、、かなり苦しい物になって しまって掲載するのが恥ずかしいのですが (^^; main()メソッドの最初のところ辺りで。。。 String s=ClassLoader.getSystemResource((new Throwable().getStackTrace())[0].getClassName() + ".class" ).toString() ; で、何とか取る事が出来ました。 もっと簡単に取る方法もあるのでしょうが、さっぱり 代案が思いつかない状態でして、ホント済みません。

uemon
質問者

お礼

takaP-さん、こんにちは。 (さきほどの追伸です。「補足」を2度 アップする方法がわからないので御礼のほう からアップさせていただきます) getStackTrace()がsymbolエラーになる理由 が分かりました。これはJDK1.4からのメソッド なんですね。私は1.3環境なのでそれで未定義に なったようです。 アドバイスいただいたお二人の方の回答を参考 にして少し実験してみます。ありがとうござい ました。

uemon
質問者

補足

takaP-さん、こんにちは。 どうも詳しく調べていただき恐縮です。 いまコンパイルしてみたのですが、 ------------ ソース ------------ public class GetMyPath { public static void main(String args[]) { String s=ClassLoader.getSystemResource((new Throwable().getStackTrace())[0].getClassName() + ".class" ).toString() ; System.out.println("MyPth=[" + s + "]" ); } } ------------ コンパイル結果 ------------ $ javac GetMyPath.java GetMyPath.java:11: cannot resolve symbol symbol : method getStackTrace () location: class java.lang.Throwable String s=ClassLoader.getSystemResource((new Throwable().getStackTrace()) [0].getClassName() + ".class" ).toString() ; ということで、エラーになりました。 私はまだ初心者のため何か肝心なことを書き忘れて いるのかと思いますが・・。 (書いていただいたソースで使っているオブジェクト を見るかぎり importは java.lang.* の範囲内のよう に思うのですが、他に明にimportするものがあるので しょうか?。ちなみに私の環境はJDK1.3です) 初心者的なことでお手数をおかけして恐縮です。 よろしくお願いします。

関連するQ&A