2012-10-15 9 views
54

Sto provando a creare il mio primo bean in Spring ma ho riscontrato un problema con il caricamento di un contesto. Ho un file XML di configurazione del bean in src/main/resources.Spring non trova il file di configurazione del bean xml quando esiste

ricevo il seguente IOException:

Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing documento XML da risorsa percorso della classe [src/main/risorse/beans.xml ]; l'eccezione annidata è

java.io.FileNotFoundException: classe di risorse percorso [risorse src/main// beans.xml] non possono essere aperti perché non esiste

ma io non lo ottengono, dal momento che il test seguente codice:

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

che mi dà vero! resources è nel classpath. Cosa c'è che non va?

+0

Come si carica il contesto? –

risposta

109

Grazie, ma non era la soluzione. Ho scoperto perché non funzionava per me.

Dal momento che avevo fatto una dichiarazione:

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

ho pensato riferisco a root directory del progetto quando il file beans.xml era lì. poi ho messo il file di configurazione di src/main/risorse e cambiato inizializzazione:

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

ancora era un'eccezione IO.

Poi il file è stato lasciato in src/main/risorse/ma ho cambiato dichiarazione:

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

ed è risolto il problema - forse sarà utile per qualcuno.

grazie e grazie!

Edit:

Dal ricevo molte persone pollici in su per la soluzione e avevano avuto prima esperienza con la primavera, come studente di qualche anno fa, mi sento il desiderio di spiegare brevemente perché funziona.

Quando il progetto viene compilato e impacchettato, tutti i file e le sottodirectory da 'src/main/java' nel progetto vanno nella directory radice del jar confezionato (l'artefatto che vogliamo creare). La stessa regola si applica a "src/main/resources".

Questa è una convenzione rispettata da molti strumenti come Maven o SBT in fase di costruzione del progetto (nota: come configurazione predefinita!).Quando il codice (dal post) era in modalità esecuzione, non poteva trovare nulla come "src/main/resources/beans.xml" a causa del fatto che beans.xml era nella radice di jar (copiata in/beans .xml nel vaso/orecchio/guerra creati).

Quando si utilizza ClassPathXmlApplicationContext, la dichiarazione di ubicazione corretta per le definizioni di bean xml, in questo caso, era "/beans.xml", poiché questo è il percorso in cui appartiene a jar e in seguito in classpath.

Può essere verificato sballando un barattolo con un archiviatore (vale a dire rar) e vedere il suo contenuto con la struttura delle directory.

Consiglierei di leggere articoli su classpath come supplementari.

+0

Non riesco a vedere la differenza tra 'Contesto ApplicationContext = new ClassPathXmlApplicationContext (" beans.xml ");' e 'Contesto ApplicationContext = new ClassPathXmlApplicationContext (" beans.xml ");' –

+1

@FlorianF non c'è differenza. La differenza è dove viene inserito il file, ciò che è descritto nel post. – dawrutowicz

+2

Vedo cambiare 'beans.xml' in' src/main/resources/beans.xml' e quindi * indietro * in 'beans.xml'. Grazie. –

2

Hai guardato la directory src. Il file xml esiste davvero lì. Ma guarda la directory class o bin/build in cui sono impostate tutte le classi di output. Sospetto che ti serva solo il percorso resources/beans.xml da utilizzare.

41

Prova questo:

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

di file: punto preffix di presentare le risorse di sistema, non classpath.

percorso del file può essere relativo o il sistema (/ home/utente/Lavoro/src ...)

+1

beh, è ​​meglio mantenere le risorse in classpath piuttosto che codificarle ma grazie, comunque. Non avevo esperienza con CP in quel momento :-) – dawrutowicz

+1

Probabilmente è meglio usare [FileSystemXmlApplicationContext] (https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/ support/FileSystemXmlApplicationContext.html) per i file. – romnempire

+0

ho un problema simile e questa soluzione ha funzionato per me. – Avdhut

15

Ho anche avuto un problema simile, ma a causa di un po 'diverso perché per questo condividere qui nel caso in cui si può aiutare qualcuno .

La mia posizione del file

beans.xml file

Come stavo usando

ClassPathXmlApplicationContext("beans.xml");

Ci sono due soluzioni

  1. Estrarre il bean.xml dal pacchetto e inserire il pacchetto predefinito.
  2. Specificare il nome del pacchetto mentre lo si utilizza.

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

+1

bene, è vero da dire. Il riferimento "com/mypackage/beans.xml" è lo stesso di "/com/mypackage/beans.xml" poiché "com/mypackage/beans.xml" è il percorso pertinente che utilizza "/" (root) per creare un percorso assoluto. – dawrutowicz

+0

Questa è solo una soluzione funzionante per me. Grazie! – Firzen

0

ho fatto il contrario di più. Sto usando Force IDE Luna Java EE e ho inserito il mio file Beans.xml all'interno del pacchetto; tuttavia, ho preceduto la stringa Beans.xml - per l'argomento ClassPathXMLApplicationContext - con il percorso relativo. Così nella mia richiesta principale - quello che accede al file beans.xml - ho:

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

Ho anche notato che non appena mi sono trasferito il file beans.xml nel pacchetto dalla cartella src, c'era un'immagine Bean in basso a sinistra dell'icona del file XML che non era presente quando questo file xml era fuori dal pacchetto. Questo è un buon indicatore per farmi sapere che ora il file xml di bean è accessibile da ClassPathXMLApplicationContext.

3

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

0

Questo è ciò che ha funzionato per me:

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

Ciao, questo ha funzionato anche per me, ma il problema è quando il file jar è compilato il barattolo non è in esecuzione per me .. Voglio dire, sto ricevendo il NoClassDefFoundError mentre provo a eseguire il file jar, quando eseguo l'applicazione in eclipse come Java è in esecuzione senza errori, non è sicuro di come risolverlo – sailaja

1

Nota che il primo applicationContext viene caricato come parte di web.xml; che è menzionato con il seguito.

<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> 

Dove come il codice cercherà anche di creare un altro applicationContext.

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

Vedi l'difference tra il beans.xml e applicationContext.xml

E se appliationContext.xml sotto <META-INF/spring/> ha dichiarato con <import resource="beans.xml"/> allora questo appliationContext.xml sta caricando il beans.xml sotto la stessa posizione META-INF/spring di appliationContext.xml.

Dove come; nel codice; se viene dichiarata come qui di seguito

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

Questo sta guardando la beans.xml a WEB-INF/classes O in Eclipse src/main/resources.

[Se sono stati aggiunti al beans.xmlsrc/main/resources allora potrebbe essere messo a WEB-INF/classes durante la creazione della guerra.]

così totalmente DUE file vengono ricercati.

ho risolto questo problema aggiungendo ricerca classpath durante l'importazione in applicationContext.xml come sotto

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

e rimossa la linea ClassPathXmlApplicationContext("beans.xml") in codice Java, in modo che ci sia una sola ApplicationContext caricato.

4

src/main/resources è una directory di origine, non si dovrebbe fare riferimento direttamente. Quando si crea/impacchetta il progetto, i contenuti verranno copiati nel posto corretto per il classpath. Si dovrebbe quindi caricarlo come questo

new ClassPathXmlApplicationContext("beans.xml") 

O come questa

new GenericXmlApplicationContext("classpath:beans.xml"); 
1

In primavera tutti i file di origine è all'interno src/main/java. Allo stesso modo, le risorse sono generalmente mantenute all'interno di src/main/resources. Quindi mantieni il tuo file di configurazione di primavera nella cartella delle risorse.

Assicurarsi di avere anche la voce ClassPath per i file all'interno di src/main/resources.

Nel controllo .classpath per le seguenti 2 righe. Se mancano, aggiungili.

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

Quindi, se tutto è a posto, il codice riportato di seguito dovrebbe funzionare.

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

0

Se il problema è ancora ti flummoxing e si stanno sviluppando con Eclipse, uno sguardo a questo bug Eclipse: Resources files from "src/main/resources" are not correctly included in classpath

soluzione sembra essere guardare le proprietà del progetto, Java percorso di generazione, cartelle di origine. Elimina la dir /src/main/resources e aggiungila di nuovo. Questo fa sì che a Eclipse venga ricordato che è necessario copiare questi file nel classpath.

Questo errore mi ha colpito quando uso la versione "Neon" di Eclipse. (Ed è stato molto frustrante finché non ho realizzato la semplice soluzione appena descritta)

Problemi correlati