com.sun.*
軟件包中的代碼僅適用於Sun/Oracle JVM,other implementations可能無法訪問這些不屬於官方JDK的專有類。實質上,Sun在ThreadMXBean
上添加了一些附加功能(並且令人困惑地沒有更改名稱),但不希望強制所有JVM實現類似地實現此行爲。
想必詹金斯不使用(或你的配置不)Oracle的JVM。瘋狂的猜測,但它可能使用JRockit。
一般來說,你應該實現代碼假設com.sun.*
類不是默認情況下可用,並且應該在運行時檢查是否其實他們。例如,下面是我當前如何處理ThreadMXBean
問題的一個片段:
private static boolean enableBeanInspection = true;
private ThreadMXBean tBean = null;
private com.sun.management.ThreadMXBean sunBean = null;
public ThreadInspector() {
// Ensure beans are null if we can't/don't want to use them
if(enableBeanInspection) {
tBean = ManagementFactory.getThreadMXBean();
if(tBean instanceof com.sun.management.ThreadMXBean) {
sunBean = (com.sun.management.ThreadMXBean)tBean;
}
if(tBean.isThreadCpuTimeSupported()) {
if(!tBean.isThreadCpuTimeEnabled()) {
tBean.setThreadCpuTimeEnabled(true);
}
} else {
tBean = null;
}
if(sunBean != null && sunBean.isThreadAllocatedMemorySupported()) {
if(!sunBean.isThreadAllocatedMemoryEnabled()) {
sunBean.setThreadAllocatedMemoryEnabled(true);
}
} else {
sunBean = null;
}
}
}
protected long getThreadTime() {
if(tBean != null) {
return tBean.getThreadCpuTime(threadId);
}
return -1;
}
protected long getThreadMemory() {
if(sunBean != null) {
return sunBean.getThreadAllocatedBytes(threadId);
}
return -1;
}
這種防禦假設 - 我們 - 不要 - 有豆的圖案讓你安全地得到儘可能多的信息,JVM將允許。
「不工作」不是一個正確的錯誤描述。你可能想詳細說明一下。 – Stephan