2009-09-30 7 views
3

J'utilise cet extrait de code pour obtenir un fichier en tant que flux d'entrée. Le fichier version.txt est empaqueté dans le fichier jar de mon application, dans le dossier le plus élevé.ClassLoader chargement du fichier incorrect

InputStream resource = getClass().getClassLoader().getResourceAsStream("version.txt"); 

Cela fonctionne presque tout le temps. Mais pour un utilisateur, il prend un autre fichier version.txt, qui n'est pas dans mon pot. Comment puis-je m'assurer que cela charge le fichier version.txt spécifique qui est dans mon pot?

Répondre

9

Lorsque vous dites "dossier le plus élevé", vous voulez dire le paquetage par défaut? Si c'est le cas, vous devrez vous assurer que votre JAR est plus tôt sur le chemin de classe que tout ce qui contribue l'autre fichier version.txt en tant que recherches Java le long du chemin de classe jusqu'à ce qu'il trouve la première correspondance.

Comme il est difficile d'assurer que votre JAR serait toujours d'abord, vous devez vraiment placer le fichier version.txt dans un package par défaut, tels que:

com.yourcompany.yourproject.version 

Et vous auriez besoin de modifier le code pour le localiser:

Stream resource = getClass().getClassLoader().getResourceAsStream("com/yourcompany/yourproject/version/version.txt"); 

L'utilisation du package par défaut est un anti-pattern.

+0

Oh garçon. Je me qualifie d'expert Java, et pourtant j'utilise cet anti-pattern. J'ai honte ... :-) Des tests préliminaires ont montré votre solution au travail! –

+0

Comme on dit, l'échec est le meilleur professeur ;-) – SteveD

3

C'est le danger inhérent à mettre les choses dans le paquet de haut niveau, vous pouvez ramasser des choses que vous ne voulez pas vraiment. Cela peut être un avantage (comme avec log4j config, par exemple), mais ce n'est généralement pas ce que vous voulez.

Je vous recommande fortement de placer votre version.txt dans la structure de l'emballage de votre application, par ex. dans com.myapp (ou quel que soit votre nom de package est), puis le charger à partir de là en utilisant

getClass().getClassLoader().getResourceAsStream("com/myapp/version.txt"); 
0

l'extrait de code utilisera le chargeur de classes qui a chargé cette classe pour trouver le fichier version.txt. Si le fichier existe dans le chemin de classe utilisé par le chargeur de classe à plusieurs endroits, il peut renvoyer le mauvais fichier (en fonction de l'ordre des classes).

Questions connexes