Obtenir le chemin d'accès au répertoire d'un fichier de classe
J'ai été confronté avec le code qui tente de lire certains fichiers de configuration à partir du même répertoire où l' .fichier de classe pour la classe elle-même est:
File[] configFiles = new File(
this.getClass().getResource(".").getPath()).listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".xml");
}
});
Apparemment, cela fonctionne dans certains cas (lors de l'exécution du code à l'intérieur de la Résine, peut-être), mais pour moi, l'exécution de Tomcat, il omet simplement avec NPE, parce que getClass().getResource(".")
retourne null
.
Un collègue a proposé de créer un autre fichier de configuration contenant une liste de tous ".xml" fichiers de config (qui en effet pourrait fonctionner ici, car il reste assez statique), et que vous ne devriez pas vraiment essayer de faire quelque chose comme ça en Java.
Encore, je me demandais si il n'y a certains belle façon, qui travaille universellement, pour obtenir le chemin d'accès au répertoire dans les cas où une .fichier de classe est situé? Je suppose que vous pourriez obtenir à partir de la chemin de de la .fichier de classe elle-même comme ceci:
new File(this.getClass().getResource("MyClass.class").getPath()).getParent()
... mais est-ce la seule façon la plus propre?
Modifier: Pour clarifier, supposons que nous savoir ce est utilisé dans une application déployée d'une manière telle que MyClass.class sera toujours lu à partir d'un .classe fichier sur le disque, et les ressources y seront dans le même répertoire.
OriginalL'auteur Jonik | 2009-07-27
Vous devez vous connecter pour publier un commentaire.
Je sais que ce fil est vieux, mais c'est le haut de résultats dans les recherches Google, et il n'y avait pas de réponses satisfaisantes sur ici, pour moi. Voici un code que j'ai écrit, qui fonctionne très bien pour moi. Bien sûr, il y a la mise en garde qu'il peut ne pas avoir été chargé à partir du disque, mais il explique que, et renvoie la valeur null dans ce cas. Cela fonctionne très bien pour trouver le "contenant", c'est à la racine de l'emplacement d'une classe, que ce soit un bocal, ou dans un dossier. Cela peut ne pas convenir à vos besoins. Sinon, n'hésitez pas à arracher les portions de code que vous avez besoin.
OriginalL'auteur LadyCailin
Ce qui vous fait supposer qu'il y a un fichier de classe sur le disque dans son propre répertoire?
Une classe pourrait être:
Vous pouvez obtenir l'URL utilisée pour créer la classe elle-même, et si qui commence avec
file://
ensuite, vous pouvez obtenir le reste... mais il ne fonctionne pas pour toutes les classes.Oui, ce que vous avez là ressemble à propos de la façon la plus propre à moi si vous ajoutez un chèque pour le fichier de protocole.
OriginalL'auteur Jon Skeet
Si la ressource est dans le même dossier que une .fichier de classe, il doit être accessible via le chemin de la classe et peuvent être chargés via getResourceAsStream directement.
Comme posté plus tôt, les classes elles-mêmes peuvent être chargés à distance ou dans des endroits où il n'y a pas un bon "chemin" (par exemple à partir d'un jarfiles)
Ah êtes-vous essayer de lire tous les par exemple ".xml" de fichiers sur le chemin de classe à ce moment, sans avoir à connaître leurs noms à l'avance?
Ouais, c'était surtout le point. (Bien que dans ce cas, nous ne connaissons les noms, j'aimerais tout simplement de lire les fichiers de manière dynamique, pour éviter de lister quelque part ou quelque chose de ce genre.)
OriginalL'auteur Dan Fleet
Je suis d'accord avec votre collègue de la classe Java chargement n'a pas été conçu pour gérer ce cas d'utilisation. Soleil Facelets utilise une stratégie similaire de supposer que les Url peuvent être mappés à des Fichiers, et c'est pas joli. Je suis d'accord avec Jon le commentaire de votre getResource solution est probablement le plus propre, compte tenu de votre déploiement des hypothèses. Puisque vous avez demandé si c'était la seule façon, je vais aussi offrir getClass().getProtectionDomain().getCodeSource().getLocation(), qui doit être l'URL que le chargeur de classe chargé de votre classe à partir de (vous devez ajouter les sous-répertoires de votre classe, package). Cette stratégie a également la même URL-de-Fichier des hypothèses, donc c'est pas mieux en la matière. Je ne vois pas d'autres solutions.
Noter que getResource retourne une URL encodée, ce qui signifie que vous ne devez pas utiliser getPath() directement. En particulier, les espaces causes des problèmes, même si cela pourrait ne pas être un problème si vous avez le contrôle sur votre environnement. Pensez à utiliser un nouveau Fichier(URL.t()).
OriginalL'auteur Brett Kail
Je pense que vous pouvez être intéressé dans PathMatchingResourcePatternResolver à partir du Framework Spring. Vous pouvez l'utiliser directement dans votre code pour naviguer dans les fichiers de configuration ou vous pouvez vérifier la mise en œuvre ici.
OriginalL'auteur Ivan Dubrov