programing

spring에서 bean xml 구성 파일이 존재해도 찾을 수 없습니다.

showcode 2023. 3. 11. 09:38
반응형

spring에서 bean xml 구성 파일이 존재해도 찾을 수 없습니다.

봄에 첫 콩을 만들려고 하는데 콘텍스트를 로드하는 데 문제가 생겼어요.src/main/resources에 bean 설정 XML 파일이 있습니다.

다음과 같은 IOException을 수신합니다.

스레드 "main" org.springframework에 예외가 있습니다.콩류.BeanDefinitionStoreException: IOException이 클래스 경로 리소스 [src/main/resources/beans.xml]에서 XML 문서를 구문 분석합니다. 중첩된 예외는 다음과 같습니다.

java.io 를 참조해 주세요.FileNotFoundException: 클래스 경로 리소스 [src/main/resources/beans.xml]이(가) 없으므로 열 수 없습니다.

저는 다음 코드 테스트를 하기 때문에 이해할 수 없습니다.

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

★★★★★★★★★★★★★★★★★★★★★!resources클래스 패스에 있습니다.가잘 ??

고마워요, 하지만 그건 해결책이 아니었어요.그게 왜 나한테 안 먹혔어.

내가 선언을 했으니

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");

그리고 그것이 문제를 해결했다 - 아마도 누군가에게 도움이 될 것이다.

편집:

많은 사람들이 그 해결책에 찬성하고 몇 년 전에 Spring을 학생으로서 처음 경험했기 때문에, 나는 그것이 왜 효과가 있는지 간단히 설명하고 싶다.

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

이는 프로젝트 구축 과정에서 maven이나 sbt와 같은 많은 도구에 의해 존중되는 규칙입니다(참고: 기본 구성으로!).(post에서) 코드가 실행 모드일 때 beans.xml이 jar 루트(작성된 jar/ear/war에서 /beans.xml로 복사됨)에 있기 때문에 "src/main/resources/beans.xml"과 같은 것을 찾을 수 없었습니다.

ClassPathXml ApplicationContext를 사용할 때 beans xml 정의에 대한 적절한 위치 선언은 "/beans.xml" 이었습니다.이는 jar에 속한 경로이며 나중에 클래스 경로에 속하기 때문입니다.

이는 아치버(rar)로 항아리를 풀어서 확인할 수 있으며 디렉토리 구조에서 해당 내용을 확인할 수 있습니다.

보충 자료로 클래스 패스에 관한 기사를 읽는 것을 추천합니다.

이것을 시험해 보세요.

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

file: 프리픽스는 클래스 경로가 아닌 파일 시스템 리소스를 가리킵니다.

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

저도 비슷한 문제가 있었지만, 원인이 조금 다르기 때문에 혹시 도움이 될 수 있을지도 모르니 여기서 공유해 주세요.

내 파일 위치

beans.xml 파일

사용방법

ClassPathXmlApplicationContext("beans.xml");

두 가지 해결책이 있습니다.

  1. 패키지에서 beans.xml을 꺼내 기본 패키지에 넣습니다.
  2. viz를 사용하는 동안 패키지 이름을 지정하십시오.

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

src/main/resources는 소스 디렉토리이므로 직접 참조하지 마십시오.프로젝트를 빌드/패키지화하면 내용은 클래스 경로에 맞는 올바른 위치에 복사됩니다. 다음 .

new ClassPathXmlApplicationContext("beans.xml")

아니면 이렇게

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

이는 applicationContect.xml 또는 any_filename이 원인입니다.XML이 올바른 경로 아래에 배치되지 않았습니다.

트러블 슈팅 순서

1: 자원 폴더 아래에 XML 파일을 추가합니다.

2: 리소스 폴더가 없는 경우.프로젝트 new > Source Folder 우클릭으로 신규로 이동하여 리소스 이름을 지정하고 XML 파일을 그 아래에 배치합니다.

을 사용하다ApplicationContext context = new FileSystemXmlApplicationContext("Beans.xml");

지금까지 src 디렉토리를 확인했습니다.xml 파일이 실제로 존재합니다.그러나 모든 출력 클래스가 설정된 클래스 또는 bin/build 디렉토리를 확인합니다.사용하기 위해서는 resources/beans.xml 경로만 필요합니다.

.war/.jar를 빌드하고 있는 것 같습니다.따라서 파일이 아니라 패키지 내의 자원입니다.대신 ClassLoader.getResourceAsStream(String 경로)을 사용해 보십시오.

