web-dev-qa-db-fra.com

Spring ne peut pas trouver le fichier de configuration XML de bean lorsqu'il existe

J'essaie de créer mon premier bean au printemps mais j'ai un problème avec le chargement d'un contexte ..__ J'ai un fichier de configuration XML du bean dans src/main/resources.

Je reçois l'exception IOException suivante:

Exception dans le fil "principal" org.springframework.beans.factory.BeanDefinitionStoreException: IOException analysant le document XML à partir du document class resource (src/main/resources/beans.xml); exception imbriquée est 

Java.io.FileNotFoundException: la ressource de chemin de classe [src/main/resources/beans.xml] ne peut pas être ouvert parce qu'il n'existe pas

mais je ne comprends pas, puisque je fais le test de code suivant:

File f = new File("src/main/resources/beans.xml");
System.out.println("Exist test: " + f.exists());

ce qui me donne la vérité! resources est dans le classpath. Qu'est-ce qui ne va pas?

64
dawrutowicz

Merci, mais ce n'était pas la solution. J'ai découvert pourquoi cela ne fonctionnait pas pour moi.

Depuis que j'ai fait une déclaration: 

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

Je pensais que je ferais référence au répertoire racine du projet lorsque le fichier beans.xml était là . Ensuite, j'ai mis le fichier de configuration dans src/main/resources et j'ai modifié l'initialisation pour: 

ApplicationContext context = new ClassPathXmlApplicationContext("src/main/resources/beans.xml");

c'était toujours une exception IO.

Ensuite, le fichier a été laissé dans src/main/resources/mais j'ai changé de déclaration en:

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

et cela a résolu le problème - peut-être que ce sera utile pour quelqu'un.

merci et à la vôtre!

Modifier:

Étant donné que de nombreuses personnes ont voté pour la solution et que j'avais eu l'expérience du Spring en tant qu'étudiant il y a quelques années, j'ai envie d'expliquer rapidement pourquoi cela fonctionne.

