2010-11-25 4 views
3

J'ai un bundle de guerre osgi que j'ai créé à partir d'une application web existante. Le problème que j'ai est que dans la configuration de ressort il y a des références aux fichiers qui résident sur le classpath (voir ci-dessous) qui sont bien quand la guerre héritée a été déployée sur tomcat car ils pourraient être trouvés sur le système de fichiers thr. Cependant, comme osgi n'a pas de concept de système de fichiers, ces fichiers ne peuvent pas être localisés et j'obtiens un fichier non trouvé d'exception. quelqu'un peut me s'il vous plaît si je peux continuer à charger des ressources classpth de cette manière ou d'une manière similaire. Ou dois-je les charger de manière programmatique en utilisant le org.springframework.osgi.io.OsgiBundleResource par exemple.Configuration de Spring pour charger des ressources dans le bundle

<bean id="manager" class="com.xyz.abc.Manager" depends-on="workflowCache"> 
    <property name="configuration" value="classpath:com/xyz/abc/resource/workflow.xml"/> 
</bean> 

Merci d'avance.

+0

Avez-vous trouvé la solution? Je reçois la même erreur dans ResoureceUtils à la recherche du protocole de fichier. –

Répondre

1

Le problème ici n'est certainement pas que OSGi n'a pas le concept d'un système de fichiers, mais que le fichier n'est plus sur le chemin de classe.

Je suppose que lorsque la guerre s'exécute dans tomcat normal le workflow.xml que vous référencez est sur le système de fichiers et accessible via le classpath de tomcat. Le chargeur de classe pour le fichier WAR délègue au classloader parent, qui peut accéder au fichier workflow.xml.

Dans OSGi, votre classpath est défini par Bundle-Classpath et toutes les importations de paquetages, ou les exigences de regroupement. Ce fichier workflow.xml n'est évidemment pas accessible via l'un de ces mécanismes.

Il y a quelques options:

  1. Mettez le workflow.xml à l'intérieur du paquet et de le mettre sur le Bundle-Classpath. Ce n'est pas très bon si vous voulez que le fichier soit modifiable sans reconstruire le WAB. Lors du lancement de l'infrastructure OSGi, ajoutez le fichier workflow.xml au classpath. Ensuite, en tant qu'option de lancement de la structure, définissez org.osgi.framework.bootdelegation sur com.xyz.abc.resource. Notez que si vous faites cela, vous ne pourrez plus charger com.xyz.abc.resource depuis le framework OSGi, il les chargera toujours depuis le classloader parent de frameworks
  2. Si vous utilisez equinox vous pouvez mettre des fichiers externes sur le classpath du bundle en ajoutant external: au début d'un chemin de fichier dans le Bundle-Classpath. C'est un peu artificiel, car il est peu probable que votre paquet fonctionne ailleurs.

Ce sont tous un peu (beaucoup) hacky, donc vous voudrez peut-être regarder de différentes façons de charger ce fichier. Cependant, je ne connais pas l'OsgiBundleResource.

Si vous utilisez OSGi, vous pouvez jeter un oeil à la spécification Blueprint Container basée sur Spring DM. Je connais deux implémentations, Apache Aries et Eclipse Gemini.

+0

Merci pour la réponse.Le fichier réside dans un package sur le chemin de classe du bundle. J'ai mis à jour le classpath du bundle pour inclure le chemin d'accès complet au paquet contenant (initialement juste WEB-INF/classes et le chemin vers les jars incorporés), mais en vain, toujours introuvable. Le problème semble être à cette ligne dans ResourceUtils: if (! URL_PROTOCOL_FILE.equals (resourceUrl.getProtocol())) car il compare le fichier avec bundleresource pour l'égalité. Par la suite une exception FileNotFoundException est levée. – Barry

1

Les gars, j'ai eu le même problème. J'ai donc essayé ceci (changé classpath -> fichier)

Cela a fonctionné, mais il ne semble pas être une raison logique, parce que le dossier était sur le chemin de classe et l'équinoxe n'a pas pu le trouver using classpath: mais a trouvé le fichier en utilisant le fichier:

Jusqu'à ce que toute raison logique soit trouvée, nous pouvons aller de l'avant une utilisation ceci, si cela fonctionne.

Questions connexes