2016-09-15 4 views
2

я могу получить рабочую директорию текущей программы Java с помощью этого кода: Path path = Paths.get(*ClassName*.class.getProtectionDomain().getCodeSource().getLocation().toURI());Получить рабочую директорию другого процесса 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» будет работать только в том случае, если это «файл: URI», но сбой, например. для классов, содержащихся в файле jar. Если вам нужен «Путь», представляющий рабочий каталог, «Paths.get (« »)' достаточно, если вы хотите узнать его текущий абсолютный путь, используйте «Paths.get (»). ToAbsolutePath() '... – Holger

ответ

2

Вы можете получить эту информацию через Attach API. Чтобы использовать его, вы должны добавить tools.jar вашего jdk в свой путь к классу. Затем, следующий код будет печатать текущие рабочие каталоги всех известных процессов 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», на который вы ссылаетесь при компиляции, не обязательно должен быть таким же, как вы ссылаетесь при запуске приложения. Таким образом, вы можете ссылаться на 'tools.jar' вашего текущего JDK при компиляции и ссылаться на« tools.jar »во время выполнения приложения, предполагая, что он работает на jdk, а не на голой jre (я с нетерпением жду Java 9, который должен избавиться от этого различия). Я рекомендую пользователям устанавливать JDK в любом случае, даже если они не разрабатываются, так как он не пытается установить crapware (и это не так давно, когда сервер JVM был доступен только в JDK) – Holger

+0

Пожалуйста, помогите мне еще раз? Я использую ваш код, и все работает в среде IDE (Eclipse), но после компиляции я получаю эту ошибку 'java.util.ServiceConfigurationError: com.sun.tools.attach.spi.AttachProvider: поставщик sun.tools.attach.WindowsAttachProvider не смог быть экземпляр'. Я запускаю программу с помощью этой команды 'java -Xmx512m -cp program.jar; lib \ * xx.Program'. Все необходимые файлы существуют в папке lib. Я пробовал оба места в пути к классу, а также пытался добавить каталог ... jdk/lib в переменную PATH. Возможно, проблема в java.exe вместо javaw.exe в Eclipse? – user6618770

Смежные вопросы