可以透過此工具取得目前系統上執行的 java 程式之系統訊息。
很多 java 程式需要知道自己是不是系統上唯一執行的程式,
大部分的解決方法是透過 bind 一個 socket port 來確保程式是唯一的,
但是若需要同時指定不同的設定檔執行好幾次同一支程式時,
單純用 socket port 來做識別,似乎就有其困難之處,且很多系統上,是不太允許程式隨便佔用 port 的。
透過 jps 搭配不同的參數,可以得知目前系統上 java 程式的細節,
例如 process id、程式 main class 的完整名稱(-l)、執行程式的參數(-m)、VM 的參數等等(-v),
使用 -l 參數,可知道是否已經有相同的程式於系統中執行,
搭配 -m 參數,可知道是否有相同的程式使用了哪些參數在系統中執行,
使用 -v 參數,可以知道執行程式時的 vm 參數,例如 classpath、程式執行的路徑、以及記憶體的調適等。
使用 runtime.exec 來執行 jps,並取得其結果再做進一步分析,範例如下:
import java.io.*;
public class JPS_Test {
public static void main(String[] args) {
try {
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("jps.exe -l -m -v");
InputStream is = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
或是直接參考 Jps 的做法去取得資訊,
( Sun 已經公開 jdk 的 source 了,下載後,路徑是 \j2se\src\share\classes\sun\tools\jps\Jps.java )
不過這種做法就像使用特定 JCE Provider 去處理 Certificate 一樣,
要使用到 sun.xxx 的 package,而非 java 標準之 package,是沒有文件和官方支援的哦。