J'ai créé un client de service Web à l'aide d'Axis2. Je voudrais emballer le client dans un pot, ainsi je peux l'employer dans plusieurs autres projets. Le client utilise le module 'Rempart' Axis2 WS-Security. Ce module, rampart.mar (pas une faute de frappe!) Doit être présent sur le 'chemin du référentiel' de l'Axe, dans un répertoire appelé 'modules'. Le client requiert également un fichier de stratégie de sécurité, policy.xml. Les emplacements de ces deux derniers sont injectés via Spring, mais comme ils ne sont pas sujets à changement, je voudrais les emballer dans le pot.Empaquetage d'un client de service Web Axis2 géré par Spring
Si vous injectez un objet de fichier comme:
<bean id="webserviceStubFactory" class="com.company.WebserviceStubFactory">
<constructor-arg value="classpath:policy.xml"/>
</bean>
il fonctionnera très bien lors de l'exécution/tester le projet directement. Toutefois, lorsque vous l'emballer dans un pot, vous obtenez
java.io.FileNotFoundException: class path resource [policy.xml] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/path/to/webservice-0.8.jar!/policy.xml
Ceci est bien connu « problème » Spring: le constructeur-arg est résolu dans une instance printemps ClasspathResource et il ne supporte pas getFile (), car les instances de fichiers ne peuvent pas faire référence à quelque chose dans un pot. La solution à ceci est assez simple: changez le constructeur pour prendre une ressource au lieu d'un dossier et employez le InputStream directement. Toutefois, cela ne fonctionne pas pour le chemin d'accès au référentiel Axis2, car je ne peux que spécifier le chemin d'accès complet au référentiel et les composants internes d'Axis2 déterminent l'emplacement du fichier rampart.mar. Donc, la question se résume essentiellement à: est-il possible d'utiliser Spring pour injecter un chemin à l'intérieur d'un pot (même si c'est seulement /) et d'autres bibliothèques lisent ce chemin comme s'il s'agissait d'un système de fichiers normal? Je suppose que ce n'est pas le cas, mais je voudrais être sûr, avant d'installer des 'dépôts d'axes' externes sur les environnements de développement/test/production et d'avoir plusieurs copies du rampart.mar qui traînent.
Le problème est que Axis2 nécessite un/path/to/donné, alors qu'il recherche /path/to/modules/rampart.mar. Il n'y a pas de fichier à lire dans ce cas. D'un autre côté, passer une référence au fichier policy.xml dans le fichier jar fonctionne très bien, car je peux le passer en tant que ressource. Dans les sources Axis2, je vois qu'il construit une URL complète pour trouver les modules .mar dans le Repository, mais pour une raison quelconque, cela ne fonctionne pas. Comme le temps que je peux consacrer à ce problème est limité, je vais probablement opter pour la solution laide et inclure simplement un rampart.mar dans chaque projet qui utilise celui-ci. : / – Confusion