it-swarm.dev

Spring nie może znaleźć pliku konfiguracyjnego XML xml, gdy istnieje

Próbuję zrobić mój pierwszy bean w Spring, ale mam problem z ładowaniem kontekstu ..__ Mam plik konfiguracyjny XML bean w src/main/resources.

Otrzymuję następujący wyjątek IOException:

Wyjątek w wątku „main” org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsowanie dokumentu XML z zasobu ścieżki klasy [src/main/resources/beans.xml]; zagnieżdżonym wyjątkiem jest 

Java.io.FileNotFoundException: zasób ścieżki klasy [src/main/resources/beans.xml] nie może być otwarty, ponieważ nie istnieje

ale tego nie rozumiem, ponieważ wykonuję następujący test kodu:

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

co daje mi prawdziwe! resources znajduje się w ścieżce klasy. Co jest nie tak?

64
dawrutowicz

Dzięki, ale to nie było rozwiązanie. Odkryłem, dlaczego to nie działa dla mnie.

Odkąd złożyłem deklarację: 

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

Pomyślałem, że odwołam się do katalogu głównego projektu, gdy był tam plik beans.xml .. Następnie umieściłem plik konfiguracyjny w src/main/resources i zmieniłem inicjalizację na: 

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

to nadal był wyjątek IO.

Następnie plik pozostawiono w src/main/resources/ale zmieniłam deklarację na:

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

i rozwiązało problem - może komuś się przyda.

dzięki i wiwaty!

Edytować:

Ponieważ wielu ludzi aprobuje rozwiązanie, a kilka lat temu miałem pierwsze doświadczenia z Springem jako studentem, pragnę krótko wyjaśnić, dlaczego to działa.

Gdy projekt jest kompilowany i pakowany, wszystkie pliki i podkatalogi z 'src/main/Java' w projekcie trafiają do katalogu głównego spakowanego słoika (artefakt, który chcemy utworzyć). Ta sama zasada dotyczy „src/main/resources”. 

Jest to konwencja respektowana przez wiele narzędzi, takich jak maven lub sbt w procesie tworzenia projektu (uwaga: jako konfiguracja domyślna!). Gdy kod (z postu) był w trybie uruchamiania, nie mógł znaleźć niczego takiego jak „src/main/resources/beans.xml” ze względu na fakt, że plik bean.xml znajdował się w katalogu głównym jar (skopiowany do/bean .xml w utworzonym słoiku/uchu/wojnie). 

W przypadku użycia ClassPathXmlApplicationContext poprawna deklaracja lokalizacji dla definicji xml fasoli, w tym przypadku, to „/beans.xml”, ponieważ jest to ścieżka, do której należy w jar, a później w ścieżce klasy.

Można to sprawdzić, rozpakowując słoik za pomocą archiwizatora (np. Rar) i sprawdzając jego zawartość w strukturze katalogów. 

Polecam czytanie artykułów o ścieżce klas jako uzupełnienia.

128
dawrutowicz

Spróbuj tego:

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

plik: prefiks wskazuje zasoby systemu plików, a nie ścieżkę klasy.

ścieżka pliku może być względna lub systemowa (/ home/user/Work/src ...)

46

Miałem również podobny problem, ale z powodu nieco innej przyczyny, więc dzielę się tutaj na wypadek, gdyby mógł komukolwiek pomóc.

Moja lokalizacja plik

beans.xml file

Jak korzystałem

ClassPathXmlApplicationContext("beans.xml");

Istnieją dwa rozwiązania

  1. Wyjmij plik beans.xml z pakietu i umieść go w pakiecie domyślnym.
  2. Podaj nazwę pakietu podczas jego używania, a mianowicie.

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

19
Kalher

src/main/resources jest katalogiem źródłowym, nie powinieneś odwoływać się do niego bezpośrednio. Podczas budowania/pakowania projektu zawartość zostanie skopiowana do właściwego miejsca dla ścieżki klas. Powinieneś to załadować w ten sposób

new ClassPathXmlApplicationContext("beans.xml")

Lub tak

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

Przejrzałeś katalog src. Plik xml rzeczywiście istnieje. Ale spójrz na katalog klasy lub bin/build, w którym ustawione są wszystkie twoje klasy wyjściowe. Podejrzewam, że do użycia będziesz potrzebować tylko ścieżki resources/beans.xml.

3
Michael Z

Podejrzewam, że budujesz .war/.jar iw związku z tym nie jest już plikiem, ale zasobem w tym pakiecie. Spróbuj ClassLoader.getResourceAsStream (String path) zamiast.

3
Brian Agnew

użyj ApplicationContext context = new FileSystemXmlApplicationContext("Beans.xml");

3
Deep Shah

Dzieje się tak, ponieważ applicationContect.xml lub any_filename.XML nie jest umieszczony pod właściwą ścieżką.

Kroki rozwiązywania problemów

1: Dodaj plik XML w folderze zasobów.

2: Jeśli nie masz folderu zasobów. Utwórz je, nawigując po nowym, klikając prawym przyciskiem myszy projekt nowy> Folder źródłowy, nazwij go jako zasób i umieść pod nim swój plik XML.

