首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ClassLoader在生成后找不到资源文件

ClassLoader在生成后找不到资源文件
EN

Stack Overflow用户
提问于 2018-09-28 04:54:48
回答 1查看 903关注 0票数 2

我在尝试指导Java在部署后从test/resources目录检索ClassLoader文件时遇到了一些问题。

代码语言:javascript
复制
public class TestFileUtil {
    private static final ClassLoader classLoader = TestFileUtil.class.getClassLoader();

    public static Map<String, Object> getJsonFileAsMap(String fileLocation) {

        try {
            return new ObjectMapper().readValue(getTestFile(fileLocation), HashMap.class);
        } catch (IOException e) {
            throw new RuntimeException("Error converting JSON file to a Map", e);
        }
    }

    private static File getTestFile(String fileLocation) {

        return new File(classLoader.getResource(fileLocation).getFile());
    }
}

该工具在使用Mockito进行本地测试时没有问题,如下所示:

代码语言:javascript
复制
public class LocalTest {

    @Before
    public void setUp() {
        Mockito.when(mockDataRetrievalService.getAssetJsonById(Mockito.any())).thenReturn(TestFileUtil.getJsonFileAsMap("test.json"));
    }
}

但是,当在我们已部署的环境中构建时,此行抛出FileNotFound异常。

在使用相对目录路径"../../test.json"时,我在两种环境中都看到了FileNotFound异常。

本地目录结构:

代码语言:javascript
复制
test
| java
| |- project
| |  |- LocalTest
| |- util
| |  |- TestFileUtil.class
| resources
| |- test.json

部署后:

代码语言:javascript
复制
test
| com
| | project
| | | dao
| | | | LocalTest
| | other project
| | | | util
| | | | | TestFileUtil.class
| | | | | test.json

在自动构建中使用ClassLoader是否有任何特殊行为或所需的目录结构?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-28 05:24:21

问题很可能是这样的:

代码语言:javascript
复制
new File(classLoader.getResource(fileLocation).getFile());

URL类的getFile()方法未返回有效的文件名。它只返回URL的路径部分,不能保证它是有效的文件名。(当URL类作为Java 1.0的一部分引入时,方法名是有意义的,因为几乎所有的URL实际上都引用物理文件,无论是在同一台机器上还是在不同的机器上。)

ClassLoader.getResource的参数不是文件名。它是一个相对URL,它的基址是ClassLoader的类路径中的每个位置。如果要读取与应用程序捆绑在一起的资源,请不要尝试将资源URL转换为文件。改为将URL读取为URL:

代码语言:javascript
复制
public class TestFileUtil {
    private static final ClassLoader classLoader = TestFileUtil.class.getClassLoader();

    public static Map<String, Object> getJsonFileAsMap(String fileLocation) {

        try {
            return new ObjectMapper().readValue(getTestFile(fileLocation), HashMap.class);
        } catch (IOException e) {
            throw new RuntimeException("Error converting JSON file to a Map", e);
        }
    }

    private static URL getTestFile(String fileLocation) {

        return classLoader.getResource(fileLocation);
    }
}

如果您想读取一个不属于您的应用程序的文件,则根本不要使用getResource。只需创建一个File实例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52544988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档