由以下原因导致的Intellij类路径错误:java.io.FileNotFoundException

由以下原因导致的Intellij类路径错误:java.io.FileNotFoundException,java,spring,intellij-idea,classpath,Java,Spring,Intellij Idea,Classpath,Intellij项目的目录: src/main/java/rewards/testdb/schema.sql src/main/java/rewards/testdb/test-data.sql src/main/java/rewards/testdb/config/alternate-datasource-config.xml src/main/java/rewards/testdb/config/AlternateDataSourceConfigTests.java 正在测试的bean配置

Intellij项目的目录:

src/main/java/rewards/testdb/schema.sql
src/main/java/rewards/testdb/test-data.sql
src/main/java/rewards/testdb/config/alternate-datasource-config.xml
src/main/java/rewards/testdb/config/AlternateDataSourceConfigTests.java
正在测试的bean配置(来自alternate datasource config.xml):

但是,如果我将目录修改为:

src/main/java/rewards/testdb/config/schema.sql
src/main/java/rewards/testdb/config/test-data.sql
src/main/java/rewards/testdb/config/alternate-datasource-config.xml
src/main/java/rewards/testdb/config/AlternateDataSourceConfigTests.java
<bean id="dataSource-createdFromList" class="org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactoryBean" lazy-init="true">
        <property name="databaseName" value="rewards" />
        <property name="databasePopulator">
            <bean class="org.springframework.jdbc.datasource.init.ResourceDatabasePopulator">
                <property name="scripts">
                    <util:list>
                        <value>classpath:rewards/testdb/config/schema.sql</value>
                        <value>classpath:rewards/testdb/config/test-data.sql</value>
                    </util:list>
                </property>
            </bean>
        </property>
    </bean>
并修改我的bean配置:

src/main/java/rewards/testdb/config/schema.sql
src/main/java/rewards/testdb/config/test-data.sql
src/main/java/rewards/testdb/config/alternate-datasource-config.xml
src/main/java/rewards/testdb/config/AlternateDataSourceConfigTests.java
<bean id="dataSource-createdFromList" class="org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactoryBean" lazy-init="true">
        <property name="databaseName" value="rewards" />
        <property name="databasePopulator">
            <bean class="org.springframework.jdbc.datasource.init.ResourceDatabasePopulator">
                <property name="scripts">
                    <util:list>
                        <value>classpath:rewards/testdb/config/schema.sql</value>
                        <value>classpath:rewards/testdb/config/test-data.sql</value>
                    </util:list>
                </property>
            </bean>
        </property>
    </bean>

classpath:rewards/testdb/config/schema.sql
classpath:rewards/testdb/config/test-data.sql
…我的考试通过。


为什么?

Spring将资源引用解释为相对于(您的测试类)。您应该始终确保在资源引用中使用绝对路径,即:

<value>classpath:/rewards/testdb/schema.sql</value>
<value>classpath:/rewards/testdb/test-data.sql</value>
classpath:/rewards/testdb/schema.sql
classpath:/rewards/testdb/test-data.sql

(注意资源规范中的初始正斜杠)

在您的idea项目配置中,将目标路径指向您的项目目标文件夹:编辑配置->部署->编辑工件(单击铅笔图标)->将“输出目录”输入设置为“您的项目文件夹\路径/目标” 然后,无论何时编辑jdbc.properties文件,它都会在重新启动后生效


这对maven web项目有效。

您应该将资源放在
src\main\resources
中。否则Xml文件将不会复制到类路径。那么为什么它会在第二个路径中通过呢?这确实不重要,但可能是因为您是从IDE内部执行此操作的:您是否尝试将资源移动到正确的目录:
src/main/resources
src/test/resources