Как задать параметр командной строки в Java-программе? - PullRequest
1 голос
/ 25 апреля 2019

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

Например: у меня есть java-класс, говорящий «HelloWorld.class». Я хочу использовать java Flight Recorder при выполнении этого, чего я могу достичь с помощью

java -XX: + UnlockCommercialFeatures -XX: + FlightRecorder HelloWorld

Но я хочу добиться этой коммерческой функции разблокировки и запустить регистратор полетов из моего кода Java.Возможно ли это?

1 Ответ

1 голос
/ 27 апреля 2019

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

Во время выполнения это, вероятно,проще всего

Runtime.getRuntime().exec("jcmd " + pid + " VM.unlock_commercial_features");

В JDK 9 или новее вы можете получить pid из ProcessHandle;

ProcessHandle.current().pid() 

В более ранних выпусках вы можете получить pid из RuntimeMXBean:

String jvmName = ManagementFactory.getRuntimeMXBean().getName();
int index = jvmName.indexOf("@");
String pid = jvmName.substring(0, index);

Другая альтернатива - сделать это через JMX, используя DiagnosticCommandMXBean.

    ObjectName on = new ObjectName("com.sun.management:type=DiagnosticCommand"); 
    Object[] a = new Object[] {
        new String[] {
        }
    };
    String[] sig = new String[] {"[Ljava.lang.String;"};
    ManagementFactory.getPlatformMBeanServer().invoke(on, "vmUnlockCommercialFeatures", a, sig);
...