2
Gani

W Spring wszystkie pliki źródłowe znajdują się wewnątrz src/main/Java. Podobnie zasoby są zazwyczaj przechowywane w src/main/resources. Więc trzymaj swój plik konfiguracyjny wiosną w folderze zasobów.

Upewnij się, że masz również wpis ClassPath dla swoich plików wewnątrz src/main/resources.

W .classpath sprawdź następujące 2 wiersze. Jeśli ich brakuje, dodaj je.

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

Więc jeśli masz wszystko na miejscu, poniższy kod powinien działać.

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

1
Shashesh

Zauważ, że pierwszy applicationContext jest ładowany jako część web.xml; który jest wymieniony poniżej.

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

Gdzie, jak poniżej, kod będzie również próbował utworzyć jeden dodatkowy applicationContext.

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

Zobacz różnicę między beans.xml a applicationContext.xml

A jeśli appliationContext.xml w <META-INF/spring/> zadeklarował z <import resource="beans.xml"/>, to ten appliationContext.xml ładuje beans.xml w tej samej lokalizacji META-INF/spring z appliationContext.xml.

Natomiast; w kodzie; jeśli zostanie zadeklarowane jak poniżej

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

To wygląda na plik bean.xml pod adresem WEB-INF/classes OR w Eclipse src/main/resources.

[Jeśli dodałeś beans.xml do src/main/resources, to może zostać umieszczony w WEB-INF/classes podczas tworzenia WAR.]

Tak więc pliki DWA są wyszukiwane.

Rozwiązałem ten problem, dodając wyszukiwanie ścieżki klasy podczas importowania w applicationContext.xml, jak poniżej

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

i usunął wiersz ClassPathXmlApplicationContext("beans.xml") w kodzie Java, tak aby był załadowany tylko jeden ApplicationContext.

1

Zrobiłem odwrotnie niż większość. Używam Force IDE Luna Java EE i umieściłem plik Beans.xml w pakiecie; jednak poprzedziłem ciąg Beans.xml - dla argumentu ClassPathXMLApplicationContext - ścieżką względną. Więc w mojej głównej aplikacji - tej, która uzyskuje dostęp do pliku Beans.xml - mam: 

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

Zauważyłem też, że jak tylko przeniosłem plik Beans.xml do pakietu z folderu src, w lewym dolnym rogu ikony pliku XML znajdował się obraz fasoli, którego nie było, gdy ten plik xml znajdował się poza pakietem. To dobry wskaźnik informujący mnie, że teraz plik xml komponentu bean jest dostępny dla klasy ClassPathXMLAppllicationsContext.

0
user1548875

Gradle: v4.10.3

IDE: IntelliJ

Stawiałem czoła temu problemowi podczas korzystania z narzędzia stopniowania do uruchamiania kompilacji i testu. Kopiowanie pliku applicationContext.xml w każdym miejscu nie pomogło. Nawet określenie pełnej ścieżki jak poniżej nie pomogło!

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

Rozwiązanie (co najmniej stopniowe) polega na sposobie, w jaki gradle przetwarza zasoby. Dla mojego projektu gradle określiłem obszar roboczy zdefiniowany w https://docs.gradle.org/current/userguide/Java_plugin.html#sec:Java_project_layout

Podczas uruchamiania testu przy użyciu domyślnego zestawu stopni, zadania obejmują krok „processTestResources”, który szuka zasobów testowych w C: ..... src test resources (Gradle przydatny zapewnia pełną ścieżkę).

Twój plik .properties i applicationContext.xml muszą znajdować się w tym katalogu. Jeśli katalog zasobów nie jest obecny (tak jak w moim przypadku), musisz go utworzyć, skopiuj tam pliki. Po tym, proste określenie nazwy pliku działało dobrze.

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

Doświadczyłem tego problemu i doprowadzało mnie to do szału; Ostatecznie znalazłem następujące leżące w moim pliku POM.xml, który był przyczyną problemu:

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

Nie byłem pewien, czy to napiszę, ale może ktoś zaoszczędzi kilka godzin:

mvn clean

może wykonać zadanie, jeśli cała konfiguracja jest już idealna!

0
İsmail Yavuz

Jeśli ten problem wciąż cię dręczy i rozwijasz się za pomocą Eclipse, spójrz na ten błąd Eclipse: Pliki zasobów z "src/main/resources" nie są poprawnie zawarte w ścieżce classpath

Rozwiązaniem wydaje się być spojrzenie na właściwości projektu, ścieżkę budowania Java, foldery źródłowe. Usuń katalog /src/main/resources i dodaj go ponownie. Powoduje to przypomnienie o tym, że Eclipse musi skopiować te pliki do ścieżki klas.

Ten błąd dotknął mnie podczas korzystania z wersji „Neon” Eclipse. (I było bardzo frustrujące, dopóki nie zdałem sobie sprawy z opisanej prostej poprawki)

0
Geeb

To właśnie dla mnie działało:

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