2010-04-13 37 views
1

J'ai un code hérité qui a été utilisé pour surveiller mes applications cpu, mémoire etc que je veux convertir en bundle. Maintenant, quand je commence cet ensemble de sa plaintecom.sun.management.OperatingSystemMXBean utiliser dans un bundle OSGi

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

j'avais utilisé le OperatingSystemMXBean pour avoir accès aux statistiques sur la machine virtuelle Java.

Ma question est: est-ce que je peux utiliser cette classe dans un conteneur OSGI et si oui, comment? Ou devrais-je utiliser un autre moyen pour surveiller mon application. Je faisais un appel RMI à l'application à partir d'une interface Web pour obtenir les chiffres de performance des nœuds avant OSGi. Pourriez-vous essayer de l'installer dans une session OSGi interactive?

Répondre

1

Voir this article par exemple

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) 

Vous pouvez diagnostic la question:

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. 

et installer la dépendance manquante, à condition de savoir où chercher le pot
(qui pourrait très bien être le point essentiel de votre question, et que je n'ai pas de réponse exacte, sauf pour convertir un bocal en héritage dans un bundle OSGi, comme un wrap protocol ou un extension of an OSGi framework):

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

Merci VonC oui désolé J'essaie de résoudre le problème de dépendance. Le paquet est dans rt.jar qui fait partie de la jre lib donc je me suis méfié de l'emballer mais je vais essayer et rapporter ici. –

+0

@Paul: peut-être ce fil peut également aider, avant d'emballage rt.jar: http://www.mail-archive.com/[email protected]/msg00518.html – VonC

+0

Un grand merci pour le lien m'a pointé dans le bon sens j'ai ajouté le détail ci-dessous sur les raisons pour lesquelles les paquets com.sun ne sont pas inclus par défaut. –

2

Ce qui suit est ce que je devais faire pour que cela fonctionne.

J'ai dû ajouter com.sun.management à la valeur systemProperties pour le bundle système, car j'étais nouveau à OSGI cela m'a pris du temps pour comprendre. J'utilise le maven-pax-plugin donc j'ai besoin d'ajouter la propriété suivante. La raison pour laquelle cela n'a pas fonctionné par défaut était équinoxe mon conteneur osgi de choix n'inclut pas les paquets com.sun. * Dans le paquet système par défaut. Ceci était évident en regardant le paquet système avec la commande bundle 0 car le bundle 0 est toujours le bundle système qui était quelque chose de nouveau pour moi. Après l'ajout de cette commande, l'ensemble système comprend com.sun.management et mon ensemble déployé sans problème.

La raison pour laquelle équinoxe n'inclut pas les packages com.sun dans systemProperties, par défaut, voir here. (Un programme Java qui appelle directement les paquets sun. * n'est pas garanti pour fonctionner sur toutes les plateformes compatibles avec Java.En fait, un tel programme n'est pas garanti fonctionner même dans les futures versions sur la même plate-forme.)

vous avez deux options pour ajouter com.sun au conteneur osgi.

Solution A ': Groupes d'extension

Ceux-ci agissent comme des fragments; ils ne sont pas des faisceaux mais sont plutôt attachés à un hôte. Les bundles d'extension sont un type particulier de fragments qui sont attachés uniquement au bundle System afin de fournir des parties optionnelles du Framework. On peut utiliser ce mécanisme pour créer une extension vide qui déclare simplement les paquets nécessaires, laissant le chargement à son bundle d'hébergement (dans ce cas le Framework). Je ne suis pas allé sur cette route car la deuxième option était plus rapide à mettre en œuvre.

Solution B: Délégation Boot

L'option Je suis allé dans la fin était la délégation de démarrage. Cela permet à l'utilisateur de créer des packages «implicites» qui seront toujours chargés par le chargeur de classe parent du framework, même si les bundles ne fournissent pas les importations appropriées. J'ai réalisé en définissant les paquets système pour inclure com.sun.management.

Voir ci-dessous l'excellent link qui décrit l'ensemble du problème plus en détail.

+0

+1. Merci pour ce commentaire très intéressant. Pourriez-vous détailler la solution B (afin de ne pas dépendre d'un lien internet qui pourrait se casser un jour)? – VonC

+0

fait avec optimisme un jour va sauver quelqu'un un certain temps :) –