2013-07-09 18 views
64

実行中のJavaプログラムのメインクラスのパスを取得する方法はありますか?実行中のJavaプログラムのパスを取得する方法

構造は、私がD:\Project\bin\としてパスを取得したい

D:/ 
|---Project 
     |------bin 
     |------src 

です。

私はSystem.getProperty("java.class.path");を試してみましたが、私は

java -classpath D:\Project\bin;D:\Project\src\ Main 

Output 
Getting : D:\Project\bin;D:\Project\src\ 
Want : D:\Project\bin 

のように実行した場合の問題は、これを実行する方法はありますか?



===== ===== EDIT

はここ

ソリューションを手に入れました Jon Skeetにより

package foo; 

public class Test 
{ 
    public static void main(String[] args) 
    { 
     ClassLoader loader = Test.class.getClassLoader(); 
     System.out.println(loader.getResource("foo/Test.class")); 
    } 
} 

このプリントアウト:Ericksonにより

file:/C:/Users/Jon/Test/foo/Test.class 


ほとんどのクラスファイルはJARファイルにまとめられているため、これはすべての場合に機能しません(したがってIllegalStateException)。ただし、この手法ではクラスを含むJARを見つけることができ、クラスファイルがgetResource()の代わりにgetResourceAsStream()に置き換えられてクラスファイルの内容を取得することができ、クラスがファイルシステム上にあるかどうかで動作しますJAR

+0

さてあなたは、常に結果をトークン化でき、それの要素に分割することができますhttp://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html

(カットを見ると言うことができますエントリを区切る ";"の周りに)。 classpathプロパティには、通常、複数のエントリ(たとえば、使用しているライブラリなど)が含まれています。 あなたの要件を再考する必要があるかもしれません。 1つのフォルダに興味があるのなら、クラスパスを解析するのは良い考えですか? – Matthias

+2

@Matthiasパス区切り記号はプラットフォームによって異なりますのでご注意ください。 'System.getProperty(" path.separator ");' –

+1

http://stackoverflow.com/a/778246/1862502 –

答えて

61

は、このコードを試してみてください。

final File f = new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath()); 

は、mainメソッドを含むクラスで 'MyClass' を交換してください。

またあなたも言及したシステムプロパティの上に

System.getProperty("java.class.path") 

を使用することができますが、クラスファイルを含むディレクトリおよびJARアーカイブを検索するために使用

パスを提供します。 クラスパスの要素は、path.separatorプロパティで指定されたプラットフォーム固有の 文字で区切られます。

+0

getCodeSource()はjvm(jetty)内でnullを返します。 –

-2
ClassLoader cl = ClassLoader.getSystemClassLoader(); 

    URL[] urls = ((URLClassLoader)cl).getURLs(); 

    for(URL url: urls){ 
     System.out.println(url.getFile()); 
    } 
+1

これは、通常、あなたのアプリケーションが開始された場所からのパスを与えるだけです。これはあなたのメインクラスがどこに位置している必要はありません。 – Matthias

+0

また、システムクラスローダーが 'URLClassLoader'であるという保証もありません。P – Qix

18

あなたは実際にメインクラスへのパスを取得したくありません。あなたの例によると、現在の作業ディレクトリ、つまりあなたのプログラムが起動したディレクトリを取得したいとします。この場合、あなただけのnew File(".").getAbsolutePath()

+2

すべての回答から、これが最も正確です – monzonj

109

使用

System.getProperty("java.class.path") 

あなたはまた、簡単に

String classpath = System.getProperty("java.class.path"); 
String[] classpathEntries = classpath.split(File.pathSeparator); 
+8

これはどのように質問に答えますか?正直である。システムプロパティ 'java.class.path'は、クラスパス全体、JARとすべてを返します。 OPは実行中のメインクラス(作業ディレクトリ)へのパスを要求しています。 – monzonj

+0

作業ディレクトリは、クラスファイルの実行場所である必要はありません。 OPが与えた例はこれを証明しています。この回答にはプロジェクトコンポーネントのすべての場所が含まれていますが、どのようにそれらを要素に分けることができるかを示しています。 – Larry

+6

@monzonj私はあなたに同意します。質問は私がそれに答えた後に進化した。私の答えはもはや一致しませんでした。しかし一方で、多くの人々はその見出しに合っているので、その答えが有用であることを発見しました。だから私はまだそれを保持し、それを削除しない理由です。 –

関連する問題