Подтвердить что ты не робот

Можно ли получить команду, используемую для запуска jvm в java?

Я хотел бы знать, можно ли получить из кода команду, используемую для запуска java-программы.

например. если я запускаю Java-программу с помощью:

 java -cp lib1:lib2:... -jar mylib.jar com.foo.Bar

Я хотел бы получить точную строку (включая параметры jvm).

Возможно ли это?


Прокомментируйте щедрость и вопрос

Спасибо всем за ваши ответы. К сожалению, я не получил ответа, который я начал искать. Я надеялся, что есть какое-то портативное решение, чтобы получить полную java-команду из самой программы (включая classpath и т.д.). Как кажется, нет портативного решения, и поскольку я использую Linux, я использую ответы agodinhost и Luigi R. Viggiano для решения моей проблемы. Однако я даю щедрость rahulroc для наиболее полного (портативного) ответа. Для остальных вы можете выбрать для всех:)

4b9b3361

Ответ 1

В приведенном ниже коде должны отображаться все параметры JVM, аргументы, переданные основному методу, а также имя основного класса.

import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;

import java.util.List;

public static void main(String[] args) {
  RuntimeMXBean bean = ManagementFactory.getRuntimeMXBean();
  List<String> jvmArgs = bean.getInputArguments();

  for (int i = 0; i < jvmArgs.size(); i++) {
    System.out.println( jvmArgs.get( i ) );
  }
  System.out.println(" -classpath " + System.getProperty("java.class.path"));
  // print the non-JVM command line arguments
  // print name of the main class with its arguments, like org.ClassName param1 param2
  System.out.println(" " + System.getProperty("sun.java.command"));
}

javadoc для getInputArguments

Возвращает входные аргументы, переданные виртуальной машине Java, которая не содержит аргументов основного метода. Этот метод возвращает пустой список, если нет входных аргументов виртуального Java-приложения машина.

Некоторые реализации виртуальной машины Java могут принимать входные аргументы из нескольких разных источников: например, аргументы, переданные из приложение, которое запускает виртуальную машину Java, такую ​​как команда "java", переменные среды, файлы конфигурации и т.д.

Как правило, не все параметры командной строки для команды "java" передается на виртуальную машину Java. Таким образом, возвращаемые входные аргументы может не включать все параметры командной строки.

Вы также можете взглянуть на: jps

Это программа Java, которая может получить полную командную строку для всех Процессы Java, включая полное имя класса основного класса и JVM варианты.

Вы можете найти хорошее резюме различных инструментов JVM, включая Java Application Launcher ссылки на:

Ответ 2

Вы можете использовать this для получения параметров виртуальной машины:

public static void main(String args[]) {
    List<String> inputArguments = ManagementFactory.getRuntimeMXBean().getInputArguments();
    System.out.println("input arguments = " + inputArguments);
}

Однако он не даст вам всю командную строку (дает только аргументы JVM, нет основного класса и параметров). Пример вывода:

входные аргументы = [-Dfile.encoding = UTF-8, -XX: -UseTLAB, -Xms2000m, -Xmx2000m, -XX: + PrintCompilation, -XX: + PrintGC]

Ответ 3

в Linux-машине было бы легче запустить:

ps -ef | grep java

эта команда перечислит все java-программы, запущенные с использованием используемых параметров.

Не уверен, что можно использовать в среде Windows.

Ответ 4

Он работает только на Sun   Oracle JVM: System.getProperty("sun.java.command")

Кроме того, вы можете посмотреть JavaSysMon, он может сообщать о командной строке активных процессов. Чтобы проверить, какой текущий JVM-процесс проверяется здесь: Как программа Java может получить свой собственный идентификатор процесса?

Ответ 5

В диспетчере задач на Win2003 вы можете включить отображение столбца, который отображает команду, как в linux. Или вы можете сделать это из командной строки следующим образом:

wmic.exe PROCESS where "name like '%java%'" get Processid,Caption,Commandline