跨测试和生产代码一致地获取资源文件夹路径

时间:2017-08-11 08:03:12

标签: java

以下解码base64字符串并将其保存到resources/images文件夹下的文件中。

private final static String IMAGE_FOLDER = new File("resources/images").getAbsoluteFile().getAbsolutePath();

public static String decodeBase64AndSaveImage(String data) throws IOException, BadRequestException {
    try {
        if (data == null) {
            return null;
        }
        String base64Image = data.split(",")[1];
        byte[] imageBytes = DatatypeConverter.parseBase64Binary(base64Image);
        BufferedImage img = ImageIO.read(new ByteArrayInputStream(imageBytes));
        String imageId = generateRandomKey(15);
        File imageFile = new File(IMAGE_FOLDER + File.separator + imageId);
        ImageIO.write(img, "png", imageFile);
        return imageId;
    } catch (IllegalArgumentException e) {
        throw new BadRequestException("Bad image data");
    }
}

images文件夹位于/home/user/workspace/myproject/src/main/resources/images下,但是当我运行测试时,IMAGE_FOLDER的值为/home/user/workspace/myproject/resources/images

我可以理解,在生产环境中,不再有src/main个文件夹了。但是,如何在生产和测试环境中采用一致的方法?

注1

测试失败

注2

我尝试了ClassLoader方法:

Classname.class.getClass().getResource("filename.png")但它返回null。

2 个答案:

答案 0 :(得分:2)

由于您的应用程序写入数据,我建议将包含目标目录路径的变量保存在外部项目代码中。我建议使用环境变量。如果路径存储在环境变量IMG_DIR中,则可以使用System.getenv("IMG_DIR")从Java代码访问此信息。将此配置项置于JAR外部使得将JAR移动到任何执行环境非常简单。

答案 1 :(得分:0)

通常,resources目录的路径是相对于可执行文件的。

因此,最好的方法是将可执行文件生成到debugrelease文件夹。相应的构建文件夹将包含可由可执行文件使用的resources目录。

从技术上讲,您的构建系统应该处理这些事情,并且在生产中您的安装程序应该处理这些配置以便成功执行。