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?
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.
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...)
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
comment j'ai utilisé
ClassPathXmlApplicationContext("beans.xml");
il y a deux solutions
- prenez les haricots.XML de paquet et de le mettre dans le package par défaut.
- spécifier le nom du paquet lors de son utilisation, c'est-à-dire:
ClassPathXmlApplicationContext("com/mypackage/beans.xml");
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");
utiliser
ApplicationContext context = new FileSystemXmlApplicationContext("Beans.xml");
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.
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.
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é.
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");
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.
C'est ce qui a fonctionné pour moi:
new ClassPathXmlApplicationContext("classpath:beans.xml");
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)
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.