Найти полный путь java.exe программно из java-кода
Если у меня есть java jar или файл класса, который запускается пользователем (предполагая, что путь java задан в переменных среды), так как я могу изнутри кода определить абсолютный путь java.exe/javaw.exe из которого этот файл запускается.
Как и на ubuntu, мы можем запустить: % which java
и он показывает путь.
Однако в окнах, если я проверяю System.getenv()
, может случиться, что существует несколько путей поиска, например, для старой или новой версии. Если через строку cmd я запускаю java -version
, он не показывает путь.
Можете ли вы рассказать мне через чистую java или командную строку на окнах, как можно узнать местоположение javaw.exe?
Ответы
Ответ 1
String javaHome = System.getProperty("java.home");
Можете ли вы рассказать мне через чистую Java... на окнах, как можно узнать местоположение 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.
Ответ 2
В 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.
Ответ 3
Вот несколько более обобщенное решение, которое я придумал. Может быть, полезно:
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;
}
}