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

我一直在尝试引导 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 是否有任何特殊行为或所需的目录结构?


动漫人物
浏览 400回答 1
1回答

温温酱

最有可能的问题是:new File(classLoader.getResource(fileLocation).getFile());URL 类的 getFile() 方法不返回有效的文件名。它只返回 URL 的路径部分,不能保证它是有效的文件名。(当 URL 类作为 Java 1.0 的一部分被引入时,方法名称是有意义的,因为几乎所有 URL 实际上都引用了物理文件,无论是在同一台机器上还是在不同的机器上。)ClassLoader.getResource 的参数不是文件名。它是一个相对 URL,其基础是 ClassLoader 的类路径中的每个位置。如果要读取与应用程序捆绑在一起的资源,请不要尝试将资源 URL 转换为文件。将 URL 作为 URL 读取:public class TestFileUtil {&nbsp; &nbsp; private static final ClassLoader classLoader = TestFileUtil.class.getClassLoader();&nbsp; &nbsp; public static Map<String, Object> getJsonFileAsMap(String fileLocation) {&nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return new ObjectMapper().readValue(getTestFile(fileLocation), HashMap.class);&nbsp; &nbsp; &nbsp; &nbsp; } catch (IOException e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new RuntimeException("Error converting JSON file to a Map", e);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; private static URL getTestFile(String fileLocation) {&nbsp; &nbsp; &nbsp; &nbsp; return classLoader.getResource(fileLocation);&nbsp; &nbsp; }}如果您想读取不属于您的应用程序的文件,请根本不要使用 getResource。只需创建一个 File 实例。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java