有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    您说文件系统中不存在该文件,但似乎您只是在sources目录下查找它。但是在运行时,程序使用target目录下的资源文件(它们在构建时,在默认生命周期的“流程资源”阶段复制到那里),所以我看到的唯一解释是,快速解决方案是mvn clean(或者在Eclipse中使用“Clean project”特性)

    要验证文件的来源,请在将其作为流获取之前,尝试Thread.currentThread().getContextClassLoader().getResource("‌​config.alt.propertie‌​s"),记录该值,并验证其指向的位置