2010-04-13 75 views
1

我有一些遺留代碼用於監視我想要轉換爲包的應用程序cpu,內存等。現在當我開始這個捆綁它的抱怨com.sun.management.OperatingSystemMXBean在OSGi包中使用

Missing Constraint: Import-Package: com.sun.management; version="0.0.0" 

我已經使用OperatingSystemMXBean來訪問JVM上的統計信息。

我的問題是我可以在OSGI容器內使用這個類,如果是這樣的話?或者我應該使用其他方式來監視我的應用程序。我從Web前端對應用程序進行RMI調用,以獲得OSGi之前的節點性能數據。

回答

1

您可以嘗試將其安裝在交互式OSGi會話中嗎?例如,
this article

osgi> ss 

Framework is launched. 

id State  Bundle 
0 ACTIVE  org.eclipse.osgi_3.4.0.v20080605-1900 

osgi> install file:bundles/FirstBundle-1.0.0.jar 
Bundle id is 1 

//Try starting 
osgi> start 1 
org.osgi.framework.BundleException: The bundle could not be resolved. 
    Reason: Missing Constraint: Import-Package: com.so.samples.osgi.second; 
               version="0.0.0" 
at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker 
    (BundleHost.java:305) 

您可以診斷問題:

osgi> diag 1 
file:bundles/FirstBundle-1.0.0.jar [1] 
    Direct constraints which are unresolved: 
    Missing imported package com.so.samples.osgi.second_0.0.0. 

並安裝缺少的依賴關係,只要你知道在哪裏可以獲取JAR
(這很可能是你的問題的癥結所在,併爲我還沒有確切的答案,只是一個傳統的jar轉換成一個OSGi包,就像一個wrap protocolextension of an OSGi framework):

osgi> install file:bundles/SecondBundle-1.0.0.jar 
Bundle id is 2 
+0

感謝VonC對不起,我正在嘗試解決依賴性問題。該軟件包在rt.jar中,它是jre lib的一部分,所以我很謹慎地包裝它,但我會放棄它並在這裏報告。 – 2010-04-14 07:24:48

+0

@Paul:在封裝rt.jar之前,也許這個線程也可以提供幫助:http://www.mail-archive.com/[email protected]/msg00518.html – VonC 2010-04-14 07:36:50

+0

非常感謝鏈接指向我在正確的方向上,我添加了以下關於com.sun包默認不包含的原因的詳細信息。 – 2010-04-14 14:42:17

2

以下是我爲了得到這個工作所必須做的。

我不得不將com.sun.management添加到系統包的systemProperties值,因爲我是OSGI的新手,這讓我花了一段時間才弄清楚。我使用maven-pax-plugin,所以我需要添加以下屬性。默認情況下它不起作用的原因是equinox默認情況下,我選擇的osgi容器不包括系統包中的com.sun。*包。

通過使用bundle 0命令查看系統捆綁包,這顯而易見,因爲捆綁包0始終是系統捆綁包,這對我而言是新事物。

<param>--sp=com.sun.management</param> 

在添加此命令後,系統軟件包包含com.sun.management,並且我的軟件包部署時沒有問題。

默認情況下equinox不包括systemProperties中的com.sun包的原因見here。 (一個直接調用sun程序包的Java程序並不能保證可以在所有Java兼容的平臺上運行,事實上,即使在同一平臺的未來版本中,這樣的程序也不能保證能正常工作。)

所以你有兩個選項可以將com.sun添加到osgi容器中。

解決方案A':擴展束

這些作爲片段;它們不是自己的捆綁,而是附屬於主機。擴展束是一種特殊類型的片段,僅附加到系統包,以便提供框架的可選部分。我們可以使用這種機制來創建一個空的擴展,它只聲明所需的包,並將加載留給它的託管包(在這種情況下爲框架)。由於第二種方案實施起來更快,我沒有選擇這條路線。

解決方案B:啓動代表團

我在年底拍得的選擇是啓動代表團。這允許用戶創建「隱含」的包,這些包將始終由框架父類加載器加載,即使這些包沒有提供正確的導入。我通過設置系統包來包含com.sun.management來實現。

請參閱以下優秀的link,以更詳細地描述整個問題。

+0

+1。感謝你提供了非常有趣的反饋。你能否詳細說明解決方案B(爲了不依賴於可能會在一天內破壞的互聯網鏈接)? – VonC 2010-04-14 14:44:22

+0

完成希望有一天會省下一些時間:) – 2010-04-14 15:00:08