J'essaie d'intégrer Apache jClouds dans un projet Java pour pouvoir accéder à l'API OpenStack. Le code suivant échoue:jClouds + OpenStack: (NoSuchElementException) key [openstack-neutron] ne figure pas dans la liste des fournisseurs ou des API
neutronApi = ContextBuilder.newBuilder("openstack-neutron")
.credentials(USERNAME, API_KEY)
.endpoint(AUTH_URL)
.modules(modules)
.buildApi(NeutronApi.class);
Avec le message d'erreur suivant:
java.util.NoSuchElementException: touche [OpenStack-neutrons] pas dans la liste des fournisseurs ou apis: {fournisseurs = [ultradns- ws], apis = [swift, swift-keystone]}
Ceci est apparemment un problème courant, mais le suggestions offered in jClouds troubleshooting ne le résout pas. Il y a another StackOverflow discussion à propos de ce problème mais n'a pas de réponse acceptée.
Quelques points utiles:
- Notre projet Java utilise Ant, alors que jclouds est basé sur Maven. Le Guide d'installation de jClouds provides directions to install using Ant, mais aucun d'entre eux ne fonctionne correctement. Au lieu de cela, j'ai compilé jClouds à partir de la source (https://github.com/jclouds/jclouds) et copié les fichiers .jar dans un dossier sur mon classpath. Maintenant, je peux accéder aux objets jClouds dans mon code.
- La source jclouds par défaut n'inclut pas les objets OpenStack Neutron. J'ai finalement trouvé ceux-ci dans la source OpenStack Labs (https://github.com/jclouds/jclouds-labs-openstack). Compilé à partir de la source, copié le fichier openstack-neutron-1.9.1.jar dans le dossier classpath, maintenant je peux accéder aux objets Neutron.
- Toutes les sources en ligne suggèrent qu'il s'agit d'un problème de chemin de classe/dépendance. J'ai vérifié que la bibliothèque openstack-neutron-1.9.1.jar est disponible dans mes fichiers .classpath et build.xml. Pas de résolution
J'apprécierais des idées ou des suggestions!
Merci beaucoup! L'appel de l'implémentation 'NeutronApiMetadata()' l'a corrigé. Ce projet n'a même pas de dossier 'META-INF/services' dans le classpath, ce qui explique probablement pourquoi il ne fonctionnait pas auparavant. Apprécier ton aide! – markcoatsworth
Chaque fichier jigouds api jar fournit ce dossier avec l'implémentation correspondante. Le pot openstack-neutron a le sien et le ServiceLoader devrait être capable de le prendre. –