web-dev-qa-db-fra.com

Ressource de src/main/ressources non trouvées après la construction avec maven

Bonjour, j'utilise un fichier de configuration de src/main/resources dans mon application Java. Je le lis dans ma classe comme ceci:

new BufferedReader(new FileReader(new File("src/main/resources/config.txt")));

Alors maintenant, je construis cela avec maven en utilisant mvn Assembly:assembly. Voici le bit pour cela dans mon pom.xml:

<plugin>
                <artifactId>maven-Assembly-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <finalName>TestSuite</finalName>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>com.some.package.Test</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>

Alors quand je lance mon application, j'obtiens cette erreur:

src\main\resources\config.txt (The system cannot find the path specified)

Mais quand je fais un clic droit sur mon pot assemblé, je peux le voir à l'intérieur, tout le monde sait ce que je fais mal?

44
Gandalf StormCrow

Les ressources de src/main/resources seront placées sur la racine du classpath, vous devrez donc obtenir la ressource sous la forme:

new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/config.txt")));

Vous pouvez vérifier en consultant le fichier JAR/WAR produit par maven car vous trouverez config.txt à la racine de votre archive.

79
beny23

FileReader lit les fichiers du système de fichiers.

Peut-être avez-vous l'intention d'utiliser quelque chose comme ceci pour charger un fichier à partir du chemin de classe

// this will look in src/main/resources before building and myjar.jar! after building.
InputStream is = MyClass.class.getClassloader()
                     .getResourceAsStream("config.txt");

Ou vous pouvez extraire le fichier du pot avant de le lire.

11
Peter Lawrey

Les ressources que vous avez placées dans src/main/resources seront copiées pendant le processus de construction vers target/classes accessibles via:

...this.getClass().getResourceAsStream("/config.txt");
5
khmarbaise

Je pense que le plugin Assembly place le fichier sur le chemin de classe. L'emplacement dans le fichier JAR sera différent de celui que vous voyez sur le disque. Décompressez le fichier JAR obtenu et regardez où se trouve le fichier.

1
Rostislav Matl

Vous pouvez remplacer le src/main/resources/ directement par classpath:

Donc, pour votre exemple, vous allez remplacer cette ligne:

new BufferedReader(new FileReader(new File("src/main/resources/config.txt")));

Par cette ligne:

new BufferedReader(new FileReader(new File("classpath:config.txt")));
0
Ahmed Elkoussy