1. ホーム
  2. spring

[解決済み] Spring は Bean xml 設定ファイルが存在するにもかかわらず見つけることができない

2023-06-30 17:39:40

質問

Springで最初のBeanを作ろうとしているのですが、コンテキストの読み込みで問題が発生しました。 私はsrc/main/resourcesにBeanの構成XMLファイルを持っています。

次のようなIOExceptionが発生します。

スレッド "main" org.springframework.beans.factory.BeanDefinitionStoreException で例外が発生しました。IOException parsing XML document from class path resource [src/main/resources/beans.xml]; nested exception is.

java.io.FileNotFoundException: クラス パス リソース [src/main/resources/beans.xml] は存在しないため開けません。 存在しないため、開くことができません。

と表示されますが、以下のようなコードテストを行うため、取得できません。

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

で、true! resources はクラスパスにあります。どうしたのでしょうか?

どのように解決するのですか?

ありがとうございます、しかしそれは解決策ではありませんでした。私はそれが私のために動作していなかった理由を発見した。

宣言をしてから

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

beans.xmlがある時点で、プロジェクトのルートディレクトリを参照しようと思っていました。 そこで、設定ファイルをsrc/main/resourcesに置き、初期化を変更しました。

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

は、やはりIO Exceptionでした。

その後、ファイルはsrc/main/resources/に残っていましたが、宣言を変えてみました。

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

で、問題は解決しました。もしかしたら、誰かの役に立つかもしれません。

ありがとうございます、そしてありがとうございます。

編集する

数年前に学生時代に初めてSpringを使ったことがあり、その解決策を多くの人に評価してもらったので、なぜうまくいくのかを手短に説明したいと思います。

プロジェクトがコンパイルされパッケージ化されるとき、プロジェクト内の 'src/main/java' からのすべてのファイルとサブディレクトリは、パッケージ化された jar (作成したい成果物) のルートディレクトリに移動します。同じルールが 'src/main/resources' にも適用されます。

これは、プロジェクトを構築する過程で、mavenやsbtのような多くのツールによって尊重される慣習です(注: デフォルトの設定として!)。(投稿の) コードが実行モードになっているとき、beans.xml が jar のルートにあった (作成された jar/ear/war の /beans.xml にコピーされた) という事実のために "src/main/resources/beans.xml" など何も見つけることが出来ませんでした。

ClassPathXmlApplicationContext を使用する場合、bean xml 定義の適切な場所宣言は、この場合、" /beans.xml" であり、これは jar および後でクラスパスに属するパスであるためです。

これは、アーカイバ (例: rar) で jar を解凍し、ディレクトリ構造でその内容を確認することで検証できます。

補足として、クラスパスに関する記事を読むことをお勧めします。