2013-08-17 6 views
0

Je rencontre de sérieuses difficultés pour charger une ressource dans un ensemble dans mon application. Cela fait des heures que je suis là et je ne sais vraiment pas ce que je fais de mal.MissingResourceException pour Resource dans Classpath

J'ai une application Java où j'essaie d'appliquer l'internationalisation à ma journalisation. Tout fonctionne correctement dans Eclipse, c'est uniquement lorsque je tente de déployer les fichiers jar compilés dans l'environnement de test que le fichier de propriétés ne peut pas être localisé. Mon fichier de propriétés s'appelle logging_en.properties. J'ai vérifié que c'est sur le système de fichiers (Linux, soit dit en passant). Quand je lance mon application, j'exécutez la commande suivante:

$JAVA_HOME/bin/java -verbose:gc -Xloggc:/var/tmp/app_gc.log -Xms1000m -Xms1000m -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:NewRatio=3 -classpath $CLASSPATH -Djava.rmi.server.codebase=file:///data/dev/app/common/ext/dirmi-1.1.1.jar -Djava.awt.headless=true -Dcom.sun.management.jmxremote.port=xxx -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false $JAVA_SECURITY $IMPORT_PROPERTIES $APP_PROPERTIES app.serverimpl.ServerStarter 

Ma variable CLASSPATH est:

/data/dev/app/server/logging_en.properties:/data/dev/app/common/lib/common.jar:/data/dev/app/common/ext/dirmi-1.1.1.jar:/data/dev/app/common/ext/log4j-1.2.17.jar:/data/dev/app/common/ext/cojen-2.2.3.jar:/data/dev/app/common/lib/server.jar 

Le fichier de propriétés est dans mon classpath. Dans le code lui-même, la ligne exacte que je lance est le suivant:

LogManager.getLogger("server").setResourceBundle(java.util.ResourceBundle.getBundle("logging")); 

Au début lorsque le serveur démarre, je reçois toujours l'exception des ressources manquant:

Exception in thread "main" java.util.MissingResourceException: Can't find bundle for base name logging, locale en_US 

Juste pour être sûr, je Je suis allé jusqu'à copier le fichier dans logging.properties et logging_en_US.properties et ajouté les trois à mon classpath. Toujours le même problème. Je sais que je suis en train de faire quelque chose de stupide ou de manquer quelque chose d'évident, mais je suis vraiment perdue. Je préférerais ne pas regrouper le fichier dans mon pot afin qu'il puisse être modifié à la volée, donc j'espère que c'est possible de le faire depuis le classpath.

Répondre

0

Pour les fichiers individuels, le chemin de classe doit contenir le dossier dans lequel se trouvent les fichiers, et non le chemin d'accès au fichier lui-même. Changez votre classpath à lire comme:

/data/dev/app/server/:/data/dev/app/common/lib/common.jar:... 

(fichiers Jar sont traités comme des dossiers, comme vous pouvez le voir ci-dessus).

Pour être clair - le ResourceBundle.getBundle (« exploitation forestière ») appel va faire l'équivalent de quelque chose comme ça en interne:

ClassLoader.getSystemClassLoader().getResource("logging_en.properties") 

et quand il le fait, il va chercher ce chemin ("logging_en.properties") dans les dossiers du classpath - ce qui signifie qu'il va regarder dans/data/dev/app/server et ensuite dans le fichier /data/dev/app/common/lib/common.jar (il a un cache du contenu décompressé de celui-ci) et ainsi de suite. (Il y a plus de possibilité de connexion et tous les chargeurs de classes ne doivent pas correspondre à des fichiers, etc. - mais dans le cas courant, ce qui se passe est le suivant.)

+0

C'était exactement ça. Tout fonctionne bien maintenant. Je pourrais me frapper pour avoir raté ça. Merci beaucoup! –