2009-01-22 10 views
3

J'ai une archive JAR avec des classes Java. L'un d'eux utilise une ressource qui est intégrée dans le même JAR. Pour charger cette ressource que j'utiliseClass.getResourceAsStream() issue

MyClass.class.getResourceAsStream(myResourceName); 

Une chose qui me dérange est que s'il est garanti que la ressource requise sera chargée à partir du même JAR. La documentation pour la méthode "getResourceAsStream()" (et la méthode correspondante de ClassLoader) n'est pas vraiment claire pour moi. Que se passerait-il si une ressource portant le même nom se trouvait quelque part dans le chemin de classe JVM avant mon JAR? Cette ressource sera-t-elle chargée à la place de celle qui est intégrée à mon JAR? Existe-t-il un autre moyen de remplacer la ressource intégrée dans JAR?

Répondre

2

Oui. La première ressource correspondante trouvée sur le chemin de classe est renvoyée, tout comme un chemin de recherche exécutable. C'est pourquoi les ressources sont souvent "espacées" en les plaçant dans des répertoires qui reflètent la structure du paquet de la bibliothèque ou de l'application.

Ce comportement peut être légèrement différent en présence de chargeurs de classe personnalisés (par exemple, dans OSGi), mais pour les applications Java vanilla, c'est le cas.

1

Cela fonctionne beaucoup de la même manière que pour trouver des fichiers de classe. Donc d'abord essayez le chargeur de classe parent (récursivement) puis faites ce que l'implémentation du chargeur de classe fait pour trouver les fichiers.

Il n'y a pas de vérification du chargeur de classe de l'appelant immédiat (comme le fait le ResourceBundle - voir la section 6.3 du Java Secure Coding Guidelines). Toutefois, vous avez besoin d'autorisations pour ouvrir le URL, car ClassLoader.getResourceAsStream appelle simplement URL.openStream dans l'implémentation par défaut.

1

Spécifiez le package. En supposant que vous utilisez com.yourcompany.file, il DEVRAIT être unique. (Sauf si quelqu'un VEUT remplacer votre fichier de configuration via le chemin de classe.)

1

Si vous souhaitez lire le fichier uniquement à partir d'un fichier JAR spécifique, vous pouvez ouvrir le fichier Jar et le lire directement.