web-dev-qa-db-fra.com

ClassLoader getResourceAsStream renvoie null

Structure du répertoire de mon projet (dans Eclipse):

MyProject/
    src/        --> "source directory" on Eclipse's classpath/buildpath
        com.me.myapp
            Driver
            myconfig.txt

Dans Driver, j'ai le code suivant:

public class Driver {
    public static void main(String[] args) {
        InputStream is = ClassLoader.getSystemClassLoader.getResourceAsStream("myconfig.txt");
        if(is == null)
            System.out.println("input stream is null");
        else
            System.out.println("input stream is NOT null :-)");
    }
}

Lorsque j'exécute cela, j'obtiens la sortie de console suivante:

input stream is null

Pourquoi? Ai-je placé myconfig.txt dans un emplacement incorrect? Suis-je en train d'utiliser l'API ClassLoader de manière incorrecte? Autre chose? Merci d'avance!

28
IAmYourFaja

Si c'est dans le même paquet, utilisez

InputStream is = Driver.class.getResourceAsStream("myconfig.txt");

La façon dont vous l'avez

InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("myconfig.txt");

Il recherche le fichier à la racine du chemin de classe. Vous pourriez utiliser

InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("com/me/myapp/myconfig.txt");

Les règles de recherche sont expliquées dans le javadoc de ClassLoader#getResource(String) et le javadoc de Class#getResource(String) .

43

Si vous travaillez avec Maven, ajoutez les lignes suivantes sous la balise BUILD . Vous obtenez cette erreur lorsque vous exécutez l'application Web sur le serveur, mais il n'y a aucune référence aux ressources sur le serveur.

Alors, ajoutez ceci dans votre POM.xml et voyez la magie.

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
        <includes>
            <include>fileName.txt</include>
        </includes>
    </resource>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
        <includes>
            <include>fileName.wsdl</include>
        </includes>
    </resource>
</resources>

S'amuser.!!!

10
Hitesh