Найти абсолютный путь java.exe программно из кода Java - PullRequest
15 голосов
/ 25 января 2012

Если у меня есть jav-файл jav или файл класса, который запускается пользователем (при условии, что путь java задан в переменных окружения), то как я могу из кода, определить абсолютный путь к java.exe / javaw.exe из которого этот файл запускается.

Как и в Ubuntu, мы можем запустить: % which java и он показывает путь.

Однако в Windows, если я отмечу System.getenv(), может случиться так, что найдены несколько путей, например, для старой или новой версии. Если через строку cmd я запускаю java -version, он не показывает путь.

Можете ли вы сказать мне с помощью чистой Java или командной строки в Windows, как можно узнать местоположение javaw.exe?

Ответы [ 3 ]

23 голосов
/ 25 января 2012
String javaHome = System.getProperty("java.home");

Можете ли вы сказать мне через чистую Java ... в Windows, как можно узнать местоположение javaw.exe?

EG

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.

2 голосов
/ 10 февраля 2015

В Windows системное свойство java.library.path начинается с пути к каталогу bin, содержащему тот файл java.exe, который использовался для запуска файла jar.

Это имеет смысл, потому что в 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" на случай, если трюк с путём библиотеки не работает.

Я протестировал это с Java 6 и 7 на Windows 7. Я попробовал 32-битную и 64-битную версию Java.

1 голос
/ 20 октября 2017

Вот немного более обобщенное решение, которое я придумал.Может быть полезно:

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;
    }
}
...