file.exists() 为真的块内的 FileNotFoundException
FileNotFoundException inside block where file.exists() is true
我正在通过一些教程试验 Spring 框架,运行。
由于某种原因,找不到 bean.xml。
编辑#5:正如答案所暗示的,当我使用的方法是在类路径中查找文件时,与绝对路径一起存在的文件是无关紧要的。 (ClassPathXmlApplicationContext())
编辑 #1:请阅读代码:文件存在,失败的代码在 if (xmlFile.exists())
块内
我尝试了相对路径,文件在项目的根目录下,我使用了项目文件夹中文件的绝对路径,我试过将 Beans.xml 移动到根目录我的几个驱动器。相同路径的File.exists()
调用成功,但是ClassPathXmlApplicationContext()
构造函数总是失败...
我的困惑是为什么会出现FNF异常,然后File.exists()为真,而我只有那个fileName String
非常感谢任何帮助。
编辑 #2:我现在已经在 linux 机器上尝试了相同的代码。我得到完全相同的错误(带有 Linux 路径 ofc)
编辑 #3:我现在已将文件复制到 target/classes 并运行。理想情况下,我希望它在资源中...我该怎么做?
我是运行Spring工具套件
版本:3.9.2.RELEASE
内部版本号: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.");
}
}
}
我的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;
}
}
我的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>
"run as java application" 的输出:
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());
}
}
如果您想使用 E:\beans.xml
,请尝试使用:FileSystemXmlApplicationContext。
只需将您的 ClassPathXmlApplicationContext
替换为 class。
如果你想把它放在资源文件夹中,而不是传递完整路径,只需使用:
ClassPathXmlApplicationContext("beans.xml")
我正在通过一些教程试验 Spring 框架,运行。
由于某种原因,找不到 bean.xml。
编辑#5:正如答案所暗示的,当我使用的方法是在类路径中查找文件时,与绝对路径一起存在的文件是无关紧要的。 (ClassPathXmlApplicationContext())
编辑 #1:请阅读代码:文件存在,失败的代码在 if (xmlFile.exists())
块内
我尝试了相对路径,文件在项目的根目录下,我使用了项目文件夹中文件的绝对路径,我试过将 Beans.xml 移动到根目录我的几个驱动器。相同路径的File.exists()
调用成功,但是ClassPathXmlApplicationContext()
构造函数总是失败...
我的困惑是为什么会出现FNF异常,然后File.exists()为真,而我只有那个fileName String
非常感谢任何帮助。
编辑 #2:我现在已经在 linux 机器上尝试了相同的代码。我得到完全相同的错误(带有 Linux 路径 ofc)
编辑 #3:我现在已将文件复制到 target/classes 并运行。理想情况下,我希望它在资源中...我该怎么做?
我是运行Spring工具套件
版本:3.9.2.RELEASE
内部版本号: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.");
}
}
}
我的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;
}
}
我的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>
"run as java application" 的输出:
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());
}
}
如果您想使用 E:\beans.xml
,请尝试使用:FileSystemXmlApplicationContext。
只需将您的 ClassPathXmlApplicationContext
替换为 class。
如果你想把它放在资源文件夹中,而不是传递完整路径,只需使用:
ClassPathXmlApplicationContext("beans.xml")