當您的代碼通過javaws啓動時,會加載javaws.jar,並且您不想依賴的JNLP API類可用。相反,測試對於不能保證存在的系統屬性,你可以改爲查看是否JNLP API類存在:
private boolean isRunningJavaWebStart() {
boolean hasJNLP = false;
try {
Class.forName("javax.jnlp.ServiceManager");
hasJNLP = true;
} catch (ClassNotFoundException ex) {
hasJNLP = false;
}
return hasJNLP;
}
這也避免了需要在編譯時,包括你的類路徑上javaws.jar。
另外,你可以切換到javaws編譯。罐子和追趕的NoClassDefFoundError代替:
private boolean isRunningJavaWebStart() {
try {
ServiceManager.getServiceNames();
return ds != null;
} catch (NoClassDefFoundError e) {
return false;
}
}
使用ServiceManager.lookup(字符串)和UnavailableServiceException是麻煩,因爲兩者是JNLP API的一部分。 ServiceManager.getServiceNames()沒有被記錄爲拋出。我們特別調用這段代碼來檢查NoClassDefFoundError。
來源
2013-04-24 19:40:30
jla
感謝您的建議。我已經想到了這一點,但它變成了WS不是標準的JRE類路徑的一部分,因爲我不想發佈API jar我不喜歡使用它(並且不,反射不是我正在尋找的答案。 ) – ddimitrov 2008-10-19 12:11:39
或者你正在使用新的6u10插件... – 2008-10-19 18:25:19
@ddimitrov,你爲什麼要避免反思?如果你爲`ServiceManager`得到一個`ClassNotFoundException`,你就知道你沒有在JWS下運行。 – finnw 2010-07-20 03:21:53