2007/08/20

jps - Java Virtual Machine Process Status Tool

 

 

 

無意間在 jini(99% jakarta)雅加達爪哇咖啡台灣總店 發現一個好用的 java tool,jps。
jps 是 jdk 5.0 之後提供的一個工具,

可以透過此工具取得目前系統上執行的 java 程式之系統訊息。

相關的 java 官方說明如連結:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jps.html 

 


很多 java 程式需要知道自己是不是系統上唯一執行的程式,

大部分的解決方法是透過 bind 一個 socket port 來確保程式是唯一的,

但是若需要同時指定不同的設定檔執行好幾次同一支程式時,

單純用 socket port 來做識別,似乎就有其困難之處,且很多系統上,是不太允許程式隨便佔用 port 的。

 

透過 jps 搭配不同的參數,可以得知目前系統上 java 程式的細節,

例如 process id、程式 main class 的完整名稱(-l)、執行程式的參數(-m)、VM 的參數等等(-v),

 使用 -l 參數,可知道是否已經有相同的程式於系統中執行,

搭配 -m 參數,可知道是否有相同的程式使用了哪些參數在系統中執行,

使用 -v 參數,可以知道執行程式時的 vm 參數,例如 classpath、程式執行的路徑、以及記憶體的調適等。

 

若要用程式來處理的話,則如 jini(99% jakarta)雅加達爪哇咖啡台灣總店 所提到的,

使用 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,是沒有文件和官方支援的哦。

 

2007/08/04

先生,你要的酸辣湯在湯餃裡有。

 

 

 

有次跟朋友一起吃用餐,

我點了喝碗酸辣湯,朋友點了一份湯餃。

老闆說,先生,你要的酸辣湯在湯餃裡有,

吃那份湯餃就能喝到酸辣湯,實在看不出單點酸辣湯的用意何在,

所以老闆就把酸辣湯從菜單上劃掉了。

 

啥?!這是什麼狀況!

慶幸的是,這種事情在現實生活中肯定不會發生,

否則不是麵店很快倒掉,就是湯餃以後可能要以 license 數量(來客數)來計費了。

 

但是偏偏這種事情,就發生在最近的一個專案上,

開了需求要A, B 兩個功能,還給了一份規格書。

原本以為連規格都開好,應該很快就能夠確認相關的細節了,

結果拖了一週,廠商居然回信說,因為B的功能包含在A裡面,所以就不提供B的功能了。

A, B兩個功能的I/O根本就不同,使用的時機也不同,

在沒有經過確認之前,就這樣逕自拔掉別人的需求,

完全沒有辦法理解那個廠商到底在想什麼,真的是令人提笑皆非......