2016-09-15 8 views
2

の作業ディレクトリを取得します。 Path path = Paths.get(*ClassName*.class.getProtectionDomain().getCodeSource().getLocation().toURI());私はこのコードを使用して現在のJavaプログラムの作業ディレクトリを取得することができ、別のJavaプロセス

また、私はのCommandLineパラメータを取得することができます(ただし、出力にはディレクトリが存在しない)は、Javaを実行するので使用して処理しこのコマンドwmic process get CommandLine where name='java.exe' /value

別のJavaプロセスの作業ディレクトリを取得することができます(よりプログラム的に)。おそらくそれはいくつかのjdk/binユーティリティで解決できますか?

+3

*クラス名* .class.getProtectionDomain()getCodeSource()のgetLocation()toURI()はいくつかの状況で失敗します。。。。現在のディレクトリが必要な場合は、単に 'System.getProperty(" user.dir ")'を使用しないでください。 – VGR

+3

'getProtectionDomain()。getCodeSource()。getLocation()'は*コード位置*(名前が示すように)を提供します。*は*必ずしも作業ディレクトリと同じではありません。異なるクラスが異なるコードソースを持っていると考えると明らかです。さらに、 'Paths.get'を介して' Path'にその位置を変換するのは、 'file:' URIでも失敗します。 jarファイルに含まれるクラスの場合現在の絶対パスを知りたい場合は、 'Paths.get(" ")。toAbsolutePath()'を使用することができます。 – Holger

答えて

2

この情報は、Attach APIから得ることができます。それを使用するには、自分のjdkのtools.jarをクラスパスに追加する必要があります。その後、次のコードは、すべての認識JVMプロセスの現在の作業ディレクトリを表示します:

for(VirtualMachineDescriptor d: VirtualMachine.list()) { 
    System.out.println(d.id()+"\t"+d.displayName()); 
    try { 
     VirtualMachine vm = VirtualMachine.attach(d); 
     try(Closeable c = vm::detach) { 
      System.out.println("\tcurrent dir: "+vm.getSystemProperties().get("user.dir")); 
     } 
    } 
    catch(AttachNotSupportedException|IOException ex) { 
     System.out.println("\t"+ex); 
    } 
} 
+0

このような詳細な対応をありがとうございます。私は、 'tools.jar'を' ... jdk/lib'フォルダからアプリケーションの 'lib'フォルダにコピーし、それをクラスパスに含める必要があることを理解していますか?他の環境ではうまく動作しないため、JDKから組み込むことはできません。 – user6618770

+2

コンパイル時に参照する 'tools.jar'は、アプリケーションを起動するときに参照するものと同じである必要はありません。したがって、コンパイル時に現在のJDKの 'tools.jar'を参照し、アプリケーションを実行する際にランタイムの' tools.jar'を参照して、裸のjreではなくjdkで実行すると仮定しますこの区別を取り除くはずのJava 9を楽しみにしています)。とにかく、開発していなくても、クラップスをインストールしようとしないので、ユーザーにはJDKをインストールすることをお勧めします(それはずっと前であり、サーバーJVMはJDKでのみ利用可能です) – Holger

+0

お願いします。もう1回?私はあなたのコードを使用してIDE(Eclipse)で動作しますが、コンパイル後にこのエラーが発生します。java.util.ServiceConfigurationError:com.sun.tools.attach.spi.AttachProvider:プロバイダsun.tools.attach.WindowsAttachProviderインスタンス化される。私はこのコマンドを使ってプログラムを起動します。 'java -Xmx512m -cp program.jar; lib \ * xx.Program'です。必要なファイルはすべてlibフォルダにあります。私はクラスパスで両方の場所を試してみましたが、PATH変数に... jdk/libディレクトリを追加しようとしました。 Eclipseのjavaw.exeではなくjava.exeの問題でしょうか? – user6618770

関連する問題