복붙노트

[SPRING] Spring은 bean xml 설정 파일이 존재할 때 찾을 수 없다.

SPRING

Spring은 bean xml 설정 파일이 존재할 때 찾을 수 없다.

Spring에서 첫 번째 bean을 만들려고하는데 컨텍스트 로딩에 문제가있다. src / main / resources에 빈의 설정 XML 파일이있다.

다음 IOException을 수신합니다.

그러나 나는 다음의 코드 테스트를하기 때문에 그것을 얻지 못한다.

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

그것은 나에게 사실이된다! 리소스가 클래스 경로에 있습니다. 뭐가 문제 야?

해결법

  1. ==============================

    1.고마워,하지만 그건 해결책이 아니야. 나는 왜 그것이 나를 위해 일하지 않고있는 것을 발견했다.

    고마워,하지만 그건 해결책이 아니야. 나는 왜 그것이 나를 위해 일하지 않고있는 것을 발견했다.

    나는 선언을했기 때문에 :

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

    beans.xml 파일이있을 때 프로젝트의 루트 디렉토리를 참조 할 것이라고 생각했습니다. 그런 다음 구성 파일을 src / main / resources에 넣고 초기화를 다음으로 변경했습니다.

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

    여전히 IO 예외였습니다.

    그런 다음 src / main / resources /에 파일이 남았지 만 선언을 다음과 같이 변경했습니다.

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

    문제를 해결했습니다. 아마도 누군가에게 도움이 될 것입니다.

    고마움과 환호!

    편집하다:

    솔루션에 대한 많은 사람들의 의견을 얻었고 몇 년 전 학생으로서 봄을 처음 경험 한 경험이있는 이유를 간단히 설명하고자합니다.

    프로젝트가 컴파일되고 패키징되면 프로젝트의 'src / main / java'에있는 모든 파일과 하위 디렉토리가 패키지 된 jar의 루트 디렉토리 (만들려는 아티팩트)로 이동합니다. 동일한 규칙이 'src / main / resources'에도 적용됩니다.

    이것은 프로젝트를 만드는 과정에서 maven이나 sbt와 같은 많은 도구가 존중하는 관례입니다 (참고 : 기본 구성으로!). 코드 (포스트에서)가 실행 모드에있을 때 beans.xml이 jar의 루트에 있다는 사실 때문에 "src / main / resources / beans.xml"과 같은 것을 찾을 수 없습니다 (/ beans에 복사 됨). 생성 된 항아리 / 귀 / 전쟁에서 .xml).

    ClassPathXmlApplicationContext를 사용할 때 bean xml 정의에 대한 적절한 위치 선언은이 경우 jar에 속하며 나중에 classpath에있는 경로이므로 "/beans.xml"입니다.

    아카이버 (예 : rar)로 항아리를 풀고 디렉토리 구조로 내용을 확인하면 확인할 수 있습니다.

    클래스 패스에 대한 기사를 보충으로 읽는 것이 좋습니다.

  2. ==============================

    2.이 시도:

    이 시도:

    새로운 ClassPathXmlApplicationContext ( "file : src / main / resources / beans.xml");

    file : 파일 시스템 리소스에 대한 접두어이며 classpath가 아닙니다.

    파일 경로는 상대 경로 또는 시스템 일 수 있습니다 (/ home / user / Work / src ...).

  3. ==============================

    3.나도 비슷한 문제가 있었지만 약간 다른 원인 때문에 누군가에게 도움이 될 수 있도록 여기에서 공유했다.

    나도 비슷한 문제가 있었지만 약간 다른 원인 때문에 누군가에게 도움이 될 수 있도록 여기에서 공유했다.

    내 파일 위치

    내가 어떻게 사용하고 있었는지

    ClassPathXmlApplicationContext ( "beans.xml");

    두 가지 솔루션이 있습니다.

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

  4. ==============================

    4.src / main / resources는 소스 디렉토리이며 직접 참조하지 말아야합니다. 프로젝트를 빌드 / 패키지화하면 내용이 클래스 경로의 올바른 위치에 복사됩니다. 다음과 같이로드해야합니다.

    src / main / resources는 소스 디렉토리이며 직접 참조하지 말아야합니다. 프로젝트를 빌드 / 패키지화하면 내용이 클래스 경로의 올바른 위치에 복사됩니다. 다음과 같이로드해야합니다.

    new ClassPathXmlApplicationContext("beans.xml")
    

    또는 이와 같이

    new GenericXmlApplicationContext("classpath:beans.xml");
    
  5. ==============================

    5.src 디렉토리를 보았습니다. xml 파일은 실제로 거기에 존재합니다. 그러나 모든 출력 클래스가 설정된 class 또는 bin / build 디렉토리를보십시오. 나는 당신이 리소스 / beans.xml 경로 만 사용할 필요가 있다고 생각한다.

    src 디렉토리를 보았습니다. xml 파일은 실제로 거기에 존재합니다. 그러나 모든 출력 클래스가 설정된 class 또는 bin / build 디렉토리를보십시오. 나는 당신이 리소스 / beans.xml 경로 만 사용할 필요가 있다고 생각한다.

  6. ==============================

    6.그걸 써 ApplicationContext context = 새 FileSystemXmlApplicationContext ( "Beans.xml");

    그걸 써 ApplicationContext context = 새 FileSystemXmlApplicationContext ( "Beans.xml");

  7. ==============================

    7.나는 당신이 .war / .jar 파일을 만들고 있다고 의심하고, 결과적으로 더 이상 파일이 아니라 그 패키지 안에있는 리소스입니다. ClassLoader.getResourceAsStream (String 패스)를 대신 사용해주세요.

    나는 당신이 .war / .jar 파일을 만들고 있다고 의심하고, 결과적으로 더 이상 파일이 아니라 그 패키지 안에있는 리소스입니다. ClassLoader.getResourceAsStream (String 패스)를 대신 사용해주세요.

  8. ==============================

    8.이는 applicationContect.xml 또는 any_filename.XML이 올바른 경로에 있지 않기 때문입니다.

    이는 applicationContect.xml 또는 any_filename.XML이 올바른 경로에 있지 않기 때문입니다.

    문제 해결 단계

    1 : 리소스 폴더 아래에 XML 파일을 추가하십시오.

    2 : 리소스 폴더가없는 경우. 새로운 프로젝트 파일> 원본 폴더를 마우스 오른쪽 단추로 클릭하고 리소스 이름을 지정하고 XML 파일을 그 아래에 놓습니다.

  9. ==============================

    9.첫 번째 applicationContext는 web.xml의 일부로로드됩니다. 이것은 아래에 언급되어 있습니다.

    첫 번째 applicationContext는 web.xml의 일부로로드됩니다. 이것은 아래에 언급되어 있습니다.

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

    아래 코드는 또 하나의 applicationContext를 만들려고합니다.

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

    beans.xml과 applicationContext.xml의 차이점보기

    아래 appliationContext.xml이 로 선언 된 경우 appliationContext.xml은 beans.xml을 appliationContext의 META-INF / spring과 같은 위치에로드합니다. .xml.

    어디로; 코드에서; 아래에 선언 된 경우

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

    이것은 src / main / resources를 Eclipse에서 WEB-INF / classes 또는 beans.xml에서 찾는다.

    [src / main / resources에 beans.xml을 추가 한 경우 WAR을 생성하는 동안 WEB-INF / classes에 배치 될 수 있습니다.]

    따라서 완전히 두 개의 파일이 조회됩니다.

    아래처럼 applicationContext.xml에서 가져 오는 동안 classpath lookup을 추가하여이 문제를 해결했습니다.

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

    Java 코드에서 ClassPathXmlApplicationContext ( "beans.xml") 행을 제거하여 하나의 ApplicationContext 만로드되도록했습니다.

  10. ==============================

    10.Spring에서 모든 소스 파일은 src / main / java 안에있다. 비슷하게, 자원은 일반적으로 src / main / resources 내에 보관됩니다. 따라서 리소스 폴더 안에 스프링 구성 파일을 보관하십시오.

    Spring에서 모든 소스 파일은 src / main / java 안에있다. 비슷하게, 자원은 일반적으로 src / main / resources 내에 보관됩니다. 따라서 리소스 폴더 안에 스프링 구성 파일을 보관하십시오.

    src / main / resources 내에 파일에 대한 ClassPath 항목이 있는지 확인하십시오.

    .classpath에서 다음 2 행을 확인하십시오. 그들이 없다면 추가하십시오.

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

    따라서, 모든 것이 갖추어져 있다면 아래의 코드가 작동해야합니다.

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

  11. ==============================

    11.나는 대부분의 반대를했다. Force IDE Luna Java EE를 사용하고 패키지 내에 Beans.xml 파일을 저장했습니다. 그러나 Beans.xml 문자열 (ClassPathXMLApplicationContext 인수)은 상대 경로로 시작했습니다. 따라서 Beans.xml 파일에 액세스하는 내 응용 프로그램 (주 응용 프로그램)에는 다음과 같은 내용이 있습니다.

    나는 대부분의 반대를했다. Force IDE Luna Java EE를 사용하고 패키지 내에 Beans.xml 파일을 저장했습니다. 그러나 Beans.xml 문자열 (ClassPathXMLApplicationContext 인수)은 상대 경로로 시작했습니다. 따라서 Beans.xml 파일에 액세스하는 내 응용 프로그램 (주 응용 프로그램)에는 다음과 같은 내용이 있습니다.

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

    나는 또한 Beans.xml 파일을 src 폴더에서 패키지로 옮기 자마자이 XML 파일이 패키지 외부에있을 때 XML 파일 아이콘의 왼쪽 하단에 Bean 이미지가 존재한다는 것을 알았다. 그것은 Beans XML 파일이 ClassPathXMLAppllicationsContext에 의해 접근 가능하다는 것을 알려주는 좋은 지표입니다.

  12. ==============================

    12.이것이 나를 위해 일한 것입니다.

    이것이 나를 위해 일한 것입니다.

      new ClassPathXmlApplicationContext("classpath:beans.xml");
    
  13. ==============================

    13.이 문제가 아직도 여러분을 깜짝 놀라게하고 이클립스를 사용하여 개발하고 있다면이 이클립스 버그를 살펴보십시오. "src / main / resources"의 리소스 파일이 클래스 경로에 올바르게 포함되지 않았습니다.

    이 문제가 아직도 여러분을 깜짝 놀라게하고 이클립스를 사용하여 개발하고 있다면이 이클립스 버그를 살펴보십시오. "src / main / resources"의 리소스 파일이 클래스 경로에 올바르게 포함되지 않았습니다.

    솔루션은 프로젝트, Java 빌드 경로, 소스 폴더의 속성을 살펴 보는 것 같습니다. / src / main / resources 디렉토리를 삭제하고 다시 추가하십시오. 이렇게하면이 파일을 클래스 경로에 복사해야한다는 것을 Eclipse에 알리게됩니다.

    Eclipse의 "Neon"릴리스를 사용할 때이 버그가 영향을받습니다. (방금 설명한 간단한 수정을 깨닫기 전까지는 매우 실망 스러웠습니다.)

  14. from https://stackoverflow.com/questions/12893760/spring-cannot-find-bean-xml-configuration-file-when-it-does-exist by cc-by-sa and MIT license