Spring ne peut pas trouver le fichier de configuration xml bean quand il existe

j'essaie de faire mon premier haricot 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.

j'ai le message suivant IOException:

Exception dans thread" main " org.springframework.haricot.usine.BeanDefinitionStoreException: IOException l'analyse du document XML à partir de la classe de chemin de ressources [src/main/resources/haricots.xml]; l'exception imbriquée est

de java.io.FileNotFoundException: le chemin de classe de ressource [src/main/resources/haricots.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 est vrai! resources est dans le chemin de classe. Quel est le problème?

58
demandé sur Gary 2012-10-15 14:32:31

13 réponses

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

depuis que j'ai fait une déclaration:

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

j'ai pensé que je ferais référence au répertoire racine du projet quand haricots.fichier xml était là. Puis j'ai mis le fichier de configuration à src / main / resources et j'ai changé l'initialisation en:

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

il était encore une IO Exception.

Puis le fichier a été laissé dans src/main/resources/ mais j'ai changé déclaration:

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

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

merci et Santé!

Edit:

comme j'ai beaucoup de monde pour la solution et que J'ai eu ma première expérience avec le printemps en tant qu'étudiant il y a quelques années, je ressens le désir d'expliquer rapidement pourquoi cela fonctionne.

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

c'est une convention respectée par de nombreux outils comme maven ou sbt en cours de projet de construction (note: Comme configuration par défaut!). Quand le code (du post) était en mode exécution, il ne pouvait rien trouver comme "src/main/resources/beans.xml" en raison du fait, que les haricots.XML était dans la racine du pot (copié à /haricots.xml créé jar/oreille/guerre).

Lorsqu'on utilise ClassPathXmlApplicationContext, la déclaration de localisation appropriée pour les définitions xml des haricots, dans ce cas, était "/beans.xml", puisque c'est le chemin où il appartient dans jar et plus tard dans classpath.

il peut être vérifié en déballant un bocal avec un archiveur (c.-à-d. rar) et voir son contenu avec la structure de répertoires.

je recommande lire des articles sur classpath comme complément.

123
répondu dawrutowicz 2016-09-04 20:27:58

essayez ceci:

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

fichier: preffix point de ressources du système de fichiers, pas de chemin de classe.

chemin de fichier peut être relatif ou système (/home/user/Work/src...)

42
répondu Mikhail Kolesnikov 2013-12-15 09:00:08

j'ai également eu un problème similaire, mais en raison d'une cause un peu différente afin de partager ici au cas où il peut aider n'importe qui.

Mon emplacement du fichier

beans.xml file

comment j'ai utilisé

ClassPathXmlApplicationContext("beans.xml");

il y a deux solutions

  1. prenez les haricots.XML de paquet et de le mettre dans le package par défaut.
  2. spécifier le nom du paquet lors de son utilisation, c'est-à-dire:

ClassPathXmlApplicationContext("com/mypackage/beans.xml");

17
répondu Kalher 2015-03-13 00:16:13

src/main/resources est un répertoire source, vous ne devriez pas faire référence directement. Lorsque vous construisez/empaquetez le projet, le contenu sera copié à l'endroit approprié pour votre chemin de classe. Vous devez ensuite le charger comme ceci

new ClassPathXmlApplicationContext("beans.xml")

ou comme ceci

new GenericXmlApplicationContext("classpath:beans.xml");
5
répondu OrangeDog 2017-02-21 23:09:48

utiliser ApplicationContext context = new FileSystemXmlApplicationContext("Beans.xml");

3
répondu Deep Shah 2015-12-26 06:18:16

je soupçonne que vous construisez un .guerre./jar et par conséquent ce n'est plus un fichier, mais une ressource dans ce paquet. Essayez ClassLoader.getResourceAsStream (String path) à la place.

3
répondu Brian Agnew 2016-10-30 17:10:50

vous avez regardé le répertoire src. Le fichier xml existe bien là-bas. Mais regardez class ou bin/build directory où toutes vos classes de sortie sont définies. Je soupçonne que vous n'aurez besoin que de ressources/haricots.chemin xml à utiliser.

2
répondu Michael Z 2012-10-15 14:16:18

noter que la première applicationContext est chargée dans le cadre 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>

où comme ci-dessous le code essaiera également de créer un contexted'application de plus.

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 endroit META-INF/spring de appliationContext.xml .

Où as; dans le code; si elle est déclarée comme ci-dessous

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

ça ressemble à des haricots.xml à WEB-INF/classes ou dans eclipse src/main/resources .

[si vous avez ajouté beans.xml à src/main/resources alors il pourrait être placé à WEB-INF/classes tout en créant la guerre.]

si totalement deux les fichiers sont recherchés.

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

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

et a supprimé la ligne ClassPathXmlApplicationContext("beans.xml") en code java, de sorte qu'il n'y aura qu'un seul ApplicationContext chargé.

1
répondu Kanagavelu Sugumar 2017-05-23 12:34:41

au printemps, tous les fichiers source sont 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 Ressources.

assurez-vous d'avoir l'entrée ClassPath pour vos fichiers dans src/main/resources.

In .classpath vérifier pour les 2 lignes. S'ils sont absents de les ajouter.

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

donc, si vous avez tout en placez le code ci-dessous devrait fonctionner.

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

1
répondu Shashesh 2017-03-01 20:39:52

j'ai fait le contraire de la plupart. J'utilise la Force IDE Luna Java EE et j'ai placé mes haricots.fichier xml dans le paquet; cependant, j'ai précédé les haricots.XML string-pour L'argument ClassPathXMLApplicationContext-avec le chemin relatif. Donc, dans mon application principale - celle qui accède aux Haricots.fichier xml - j'ai:

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

j'ai aussi remarqué que dès que j'ai déplacé les Haricots.fichier xml dans le paquet à partir du dossier src, il y avait une image fève à la en bas à gauche de l'icône du fichier XML qui n'était pas présent lorsque ce fichier xml était à l'extérieur du paquet. C'est un bon indicateur pour me faire savoir que maintenant le fichier xml de beans est accessible par Classpathxmlapplicationscontext.

0
répondu user1548875 2015-06-18 14:17:38

C'est ce qui a fonctionné pour moi:

  new ClassPathXmlApplicationContext("classpath:beans.xml");
0
répondu Sushrut Rathi 2016-08-16 13:02:39

si ce problème est encore vous flummoxing et que vous développez en utilisant Eclipse, jetez un oeil à ce bug Eclipse: les fichiers de ressources de "src / main / resources" ne sont pas correctement inclus dans classpath

Solution semble être regarder les propriétés du projet, Java build path, dossiers source. Supprimer le dir /src/main/resources et l'ajouter à nouveau. Cela permet à Eclipse d'être rappelé qu'il doit copier ces fichiers dans classpath.

ce bug m'a affecté lors de l'utilisation de la version" Neon " D'Eclipse. (Et c'était très frustrant, jusqu'à ce que j'ai réalisé que le simple correctif vient d'être décrit)

0
répondu Geeb 2018-01-08 13:55:35

c'est parce que applicationContect.xml ou any_filename.XML n'est pas placé sous le chemin approprié.

de dépannage " Étapes

1: ajouter le fichier XML sous le dossier ressource.

2: Si vous n'avez pas de dossier ressource. Créez-en un en naviguant par clic droit sur le dossier project new > Source, nommez-le ressource et placez votre fichier XML sous celui-ci.

0
répondu Gani 2018-09-29 04:07:58