9 votes

Comment accéder à une ressource à partir d'une bibliothèque Java emballée dans son propre fichier .jar ?

J'ai un projet de bibliothèque avec des ressources que j'aimerais charger et utiliser. J'utiliserai cette bibliothèque dans un autre projet et je dois donc placer les ressources dans le fichier .jar. Voici comment procéder :

<resources>
    <resource>
        <directory>src/main/resources</directory>
    </resource>
</resources>

Le problème survient lorsque l'on essaie de récupérer le fichier, ce que je fais :

String resourceName = "myTemplateResource.json";
URL url = MyClass.class.getClassLoader().getResource(resourceName);

se voit attribuer un null valeur. Cela se produit dans les tests de la bibliothèque et dans le projet dépendant. Un indice sur ce qui manque ?

Testé également en utilisant

MyClass.class.getResource("/myTemplateResourceName.json");

y

MyClass.class.getClassLoader().getResource("src/main/resources/myTemplateResource.json");

avec le même résultat.

8voto

Hiran Perera Points 446

Utilisation getResourceAsStream() pour charger la ressource à partir du fichier .jar comme suit :

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream inputStream = classLoader.getResourceAsStream(locaiton);

par exemple : Si le fichier "myTemplateResourceName.json" se trouve directement dans le dossier des ressources, utilisez uniquement le nom du fichier. L'ajout d'une barre oblique (/) devant le chemin d'accès n'est pas correct.

InputStream inputStream = classLoader.getResourceAsStream("myTemplateResourceName.json");

Note : Vous devez placer le fichier de ressources dans le répertoire main/resources (ne le gardez pas dans le test/resources puisque celle-ci n'est pas incluse dans le fichier jar) dans le projet utilisé pour créer le fichier jar.

5voto

Alex Points 43

Il y avait un problème avec le nom du fichier que je n'ai pas réussi à trouver. J'ai renommé le fichier et tout va bien.

Pour répondre à ma question :

Ajoutez d'abord la ressource au jar du fichier .pom.

<resources>
    <resource>
        <directory>src/main/resources</directory>
    </resource>
</resources>

Accédez ensuite à votre dossier.

URL url = MyClass.class.getClassLoader().getResource(resourceName);

A partir de là, vous pouvez obtenir un InputStream . Aussi simple que cela puisse paraître.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X