为了账号安全,请及时绑定邮箱和手机立即绑定

ClassLoader 在构建后找不到资源文件

ClassLoader 在构建后找不到资源文件

动漫人物 2021-10-17 16:57:31
我一直在尝试引导 Java ClassLoader 从test/resources部署后的目录中检索 JSON 文件时遇到问题。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 进行本地测试期间没有问题,如下所示:public class LocalTest {    @Before    public void setUp() {        Mockito.when(mockDataRetrievalService.getAssetJsonById(Mockito.any())).thenReturn(TestFileUtil.getJsonFileAsMap("test.json"));    }}但是,在我们部署的环境中构建时,这一行会引发 FileNotFound 异常。使用相对目录路径时"../../test.json",我在两种环境中都看到 FileNotFound 异常。本地目录结构:test| java| |- project| |  |- LocalTest| |- util| |  |- TestFileUtil.class| resources| |- test.json部署后:test| com| | project| | | dao| | | | LocalTest| | other project| | | | util| | | | | TestFileUtil.class| | | | | test.json在自动构建中使用 ClassLoader 是否有任何特殊行为或所需的目录结构?
查看完整描述

1 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

最有可能的问题是:


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

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


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


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 实例。


查看完整回答
反对 回复 2021-10-17
  • 1 回答
  • 0 关注
  • 399 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信