Lorsque le projet est compilé et empaqueté, tous les fichiers et sous-répertoires de 'src/main/Java' du projet vont dans le répertoire racine du fichier jar empaqueté (l'artefact que nous voulons créer). La même règle s'applique à 'src/main/resources'. 

Il s’agit d’une convention respectée par de nombreux outils, tels que maven ou sbt, en cours de construction (note: comme configuration par défaut!). Lorsque le code (de la publication) était en mode d'exécution, il ne pouvait rien trouver comme "src/main/resources/beans.xml" car beans.xml était à la racine du fichier jar (copié dans/beans .xml dans créé pot/oreille/guerre). 

Lors de l'utilisation de ClassPathXmlApplicationContext, la déclaration d'emplacement appropriée pour les définitions XML de beans, dans ce cas, était "/beans.xml", car il s'agit du chemin d'accès auquel il appartient dans jar et, plus tard, dans classpath.

Il peut être vérifié en décompressant un pot avec un archiveur (c'est-à-dire rar) et en visualisant son contenu avec la structure des répertoires. 

Je recommanderais de lire des articles sur classpath en complément.

128
dawrutowicz

Essaye ça:

new ClassPathXmlApplicationContext("file:src/main/resources/beans.xml");

fichier: preffix pointe sur les ressources du système de fichiers, pas classpath.

le chemin du fichier peut être relatif ou système (/ home/utilisateur/Work/src ...)

46
Mikhail Kolesnikov

src/main/resources est un répertoire source, vous ne devriez pas le référencer directement. Lorsque vous construisez/empaquetez le projet, le contenu sera copié au bon endroit pour votre classpath. Vous devriez alors le charger comme ça

new ClassPathXmlApplicationContext("beans.xml")

Ou comme ça

new GenericXmlApplicationContext("classpath:beans.xml");
6
OrangeDog

Vous avez regardé le répertoire src. Le fichier XML existe bel et bien là-bas. Mais regardez class ou bin/build où toutes vos classes de sortie sont définies. Je pense que vous aurez besoin uniquement du chemin resources/beans.xml à utiliser.

3
Michael Z

Je suppose que vous construisez un fichier .war/.jar et que, par conséquent, ce n'est plus un fichier, mais une ressource de ce paquet. Essayez ClassLoader.getResourceAsStream (chemin de la chaîne) à la place.

3
Brian Agnew

utilisez-le ApplicationContext context = new FileSystemXmlApplicationContext("Beans.xml");

3
Deep Shah

Cela est dû au fait qu'applicationContect.xml ou n'importe quel nom de fichier.XML n'est pas placé dans le chemin approprié.

Étapes de dépannage

1: Ajoutez le fichier XML sous le dossier de ressources.

2: Si vous n'avez pas de dossier de ressources. Créez-en un en naviguant nouveau en faisant un clic droit sur le projet nouveau> Dossier source, nommez-le comme ressource et placez votre fichier XML en dessous.

2
Gani

Au printemps, tous les fichiers sources se trouvent dans src/main/Java. De même, les ressources sont généralement conservées dans src/main/resources. Conservez donc votre fichier de configuration de printemps dans le dossier des ressources.

Assurez-vous de bien avoir l’entrée ClassPath pour vos fichiers dans src/main/resources.

Dans .classpath, recherchez les 2 lignes suivantes. S'ils manquent, ajoutez-les.

<classpathentry path="src/main/Java" kind="src"/>
<classpathentry path="src/main/resources" kind="src" />

Donc, si vous avez tout en place, le code ci-dessous devrait fonctionner.

ApplicationContext ctx = new ClassPathXmlApplicationContext ("Spring-Module.xml");

1
Shashesh

Notez que le premier applicationContext est chargé en tant que partie de web.xml; qui est mentionné avec le ci-dessous.

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>META-INF/spring/applicationContext.xml</param-value>
</context-param>

<servlet>
    <servlet-name>myOwn-controller</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>META-INF/spring/applicationContext.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

Là où le code ci-dessous essaiera également de créer un autre applicationContext.

private static final ApplicationContext context = 
               new ClassPathXmlApplicationContext("beans.xml");

Voir la différence entre beans.xml et applicationContext.xml

Et si appliationContext.xml sous <META-INF/spring/> a déclaré avec <import resource="beans.xml"/>, alors ce appliationContext.xml charge le beans.xml au même emplacement META-INF/spring de appliationContext.xml.

Tandis que; dans le code; si c'est déclaré comme ci-dessous

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

Ceci recherche le beans.xml dans WEB-INF/classes OR dans Eclipse src/main/resources.

[Si vous avez ajouté beans.xml à src/main/resources, il peut être placé à WEB-INF/classes lors de la création du fichier WAR.]

Donc, totalement DEUX, les fichiers sont recherchés.

J'ai résolu ce problème en ajoutant la recherche de classpath lors de l'importation à applicationContext.xml comme ci-dessous

<import resource="classpath*:beans.xml" />

et supprimé la ligne ClassPathXmlApplicationContext("beans.xml") dans le code Java, de sorte qu’un seul ApplicationContext soit chargé.

1
Kanagavelu Sugumar

J'ai fait le contraire de la plupart. J'utilise Force IDE Luna Java EE et j'ai placé mon fichier Beans.xml dans le package; cependant, j'ai précédé la chaîne Beans.xml - pour l'argument ClassPathXMLApplicationContext - avec le chemin relatif. Donc, dans mon application principale - celle qui accède au fichier Beans.xml - j'ai: 

    ApplicationContext context = 
         new ClassPathXmlApplicationContext("com/tutorialspoin/Beans.xml");

J'ai également remarqué que dès que j'ai déplacé le fichier Beans.xml dans le package du dossier src, une image Bean apparaissait dans le coin inférieur gauche de l'icône du fichier XML et n'était pas présente lorsque ce fichier xml était en dehors du package. C’est un bon indicateur pour me faire savoir que le fichier XML de beans est maintenant accessible par ClassPathXMLAppllicationsContext.

0
user1548875

Gradle : v4.10.3

IDE: IntelliJ

J'étais confronté à ce problème lorsque j'utilisais Gradle pour exécuter ma construction et mon test. Copier le fichier applicationContext.xml partout n'a pas aidé. Même spécifier le chemin complet comme ci-dessous n'a pas aidé!

context = new ClassPathXmlApplicationContext("C:\\...\\applicationContext.xml");

La solution (au moins pour Gradle) réside dans la façon dont Gradle traite les ressources. Pour mon projet de diplôme, j’avais aménagé l’espace de travail tel que défini à l’adresse https://docs.gradle.org/current/userguide/Java_plugin.html#sec:Java_project_layout

Lorsque vous exécutez un test avec un ensemble de tâches par défaut comprenant une étape, "processTestResources" recherche les ressources de test sur C:\.....\src\test\resources (Gradle fournit utilement le chemin complet. ).

Votre fichier .properties et applicationContext.xml doivent se trouver dans ce répertoire. Si le répertoire des ressources n’est pas présent (comme c’était le cas dans mon cas), vous devez le créer et y copier le (s) fichier (s). Après cela, il vous suffit de spécifier le nom du fichier.

context = new ClassPathXmlApplicationContext("applicationContext.xml");
0
user1554876

Je vivais ce problème et cela me rendait dingue. J'ai finalement trouvé ce qui suit dans mon fichier POM.xml, qui était à l'origine du problème:

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
        <includes>
            <include>**/*.properties</include>
        </includes>
    </resource>
</resources>
0
JL_SO

Je n'étais pas sûr de l'écrire, mais peut-être que quelqu'un économiser quelques heures:

mvn clean

peut faire le travail si toute votre configuration est déjà parfaite!

0
İsmail Yavuz

Si ce problème vous préoccupe toujours et que vous développez avec Eclipse, consultez le bogue Eclipse: Les fichiers de ressources de "src/main/resources" ne sont pas correctement inclus dans le chemin de classe

La solution semble être de regarder les propriétés du projet, le chemin de génération Java, les dossiers sources. Supprimez le répertoire /src/main/resources et ajoutez-le à nouveau. Cela rappelle à Eclipse qu'il doit copier ces fichiers dans le chemin d'accès aux classes.

Ce bogue m'a affecté lors de l'utilisation de la version "Neon" d'Eclipse. (Et c'était très frustrant jusqu'à ce que je réalise la solution simple qui vient d'être décrite)

0
Geeb

C'est ce qui a fonctionné pour moi:

  new ClassPathXmlApplicationContext("classpath:beans.xml");
0
Sushrut Rathi