eclipse怀疑Java上下文加载器使用不再存在的文件
我正在编写一个测试用例,从测试资源中加载变量,并将它们加载到属性对象中。当通过与Docker容器相关的配置生成文件时,它检查是否存在仅存在于Docker容器中的文件类型。让我澄清一下:config.alt.properties
目前不存在于我的文件系统中,但它曾经存在过,我相信我曾经在它确实存在的时候运行过这些测试。当我在eclipse环境中运行此程序时,我通过调试器发现ContextClassLoader
会从无到有地提取文件,并使用该文件中曾经存在的值加载它,但与正常的config.properties
文件不同
props = new Properties();
try (InputStream altInput = Thread.currentThread().getContextClassLoader().getResourceAsStream("config.alt.properties")) {
if(altInput != null){
props.load(altInput);
}
else{
LOG.info("Using environment props file");
InputStream envInput = Thread.currentThread().getContextClassLoader().getResourceAsStream("config.properties");
props.load(envInput);
}
} catch (IOException e){
e.printStackTrace();
}
为什么会这样?更重要的是,如何让ContextClassLoader忘记这个不再存在的文件?以下是我的项目结构:
src/main/java: {empty}
src/main/resources: rebel.xml
src/test/java: testClass.Java (where code is from)
src/test/resources: config.properties, log4j2.xml
我曾尝试使用其他资源加载方法mentioned here,但所有其他方法都会导致程序根本找不到任何文件,包括config.properties
非常感谢您的帮助,谢谢
编辑:测试正在使用JUnit运行,我不知道这是否重要。这是pom中的JUnit信息。XML
在依赖项下:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
在独立的管理之下
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
# 1 楼答案
您说文件系统中不存在该文件,但似乎您只是在sources目录下查找它。但是在运行时,程序使用
target
目录下的资源文件(它们在构建时,在默认生命周期的“流程资源”阶段复制到那里),所以我看到的唯一解释是,快速解决方案是mvn clean
(或者在Eclipse中使用“Clean project”特性)要验证文件的来源,请在将其作为流获取之前,尝试
Thread.currentThread().getContextClassLoader().getResource("config.alt.properties")
,记录该值,并验证其指向的位置