번째 는 application Context의 됩니다.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아래<META-INF/spring/>했습니다.<import resource="beans.xml"/> 이쪽이appliationContext.xml를 로드하고 있습니다.beans.xml 장소에META-INF/springappliationContext.xml.

코드 내, 아래와 같이 선언된 경우

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

은 beans.xml의 beans을 참조하고 .WEB-INF/classes 또는 OR src/main/resources.

[[추한우경]]를beans.xmlsrc/main/resources그러면 에 배치될지도 모른다.WEB-INF/classes[WAR ★★★★★★★

따라서 총 두 개의 파일이 검색됩니다.

중에 클래스 하여 이 했습니다.applicationContext.xml와 같이

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

요.ClassPathXmlApplicationContext("beans.xml")Application Context 1 개개 。

봄에는 모든 소스 파일이 src/main/java 안에 있습니다.마찬가지로 리소스는 일반적으로 src/main/resources 내에 저장됩니다.따라서 스프링 구성 파일은 리소스 폴더에 보관하십시오.

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

.classpath에서 다음 두 줄을 확인합니다.누락된 경우 추가합니다.

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

따라서 모든 것이 갖추어져 있다면 아래 코드가 유효합니다.

ApplicationContext ctx = 새로운 ClassPathXml ApplicationContext("Spring-Module.xml");

그라들: v4.10.3

IDE : IntelliJ

gradle을 사용하여 빌드 및 테스트를 실행할 때 이 문제에 직면했습니다.applicationContext.xml을 복사해도 도움이 되지 않았습니다.다음과 같이 완전한 경로를 지정해도 도움이 되지 않습니다.

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

(적어도 gradle에 대한) 해결책은 gradle이 리소스를 처리하는 방식에 있습니다.gradle 프로젝트에서는 https://docs.gradle.org/current/userguide/java_plugin.html#sec:java_project_layout에서 정의한 워크스페이스를 배치했습니다.

기본 그래들을 사용하여 테스트를 실행하는 경우 작업 세트에는 "프로세스"가 포함됩니다.Test Resources" 스텝: C:\..에서 테스트리소스를 검색합니다.\src\test\resources(그래들에서는 전체 경로가 제공됩니다).

.properties 파일과 applicationContext.xml이 이 디렉토리에 있어야 합니다.리소스 디렉토리가 없는 경우(내 경우와 같이) 해당 디렉토리를 만들어야 합니다.그 후, 파일명을 지정하는 것만으로 문제가 없어졌습니다.

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

Beans.xml 또는 파일.XML이 올바른 경로 아래에 배치되지 않았습니다.Maven 프로젝트가 있는 경우 리소스 폴더에 XML 파일을 추가해야 합니다.src -> 메인 -> Java -> 리소스

나는 대부분과 정반대의 일을 했다.Force IDE Luna Java EE를 사용하고 있으며 패키지 내에 Beans.xml 파일을 배치했습니다만, ClassPathXMLapplicationContext 인수의 Beans.xml 문자열 앞에 상대 경로를 지정했습니다.메인 어플리케이션인 Beans.xml 파일에 액세스하는 어플리케이션에는 다음과 같은 기능이 있습니다.

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

또한 SRC 폴더에서 패키지로 Beans.xml 파일을 이동하자마자 XML 파일아이콘 왼쪽 하단에 Bean 이미지가 있는 것을 알 수 있었습니다.이 이미지는 이 xml 파일이 패키지 외부에 있을 때는 존재하지 않았습니다.ClassPathXMLApplicationsContext에서 beans xml 파일에 액세스할 수 있게 되었음을 알려주는 좋은 지표입니다.

이것이 나에게 효과가 있었다.

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

이 문제로 인해 이클립스를 사용하여 개발 중인 경우 이 이클립스 버그를 확인하십시오. "src/main/resources"의 리소스 파일이 클래스 경로에 올바르게 포함되어 있지 않습니다.

해결책은 프로젝트의 속성, Java 빌드 경로, 소스 폴더를 살펴보는 것입니다./src/main/resources한 번 더 추가하다.이 경우 이클립스는 이러한 파일을 클래스 경로에 복사해야 함을 알립니다.

이 버그는 Eclipse의 "Neon" 릴리스를 사용할 때 영향을 미쳤습니다.(그리고 방금 설명한 간단한 수정을 알기 전까지는 매우 답답했습니다.)

저는 이 문제를 경험하고 있었고, 그것은 저를 미치게 했습니다.결국 제 POM.xml에 다음과 같은 문제가 있다는 것을 알게 되었습니다.그것이 문제의 원인입니다.

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

쓸 자신이 없었지만 누군가 몇 시간을 절약할 수 있을 것 같습니다.

mvn clean

모든 구성이 이미 완벽하다면 이 작업을 수행할 수 있습니다.

저는 한동안 이 문제에 매달렸고 다음과 같은 해결책에 도달했습니다.

  1. ApplicationContextAware 클래스(ApplicationContextAware를 구현하는 클래스)를 만듭니다.
  2. Application Context Aware에서는 하나의 메서드만 구현해야 합니다.

    public void set Application Context(Application Context 컨텍스트)가 Beans Exception을 슬로우합니다.

  3. 이 새로운 콩에 대한 스프링 컨텍스트를 설명합니다(Spring Context라고 부릅니다).

    bean id ="springContext" class="springke.of" 입니다.Spring Context" />

여기 코드 조각이 있습니다.

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class SpringContext implements ApplicationContextAware {
  private static ApplicationContext context;

  @Override
  public void setApplicationContext(ApplicationContext context) throws BeansException {
    this.context = context;
  }
  public static ApplicationContext getApplicationContext() {
    return context;
  }
}
  1. 다음으로 스프링 콘텍스트 이외의 응용 프로그램콘텍스트의 임의의 메서드를 호출할 수 있습니다.예를 들어,

    
    Some Service Class Or Component 유틸리티 Service Spring Context.get Application Context().getBean(Some Service Class Or Component . class );
    

이것이 많은 사용자들의 문제를 해결해 주길 바랍니다.

나는 IntelliJ에 있고 같은 문제에 직면했다.해결 방법은 다음과 같습니다.

1. Spring 어플리케이션클래스에 자원 Import를 다른 Import와 함께 다음과 같이 추가하였습니다.@ImportResource("applicationContext.xml")

2. IDE 표시:Cannot resolve file 'applicationContext.xml'또한 파일을 예상하는 경로도 제시합니다(원래는 applicationContext.xml 파일이 보관되어 있던 리소스가 아닙니다).

3. 예상 위치에 파일을 복사하여 예외가 해결되었습니다.

아래 스크린샷은 참조가 용이합니다.

그러나 리소스를 유지하려면 아래의 훌륭한 답변 링크를 따라 리소스 경로를 추가하여 검색하십시오.이 설정을 사용하면 위의 단계에서 설명한 @ImportResource 없이 예외가 해결됩니다.

https://stackoverflow.com/a/24843914/5916535

케이스와 디버깅 방법을 공유하면 도움이 될 수 있습니다.

이것은, 최초로 확인했을 경우에만 관련성이 있습니다.resources올바른 위치에 올바른 이름을 가진 폴더

  1. git 프로젝트(예: git 프로젝트) 중 어딘가에 임시 폴더를 만듭니다.mkdir playground( )로 이동합니다( ).cd playground)
  2. Java 아카이브를 복사합니다(예:cp /path/to/java.war .beans.xml이 없는 경우)
  3. 개봉합니다(예:unzip java.warubuntu에서)
  4. (WEB-INF/classes 등) .xml 파일이 있는지 확인합니다.(패킹 해제 프로세스에는 압축 해제 중인 파일 목록이 표시되어야 합니다.대부분은 아카이브로서 다른 의존관계일 가능성이 높기 때문에 관련이 없습니다.)
  5. beans.xml이 표시되지 않으면 다른 .xml 파일(예:cat root-config.xml)는 다음과 같은 것을 찾을 수 있습니다.root-config.xml거기나 비슷한 거, 거기엔 다른 게 있을 거야.<import resource="somethingelse.xml">기록인지 아닌지.
  6. 이 경우는, 그 파일이 있는 것을 의미합니다(root-config.xml(여기서) 프로젝트에 포함되거나 그렇지 않은 경우 상위 프로젝트를 계속 진행하여 아카이브를 패키지화합니다.해당 파일을 찾아 추가합니다.<import resource="beans.xml">실행하다mvn package.

이 시점에서, 1.5 의 순서를 실행해 수정을 검증하면, 그 파일이 됩니다(root-config.xml여기서)는 beans.xml이 정의되어 있는 새로운 패키지 아카이브로 전개하면 동작합니다.

resources 폴더에 beans.xml이 있는지 확인합니다.

언급URL : https://stackoverflow.com/questions/12893760/spring-cannot-find-bean-xml-configuration-file-when-it-does-exist

반응형