web-dev-qa-db-ja.com

Javaコードからプログラムで絶対Java.exeパスを見つける

ユーザーが起動するJava jarまたはクラスファイルがある場合(Javaパスが環境変数に設定されていると仮定))、内部からどのようにすればよいですか?コード、このファイルが起動されているJava.exe /javaw.exeの絶対パスを把握します。

Ubuntuと同様に、_% which Java_を実行すると、パスが表示されます。

ただし、Windowsでは、System.getenv()をチェックすると、古いバージョンや新しいバージョンなど、複数のパスが見つかった場合があります。コマンドラインから_Java -version_を実行すると、パスが表示されません。

純粋なJavaまたはWindowsのコマンドラインからjavaw.exeの場所を見つける方法を教えてください。

16
Johnydep
String javaHome = System.getProperty("Java.home");

純粋なJava ... Windowsでjavaw.exeの場所を見つける方法を教えてください。

例えば。

import Java.io.File;

class JavawLocation {

    public static void main(String[] args) {
        String javaHome = System.getProperty("Java.home");
        File f = new File(javaHome);
        f = new File(f, "bin");
        f = new File(f, "javaw.exe");
        System.out.println(f + "    exists: " + f.exists());
    }
}

出力

C:\Program Files (x86)\Java\jdk1.6.0_29\jre\bin\javaw.exe    exists: true
Press any key to continue . . .

そして、はい、私はそれがJREで機能すると確信しています。

24
Andrew Thompson

Windowsでは、Java.library.pathシステムプロパティは、jarファイルの実行に使用されたJava.exeを含むbinディレクトリへのパスで始まります。

これは理にかなっています。Windowsでは、実行可能ファイルが最初に検索する場所はDLLファイルは実行可能ファイル自体を含むディレクトリです。したがって、当然、JVMが実行されると、DLLを検索する最初の場所はJava.exeを含むディレクトリ。

次のようにして、Java.exeへのパスを取得できます。

final String javaLibraryPath = System.getProperty("Java.library.path");
final File javaExeFile = new File(
  javaLibraryPath.substring(0, javaLibraryPath.indexOf(';')) + "\\Java.exe"
);
final String javaExePath =
  javaExeFile.exists() ? javaExeFile.getAbsolutePath() : "Java";

このコードはWindows固有です-パス区切り文字(;)とファイル区切り文字()をハードコーディングしました。また、ライブラリパスのトリックがどういうわけか機能しない場合に備えて、「Java」だけにフォールバックしました。

これをWindows7のJava 6および7でテストしました。32ビットおよび64ビットバージョンのJavaを試しました。

3
Greg

これが私が思いついたもう少し一般化された解決策です。多分役に立つ:

private static String javaExe()
{
    final String Java_HOME = System.getProperty("Java.home");
    final File BIN = new File(Java_HOME, "bin");
    File exe = new File(BIN, "Java");

    if (!exe.exists())
    {
        // We might be on Windows, which needs an exe extension
        exe = new File(BIN, "Java.exe");
    }

    if (exe.exists())
    {
        return exe.getAbsolutePath();
    }

    try
    {
        // Just try invoking Java from the system path; this of course
        // assumes "Java[.exe]" is /actually/ Java
        final String NAKED_Java = "Java";
        new ProcessBuilder(NAKED_Java).start();

        return NAKED_Java;
    }
    catch (IOException e)
    {
        return null;
    }
}
1
Tim Angus