2010-04-13 81 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