65 votes

Charger un fichier de propriétés dans le BOCAL?

J'ai de la difficulté lorsque l'un des pots que mon application web dépend essaie de charger un fichier de propriétés à partir de l'intérieur du bocal. Voici le code dans le pot.

static
{
    Properties props = new Properties();
    try 
    {
        props.load(ClassLoader.getSystemResourceAsStream("someProps.properties"));
    } catch (IOException e) 
    {
        e.printStackTrace();
    }
    someProperty = props.getProperty("someKey");
}

Le fichier de propriétés est dans mon "src/main/resources" répertoire du projet Maven. Lorsque j'exécute ce code à partir de mon test junit dans Eclipse, il exécute très bien. Lorsque le projet est construit avec Maven dans un bocal, et inclus dans une dépendance dans mon application web, il ne parvient pas à localiser le fichier de propriétés. Je sais que le fichier de propriétés est à la base du répertoire de la dépendait de pot, je ne sais pas comment résoudre ce problème.

S'il vous plaît aider!

80voto

mdma Points 33973

Le problème est que vous utilisez getSystemResourceAsStream. Utilisez simplement getResourceAsStream. Les ressources du système de charge du système de chargeur de classe, ce qui est presque certainement pas le chargeur de classe que votre pot est chargé lors de l'exécution comme une webapp.

Il fonctionne dans Eclipse, car lors du lancement d'une application, le système de chargeur de classe est configuré avec votre bocal dans le cadre de son classpath. (E. g. java-jar my.jar charge my.jar dans le système de chargeur de classe.) Ce n'est pas le cas avec les applications web - serveurs d'applications complexes de chargement de classe pour isoler les applications les unes des autres et à partir de l'intérieur de l'application serveur. Voir, par exemple, le tomcat chargeur de classe comment-à, et le schéma de la hiérarchie des chargeurs de classes utilisées.

EDIT: Normalement, vous appelez getClass().getResourceAsStream() pour récupérer une ressource dans le classpath, mais comme vous l'extraction de la ressource dans un initialiseur statique, vous devrez explicitement le nom d'une classe qui est dans le chargeur de classe que vous souhaitez charger. L'approche la plus simple est d'utiliser la classe contenant l'initialiseur statique, par exemple

[public] class MyClass {
  static
  {
    ...
    props.load(MyClass.class.getResourceAsStream("/someProps.properties"));
  }
}

17voto

Pascal Thivent Points 295221

Pour mémoire, il est documenté dans Comment puis-je ajouter des ressources à mon POT? (illustré pour les tests unitaires, mais le même s'applique pour un "régulier" de ressources):

Pour ajouter des ressources dans le chemin de vos tests unitaires, vous suivez la même modèle comme vous le faites pour l'ajout de ressources pour le POT, sauf le répertoire que vous lieu de ressources en est ${basedir}/src/test/resources. Au de ce point, on aurait un projet structure de répertoire qui ressemblerait à comme suit:

my-app
|-- pom.xml
`-- src
    |-- main
    |   |-- java
    |   |   `-- com
    |   |       `-- mycompany
    |   |           `-- app
    |   |               `-- App.java
    |   `-- resources
    |       `-- META-INF
    |           |-- application.properties
    `-- test
        |-- java
        |   `-- com
        |       `-- mycompany
        |           `-- app
        |               `-- AppTest.java
        `-- resources
            `-- test.properties

Dans un test unitaire, vous pouvez utiliser une simple extrait de code comme suit l'accès à la ressource nécessaire pour test:

...

// Retrieve resource
InputStream is = getClass().getResourceAsStream("/test.properties" );

// Do something with the resource

...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X