File.exists()为true的块内的FileNotFoundException

时间:2017-12-24 13:46:45

标签: java xml spring maven filenotfoundexception

我正在试验Spring框架,运行一些教程。

由于某种原因,找不到bean.xml。

编辑#5:正如答案建议的那样,当我使用的方法在Classpath中查找文件时,与绝对路径一起存在的文件是无关紧要的。 (ClassPathXmlApplicationContext的())

编辑#1:请仔细阅读代码:文件存在,失败的代码在if (xmlFile.exists())块内

我尝试了一个相对路径,在项目的roo中使用了文件,我在项目文件夹中使用了文件的绝对路径,我尝试将Beans.xml移动到我的几个文件的根目录下驱动器。具有相同路径的File.exists()调用成功,但ClassPathXmlApplicationContext()构造函数始终失败...

我的困惑是出现FNF异常的原因,然后File.exists()为true,我只有一个fileName String

非常感谢任何帮助。

编辑#2:我现在在linux机器上尝试了相同的代码。我完全得到了相同的错误(使用Linux路径ofc)

编辑#3:我现在已将文件复制到目标/类并运行。理想情况下,我希望在资源方面...我该如何去做?

我正在运行Spring Tool Suite

版本:3.9.2.RELEASE

Build Id:201712210947

平台:Eclipse Oxygen.2(4.7.2)

在Windows 10上

这是我的ApplicationStart.java:

package com.example.pkg;

import java.io.File;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ApplicationStart {
    public static void main(String[] args) {
        //System.out.println("Working Directory = " + System.getProperty("user.dir"));
        String xmlFileName = "E:\\Beans.xml";
        File xmlFile = new File(xmlFileName);
        if (xmlFile.exists()) {
            System.out.println(xmlFile.getAbsolutePath() + " exists - Running Spring code");
            ApplicationContext appCtx = new ClassPathXmlApplicationContext(xmlFileName);
            Point p = (Point) appCtx.getBean("ZeroPoint");
            System.out.println(p.getX());
            System.out.println(p.getY());
            Point p2 = (Point) appCtx.getBean("TenPoint");
            System.out.println(p2.getX());
            System.out.println(p2.getY());
        } else {
            System.err.println("File " + xmlFileName + " does not exist.");
        }
    }
}

My Point.java

package com.example.pkg;

public class Point {

    private int x;
    private int y;

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
}

My Beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <bean id="ZeroPoint" class="com.example.pkg.Point">
        <property name="x" value="0" />
        <property name="y" value="0" />
    </bean>
    <bean id="TenPoint" class="com.example.pkg.Point">
        <property name="x" value="10" />
        <property name="y" value="10" />
    </bean>
</beans>

我的pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>group</groupId>
    <artifactId>artifact</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.0.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.0.RELEASE</version>
        </dependency>
    </dependencies>
</project>

“作为java应用程序运行”的输出:

Working Directory = C:\Users\jonas\Documents\workspaces\sts_test\artifact
C:\Users\jonas\Documents\workspaces\sts_test\artifact\Beans.xml exists - Running Spring code
dec. 24, 2017 2:36:08 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@137e0d2: startup date [Sun Dec 24 14:36:08 CET 2017]; root of context hierarchy
dec. 24, 2017 2:36:08 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [Beans.xml]
Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [Beans.xml]; nested exception is java.io.FileNotFoundException: class path resource [Beans.xml] cannot be opened because it does not exist
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:343)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:303)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:187)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:223)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:194)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:258)
    at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:128)
    at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:94)
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:133)
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:620)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:521)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:144)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:85)
    at com.example.pkg.ApplicationStart.main(ApplicationStart.java:15)
Caused by: java.io.FileNotFoundException: class path resource [Beans.xml] cannot be opened because it does not exist
    at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:177)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:329)
    ... 13 more

编辑#4:

工作代码。将文件放在/ src / main / resources中并运行以下内容对我有用:

package com.example.pkg;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ApplicationStart {
    public static void main(String[] args) {
        // System.out.println("Working Directory = " + System.getProperty("user.dir"));
        String xmlFileName = "Beans.xml";

        //System.out.println(xmlFile.getAbsolutePath() + " exists - Running Spring code");
        ApplicationContext appCtx = new ClassPathXmlApplicationContext(xmlFileName);
        Point p = (Point) appCtx.getBean("ZeroPoint");
        System.out.println(p.getX());
        System.out.println(p.getY());
        Point p2 = (Point) appCtx.getBean("TenPoint");
        System.out.println(p2.getX());
        System.out.println(p2.getY());

    }
}

1 个答案:

答案 0 :(得分:0)

如果您想使用E:\beans.xml,请尝试使用:FileSystemXmlApplicationContext

只需将此ClassPathXmlApplicationContext替换为此课程。

如果你想把它放在资源文件夹中,那么只需使用:

而不是传递完整路径
ClassPathXmlApplicationContext("beans.xml")