Bonjour,

Je suis utilisateur de SPI (cf. http://www.javaworld.com/javaworld/j...-1103-mp3.html) dans le cadre d'un projet. Or, si les SPI fonctionnent bien lorsque je mets mon programme dans un jar et l'exécute, ils ne fonctionnent pas quand je lance le programme depuis Eclipse.

Afin que les SPI soient pris en compte, il est nécessaire de les déclarer dans des fichiers dans le sous dossier services de META-INF de notre jar. J'ai bien l'impression que Eclipse n'utilise pas ces fichiers quand il lance le programme, ce qui rend les SPI inopérants car non déclarés.

Je vois deux solutions pour m'en tirer, or je n'arrive à mettre en place aucun des deux :
1/ Dire à Eclipse de prendre en compte les SPI.
2/ Dire à Eclipse de générer le jar directement et de lancer celui-ci.

Pour l'instant, je suis obligé d'exporter le jar, puis de l'exécuter. Je perds pas mal de temps pour rien j'ai l'impression.

Explications :
Prenons l'exemple de javax.sound.sampled.spi.AudioFileReader et du SPI de javazoom pour lire les mp3 : javazoom.spi.mpeg.sampled.file.MpegAudioFileReader

On déclare donc ce dernier via un fichier dans META-INF/services afin de le déclarer comme étant un implémentation du service AudioFileReader, pour le format MP3 (qui n'est pas géré de base par la JVM).

Si ensuite on utilise le code suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
AudioFileFormat ff = AudioSystem.getAudioFileFormat(new File("monfichier.mp3"));
Si on pack l'application dans un jar, tout se passe bien, notre implémentation du support du MP3 est prise en compte par la JVM, tout se passe bien. Si on lance le programme depuis eclipse, on se mange un UnsupportedAudioFileException dans les dents car, bien que javazoom.spi.mpeg.sampled.file.MpegAudioFileReader soit bien dans le classpath, sa déclaration en tant que SPI n'est aps prise en compte.

Si je met le tout dans un jar, et que je lance à la main, ça fonctionne. Il faut donc ou bien que Eclipse prenne en compte mes déclaration de SPI, ou bien qu'il me fasse le jar direct avant de lancer l'appli. Or pas moyen de lui faire faire l'un ou l'autre.

Des suggestions ?

Merci d'avance.