Pourquoi ne peut que mon Application Java trouver mon fichier de propriétés
J'ai une application simple qui lit et écrit sur un fichier de propriétés. Il a été développé dans NetBeans et lors de l'exécution à partir de Netbeans fonctionne très bien. Cependant, maintenant que j'ai construit et déployé les propriétés de fichier ne peut pas être trouvé.
Structure De Projet
com/company/projectname/controller/controllerclass.java <- this is where the code using the properties file exists
conf/runController.properties <- the properties file, this exists here
Dans le code j'ai le texte suivant pour accéder au fichier de propriétés:
private final String PROPERTIESFILELOCATION = "conf/runController.properties";
public void runController(){
this.runController = new Properties();
this.propertiesLocation = this.getClass().getClassLoader().getResource(this.PROPERTIESFILELOCATION);
FileInputStream propsInput = new FileInputStream(this.propertiesLocation.getFile());
this.runController.load(propsInput);
}
(résumées par souci de concision)
Lorsque j'appelle le fichier jar à partir de la ligne de commande j'question:
java -classpath /usr/java/projectdirectory/project.jar com.company.projectname.controller.controllerclass arg1
Donc, j'ai réussi à atteindre cet objectif avant sur d'autres projets de la même manière, mais pour une raison quelconque, cela ne fonctionne pas.
J'ai vérifié la structure à l'intérieur du fichier jar et tout est comme prévu.
Quelqu'un peut-il remarquer mon erreur et m'aider à obtenir cette place et en cours d'exécution s'il vous plaît?
EDIT - changé les noms pour correspondre à l'échelle. Ils ont toujours été cohérent dans mon code
conf/controller.properties
, ou comme conf/runController.properties
, ou est-ce un autre nom (ou chemin d'accès différent à l'intérieur du pot)?J'ai fait changer le code de l'échantillon, merci pour le spot. Il existe dans le fichier jar at conf/runController.les propriétés. Les noms de tous les match de mon application
Si vous modifiez la propriété d'être
/conf/runController.properties
de sorte qu'il est sûr d'être par rapport au pot lui-même (et non par rapport à l'emplacement de l' .fichier de classe dans le pot)Si je fais ce que je reçois une exception de pointeur Null sur: FileInputStream propsInput = new FileInputStream(ce.propertiesLocation.getFile()); Parce que la propertiesLocation n'est pas défini par le présent.propertiesLocation = ce.getClass().getClassLoader().getResource(ce.PROPERTIESFILELOCATION);
OriginalL'auteur nathj07 | 2013-01-11
Vous devez vous connecter pour publier un commentaire.
Votre question parle
et votre code parle de
conf/runController.properties
EDIT: je suis en supposant que la conf/*.propriétés à l'intérieur de votre fichier jar. Si c'est le cas, alors votre code devrait fonctionner si les fichiers sont nommés correctement.
OriginalL'auteur Kal
Peut-être le FileInputStream n'est pas en mesure d'honorer les propriétés "fichier" qui est à l'intérieur de votre fichier jar. Changer votre:
:
EDIT:
J'ai créé une classe de test, et il montre que lors de l'exécution du système OU à partir d'un fichier JAR, que les "props/main.les propriétés" fonctionne, mais "/accessoires/main.propriétés de" ne pas:
Il doit y avoir quelque chose de différent dans votre situation qui fait obstacle à votre réussite.
Je sais que vous avez regardé les noms déjà. pouvez-vous vérifier la capitalisation? si vous êtes sur windows, les noms de fichiers sur le disque ne sont pas sensibles à la casse, mais (je crois) le contenu des fichiers jar sont.
Pour sûr. La capitalisation est correcte et cohérente. Le fichier est appelé runController.propriétés et il est cité en tant que tel.
J'ai créé un petit programme qui charge les propriétés de la même façon, et ça marche, sans le /. Je vais modifier ma réponse ci-dessus.... Il doit y avoir quelque chose d'étrange dans votre situation. Travailler votre code de plus en plus de mon code jusqu'à ce que vous trouver.
Merci pour l'exemple de code. J'ai travaillé mon code de plus près et j'obtiens un fichier non trouvé maintenant. Il semble qu'une pièce est manquante qui permet à mon appli pour trouver ce fichier.
OriginalL'auteur dashrb
Si vous utilisez
getResource
pour ouvrir le fichier de propriétés, qui suppose que le fichier est dans le chemin de la classe, de sorte que vous besoin de mettre le fichier de propriétés dans le classpath. Les alternatives sont à ajouter le répertoire conf du classpath, ou déplacer le fichier de propriétés, de sorte qu'il est dans le chemin de classe existant.Une chose qui pourrait aider, c'est se référer à l'emplacement de fichier à partir d'un slash, donc il n'y a aucun doute que vous souhaitez commencer à chercher pour le fichier à partir de la racine du classpath. Sinon, le chemin de recherche est relatif à la classe de votre code est de faire l'appel de (ne sait pas que c'est juste; c'est la façon dont il fonctionne avec la Classe.getResource, chargeur de classe.getResource peut être différent).
c'était un bon catch (+1 de moi), certainement le nom de la contradiction n'a pas arrangé les choses. il y a peut être plus de 1 chose de mauvais, bien sûr.
le nom de divergence est juste un problème dans l'exemple que j'ai posté. J'ai corrigé que maintenant, merci pour le spotting.
le fichier de propriétés est dans le pot au conf/runController.les propriétés. Le répertoire conf est au même niveau que la com de répertoire dans le bocal
afin de conf et com sont à la fois au niveau de la racine du fichier jar? le pot de disposer d'un répertoire META-INF avec un MANIFESTE.MF-t-il?
OriginalL'auteur Nathan Hughes台湾不在中国
Merci à tous pour votre aide, surtout dashrb, plus 1 pour votre code.
J'ai réussi à le faire fonctionner avec votre aide. La solution finale à ce problème était dû à un léger changement d'amure.
Que j'ai eu le besoin de lire et d'écrire dans le fichier (probablement pas clair dans mon OP), je suis passé à l'aide de Apache.commons.la configuration.
Qui dit que les pointeurs dans ce thread n'a assurer mes autres fichiers de propriétés travaillaient sans accroc.
Merci encore
OriginalL'auteur nathj07