81

Spring で最初の Bean を作成しようとしていますが、コンテキストのロードで問題が発生しました。src/main/resources に Bean の構成 XML ファイルがあります。

次の IOException を受け取ります。

スレッド「メイン」での例外 ネストされた例外は

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クラスパスにあります。どうしたの?

4

19 に答える 19

179

ありがとう、しかしそれは解決策ではありませんでした。うまくいかなかった理由がわかりました。

私は宣言をしたので:

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 などの多くのツールによって尊重される規則です (注意: デフォルト設定として!)。コード (投稿から) が実行モードの場合、beans.xml が jar のルートにあった (/beans にコピーされた) ため、「src/main/resources/beans.xml」のようなものは見つかりませんでした。作成された jar/ear/war 内の .xml)。

ClassPathXmlApplicationContext を使用する場合、この場合の Bean xml 定義の適切な場所の宣言は「/beans.xml」でした。これは、jar に属し、後でクラスパスに属するパスであるためです。

アーカイバー (つまり rar) を使用して jar を解凍し、ディレクトリ構造でその内容を確認することで確認できます。

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

于 2012-10-18T14:48:29.737 に答える
63

これを試して:

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

file:クラスパスではなく、ファイル システム リソースへのプレフィックス ポイント。

ファイル パスは相対またはシステム (/home/user/Work/src...) にすることができます。

于 2013-12-12T15:10:25.903 に答える
21

私も同様の問題を抱えていましたが、原因が少し異なるため、誰かに役立つ場合に備えてここで共有します.

私のファイルの場所

beans.xml ファイル

使っていた様子

ClassPathXmlApplicationContext("beans.xml");

2つの解決策があります

  1. beans.xml をパッケージから取り出し、デフォルトのパッケージに入れます。
  2. 使用中にパッケージ名を指定します。

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

于 2015-03-13T00:16:13.377 に答える
8

これは、applicationContect.xml または any_filename.XML が適切なパスに配置されていないためです。

トラブルシューティング手順

1: リソース フォルダーの下に XML ファイルを追加します。

2: リソース フォルダーがない場合。プロジェクト new > Source Folder を右クリックして new に移動し、resourceという名前を付けて、その下に XML ファイルを配置します。

于 2018-09-29T04:07:58.393 に答える
8

src/main/resourcesはソース ディレクトリであるため、直接参照しないでください。プロジェクトをビルド/パッケージ化すると、コンテンツがクラスパスの正しい場所にコピーされます。次に、このようにロードする必要があります

new ClassPathXmlApplicationContext("beans.xml")

または、このように

new GenericXmlApplicationContext("classpath:beans.xml");
于 2017-02-21T23:09:48.550 に答える
3

srcディレクトリを見てきました。xmlファイルは確かにそこに存在します。ただし、すべての出力クラスが設定されているクラスまたはbin/buildディレクトリを確認してください。使用するのに必要なのはresources/beans.xmlパスだけだと思います。

于 2012-10-15T14:16:18.477 に答える
3

.war/.jar を構築していると思われます。その結果、それはもはやファイルではなく、そのパッケージ内のリソースです。代わりにClassLoader.getResourceAsStream(String path)を試してください。

于 2012-10-15T10:35:13.823 に答える
3

最初の 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>

以下のコードでは、もう 1 つ applicationContext を作成しようとします。

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

との違いを見るbeans.xmlapplicationContext.xml

また、appliationContext.xmlunder<META-INF/spring/>が wi​​th で宣言されている場合<import resource="beans.xml"/>、これはの同じ場所に をappliationContext.xmlロードしています。beans.xmlMETA-INF/springappliationContext.xml

一方; コードで; 以下のように宣言されている場合

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

WEB-INF/classesこれはeclipse の OR でbeans.xml を見ていsrc/main/resourcesます。

beans.xml[ at src/main/resourcesthenを追加した場合はWEB-INF/classes、WAR の作成中に at に配置される可能性があります。]

したがって、完全に2 つのファイルが検索されます。

applicationContext.xml以下のようにインポート中にクラスパスルックアップを追加することで、この問題を解決しました

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

ClassPathXmlApplicationContext("beans.xml")Javaコードの行を削除して、ロードされるApplicationContextが1つだけになるようにします。

于 2016-11-16T09:00:28.327 に答える
1

グラドル: 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で定義されているようにワークスペースをレイアウトしました

デフォルトの gradle タスク セットを使用してテストを実行する場合、C:\.....\src\test\resourcesでテスト リソースを検索する「processTestResources」ステップが含まれます(Gradle は完全なパスを提供します)。

.properties ファイルと applicationContext.xml は、このディレクトリにある必要があります。リソースディレクトリが存在しない場合 (私の場合のように)、そこにファイルをコピーして作成する必要があります。この後、ファイル名を指定するだけで問題なく動作しました。

context = new ClassPathXmlApplicationContext("applicationContext.xml");
于 2019-05-14T16:03:27.193 に答える
0

私はそれを書くかどうか確信が持てませんでしたが、誰かが数時間を節約できるかもしれません:

mvn clean

構成全体がすでに完璧であれば、仕事をするかもしれません!

于 2019-03-19T12:46:01.813 に答える
0

私は IntelliJ を使用していて、同じ問題に直面しました。以下は私がそれを解決した方法です:

1. Spring アプリケーション クラスに、他のインポートと共に次のようにリソース インポートを追加しました。@ImportResource("applicationContext.xml")

2. IDE が次のように表示Cannot resolve file 'applicationContext.xml'されていることを確認し、ファイルが予期される場所のパスも提案します (ファイル applicationContext.xml が最初に保持されたリソースではありませんでした)。

3.予想される場所にファイルをコピーし、例外が解決されました。

簡単に参照できるように、以下のスクリーン ショットを参照してください。 ここに画像の説明を入力

ただし、リソースに保持したい場合は、以下のこの素晴らしい回答リンクに従って、検索されるようにリソースパスを追加してください. この設定では、上記の手順で説明した @ImportResource なしで例外が解決されます。

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

于 2021-02-16T19:11:12.700 に答える