2009-09-14 5 views
0

J'ai une application java, et le fichier log4j.properties est dans src/com/my/path/props. Lors de la compilation, il est copié dans classes/com/my/path/propsComment obtenez-vous le chemin du fichier pour le fichier lorsque le répertoire de l'utilisateur change?

Le fichier est chargé via PropertyConfigurator.configureAndWatch (user.dir + "/classes/com/my/path/props/log4j.properties").

Tout cela fonctionne normalement, bien que ce ne soit pas idéal en raison de l'utilisation de user.dir (mais je ne connais pas un autre moyen de référencer un fichier par rapport au répertoire de démarrage de "l'application"). Le problème se manifeste lors de l'exécution de cette application à l'aide d'un wrapper Service NT. Quand cela est fait de cette façon, le fichier user.dir passe du répertoire racine de l'application à l'emplacement du fichier exe de l'encapsuleur NTService.

Ma question est: Quelle est la manière appropriée d'obtenir la représentation du chemin d'accès au fichier String du fichier log4j.properties dans mon répertoire classes/com/my/path/props /? Je me rends compte que cela se décomposerait complètement si le fichier d'accessoires était dans un pot; mais dans ce cas, ce n'est pas et est simplement un fichier sur le système de fichiers.

J'ai essayé un nouveau fichier (this.getClass(). GetClassLoader(). GetResource ("com/mon/chemin/props/log4j.properties"). GetURI()). GetAbsolutePath(), mais cela échoue car en production, le chemin d'accès au fichier est en fait un chemin UNC et renvoie par conséquent une exception "URI a un composant d'autorité".

Comment d'autres personnes font face à ce problème?

Merci.

+1

Je suis confus parce que vous avez dit le fichier est copié dans le classpath (c'est-à-dire dans le répertoire classes), mais vous mentionnez "user.dir". Si vous chargez le fichier à partir du classpath, "user.dir" n'est pas pertinent. D'où voulez-vous le fichier chargé? – SingleShot

+0

est copié dans le répertoire classes à la suite du processus de compilation normal d'Eclipse. Donc, il arrive que sur le déploiement, le fichier prop vit dans le répertoire des classes –

+0

OK, je vais essayer de répondre ... – SingleShot

Répondre

0

J'ai pris le conseil de singleshot et j'ai gardé les fichiers de propriétés de src et dans un répertoire séparé que j'ai ajouté au classpath. Rétrospectivement, c'était en effet osé de l'avoir configuré comme je l'ai fait à l'origine. De là, mon problème était d'obtenir un fichier à partir d'une adresse URL. J'ai fini par trouver ce dont j'avais besoin dans Commons IO FileUtils, avec sa méthode toFile(URL).

Le code a fini par ressembler à ceci:

private URL maintenanceConfigPath = this.getClass().getClassLoader().getResource("MaintenanceConfig.properties"); 
.... 
File f = FileUtils.toFile(maintenanceConfigPath); 
.... 

Encore une fois, merci à tous pour vos commentaires et pour moi vers le bas un chemin qui m'a vers une réponse

1

OK. Alors ... vous avez demandé comment d'autres personnes traitent ce problème. Premièrement, ils ne laissent pas à Eclipse la place où les fichiers sont placés. Ils choisissent où ils veulent, comment ils veulent y accéder, et puis ont leur outil de construction (qui, à moins qu'ils ne jouent juste, ne devrait pas être un IDE comme Eclipse, mais plutôt un outil de construction dédié comme Maven ou Ant) place-le.

Le choix de l'emplacement du fichier dépend de ce que vous voulez en faire. Si c'est simplement un fichier de configuration qui ne sera jamais édité à l'exécution, vous le placez généralement dans votre JAR (une autre pratique: les applications sont placées dans un ou plusieurs fichiers JAR, WAR ou EAR, pas un répertoire de classes). Si le fichier doit être édité à l'exécution, ce qui semble être le cas de votre "observation", vous le placez généralement dans un répertoire de configuration en dehors de votre fichier JAR.

Comment y accéder (à partir du chemin de fichier ou le chemin de classe) est un autre choix. Dans la mesure du possible, je privilégie l'accès aux fichiers à partir du classpath car il est plus portable - et quand il est dans un JAR, il est nécessaire. Si cela n'a pas de sens dans votre cas, choisissez un chemin autre que "user.dir" si cela change lors du déploiement. Vous pouvez le coder en dur, utiliser une variable d'environnement, une propriété, un fichier de configuration, un argument de ligne de commande, etc. pour définir le chemin réel. Toujours choisir où vont les choses et comment y accéder. Ne laissez pas vos outils choisir pour vous. Cela va vous faciliter la vie :-)

+0

+1. Je suppose que OP n'utilise pas classpath précisément à cause de "regarder" – ChssPly76

+0

complètement compris. J'aurais dû être plus clair: j'utilise le répertoire des classes parce que je n'avais pas de bonne raison d'aller ailleurs. D'autres fichiers d'accessoires non-regardés y vivent, et je voulais conserver tous les fichiers de propriétés dans cette application plutôt que dans le répertoire classes (j'aime cette convention) et d'autres dans un répertoire différent. Est-ce qu'il n'y a aucun moyen dans une classe java de dire "donnez-moi un fichier par rapport à" moi ", où" moi "est la classe? Et est-ce complètement mauvais? –

+0

Les classes sont sur le classpath, donc sauf si vous faites Quelque chose de très étrange, vous n'accédez pas aux fichiers relatifs aux classes.Vous y accédez par rapport à la racine du classpath.Si votre fichier est dans un répertoire sur le classpath, vous pouvez y accéder avec votre exemple de classloader ci-dessus (ne pas utiliser le "user.dir") Notez que ce n'est pas relatif à votre classe - vous utilisez simplement votre classe pour obtenir un classloader pour accéder au classpath.Cela devrait fonctionner .. – SingleShot

Questions connexes