• ベストアンサー

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

  • 起動引数の表示

    Java勉強中の初心者です。 起動引数の表示について お尋ねしたいことがあります。 起動引数が入力された場合には そのまま表示、無い場合は ”起動引数無し” と表示させたいのですが 下記のソースだと java.lang.ArrayIndexOutOfBoundsException のエラーが発生してしまいます。 このような場合はどのようにしたら よいのですか? よろしくお願いします。 ---------------------------------------------- public class Ren1 { public static void main(String args[]) { if(args[0].equals(null)){ System.out.println("起動引数無し"); } String s = args[0]; System.out.println(s); } }

    • ベストアンサー
    • Java
  • classが作られない

    javaをはじめて2日目です。以下がコンパイルしたところ、エラーがでなかったのですが、classが作られていません。何回か試したのですが、参考書には、 >javac Sample2.java とし、もう一度ディレクトリ名が出れば、コンパイル完了とあるのですが、classが作れていないので、実行が出来ません。 すみませんが、教えてください。 //画面に文字を出力するコード class Sample1 { public static void main(String args[]) { System.out.println("ようこそjavaへ!"); System.out.println("javaをはじめましょう!"); } } ちなみに保存名は、Sample2.javaです。

    • ベストアンサー
    • Java
  • コマンドライン引数はどこからやって来たのですか?

    こんにちは Javaで、 public static void main(String args[]) という引数は、どこからやって来たのでしょうか? これがコマンドラインに初めて書かれる文だとしたら、どこから引数を貰うのでしょうか? また、2番目に書いたクラスだったとしても、他のクラスのなかのものをそんな簡単に貰うことはできるのでしょうか? もし宜しければ回答お願い致します。

    • ベストアンサー
    • Java
  • public class HelloFriendsFor2 {

    public class HelloFriendsFor2 { public static void main(String[] args) { System.out.print("Hello "); for (String name : args) { System.out.print(name); System.out.print(" "); } System.out.println(); } } } for文の結果を見るためどうしたらいいですか? 本ではこうやって書いてたんですけど c:\javac HelloFriendsFor2.java c:\java HelloFriendsFor2 HI HELLO NICE TO MEET YOU netbeansで見る方法はないですか?

    • ベストアンサー
    • Java
  • プログラム内でのPath設定

    javaのプログラム内でパスを設定することはできますか? public class Test { public static void main(String[] args) { System.setProperty("java.library.path", System.getProperty("java.library.path") + ";C:/library/path"); System.loadLibrary("library"); } } 上のようにすると以下のエラーが出ます。 java.lang.UnsatisfiedLinkError: no library in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1517) at java.lang.Runtime.loadLibrary0(Runtime.java:788) at java.lang.System.loadLibrary(System.java:834) at Test.main(Test.java:6) Exception in thread "main" 環境変数「PATH」に C:/library/path を設定すると System.loadlibrary("library") で libraryを読み込むことができます。 なぜ上のやり方では読み込めないか教えてください。

    • ベストアンサー
    • Java
  • mainメソッドと同じオブジェクト内のメソッドにはstaticを必ずつ

    mainメソッドと同じオブジェクト内のメソッドにはstaticを必ずつけなければならないのでしょうか? そのような記述を見掛けたのですが、もしこれが正しいという場合、 それは、なぜなのでしょう? java初心者ですが、どうぞ宜しくお願いいたします。 class MainClass{  //先頭のstaticに注目  static void sub(){   ~~  }  //mainメソッド  public static void main(String[] args){   sub();  } }

    • ベストアンサー
    • Java
  • Javaについて教えてください!

    sampleパッケージに属するMain.javaとSub.javaがあり、Main.javaのmainはSub.javaのsubメソッドを呼び出して「OK」と表示させるプログラムを教えてください! //Main.java package sample; public class Main{ public static void main(String[] args){ Sub.sub(); }} //Sub.java package sample; public class Sub{ static String str = "OK"; public static void sub(){ System.out.println(str); }} String型の変数strはクラス変数で行いたいのですが、どこを改善すれば良いでしょうか?

    • ベストアンサー
    • Java
  • コンパイル時のエラー。

    いつも大変お世話になりありがとうございます。 public static void main(String[] args)は何の意味があるのですか? http://www.task-notes.com/entry/20150930/1443582000 などを見てもイマイチ納得がいきません。 下記のプログラムでは public static void main(String[] args)がないためにエラーになりました。 解らないため適当な箇所に付け足したら、また異なったエラーになりました。 ;を付け足すとまた別のエラーが出ます。 ご多忙中恐れ入ります。 アドバイスのほど宜しくお願い申し上げます。 class Hero { public static void main(String[] args) private int point; Hero(int p) {point = p; } int getPoint() { return point; } void addPoint(int p) { point += p; } } コンパイルエラー C:\JAVA>javac Hero.java Hero.java:3: エラー: ';'がありません public static void main(String[] args) ^ エラー1個

  • java classの呼び出し方を教えて下さい。

    java classの呼び出し方を教えて下さい。 public class test extends Applet implements Runnable,ActionListener,KeyListener{ Thread th; // スレッド宣言 AudioClip IdoSound,KaitenSound,KesiSound,SetSound,CrySound; public void init(){ }   ・   ・   ・ public void test(){ ここで、最下欄の class stream{ public static void main(String args[]){ } を実行させたいのですが、記入方法が解りません・・・ } public int kesiOne(int VP,int HP){ }    ・    ・    ・ class stream{ public static void main(String args[]){ try{ File file = new File("c:\\java\\data.txt"); if (checkBeforeWritefile(file)){ PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file))); pw.println("12345"); pw.close(); }else{ System.out.println("ファイルに書き込めません"); } }catch(IOException e){ System.out.println(e); } } private static boolean checkBeforeWritefile(File file){ if (file.exists()){ if (file.isFile() && file.canWrite()){ return true; } } return false; } } 解りにくい書き方で申し訳け有りませんが、宜しくお願いします。

  • コマンドライン引数の*(アフタリスク)の表示について教えて下さい

    皆様どうぞよろしくお願い申し上げます。アドバイス下さい。 java言語で質問です。調べたかぎりわからないことが起こりました。次のものです。コマンドライン引数で引数1は数字、引数2は数字、引数3は* で表示させるプログラムを作りました。引数3番目の演算子*(アフタリスク)を表示する場合にうまく表示できません。 C:\java>java test 2.0 15.0 * 2.0 15.0 Calculation.class ←表示されません。 プログラムは以下のものを作りました。見てください。 /** * 実行クラス:引数テストクラス */ class test{ public static void main(String args[]) { //引数を取得 double num1 = Double.parseDouble(args[0]); //引数1(数値) double num2 = Double.parseDouble(args[1]); //引数2(数値) String kigou = args[2]; //引数3(計算記号) //画面に出しています。 System.out.println(num1); System.out.println(num2); System.out.println(kigou); } }