Зависимость Java не может найти свои собственные ресурсы — код, запущенный в AWS Lambda

#java #amazon-web-services #aws-lambda

#java #amazon-web-services #aws-lambda

Вопрос:

Мой лямбда-код использует зависимость, которая загружает свои собственные ресурсы с помощью ClassOfDependency.class.getResourceAsStream("/filename.jks") . Это отлично работает, когда я создаю простой main, который использует такую зависимость, но когда я развертываю этот код в lambda, он выдает ошибку, в которой говорится, что он не может найти «/filename.txt «. Я что-то здесь упускаю? «filename.jsk» находится в src/resources /, где ресурсы были отмечены в IntelliJ как каталог ресурсов.

Спасибо

Комментарии:

1. Вы пробовали открывать свой JAR-файл с помощью проводника архива, чтобы посмотреть, где находится ресурс, если он вообще есть?

2. Да, я пробовал, и файл находится в папке ресурсов. Я запустил «jar xf foo.jar »

Ответ №1:

Вот как я это делаю — следующий метод принимает fileName и возвращает File .

 private File getSampleSourceFile(String fileName) {
    try {
        ClassLoader classLoader = getClass().getClassLoader();
        URL url = classLoader.getResource(fileName);

        if(url == null) {
            logger.log("unable to find "   fileName   " in the resource");
            return null;
        }

        File txtFile = File.createTempFile("sample_"   System.currentTimeMillis(), ".txt");
        FileUtils.copyInputStreamToFile(url.openStream(), txtFile);

        return txtFile;
    } catch (Exception e) {
        logger.log("failed to load file: "   e.toString());
        return null;
    }
}
  

Что касается расположения файла, у меня есть моя res папка за пределами src папки. Я не уверен, какую IDE вы используете для создания артефактов Jar, но я использую IntelliJ IDEA. Вот скриншот моего модуля, который показывает иерархию папок пакета jar.

введите описание изображения здесь

Примечание:
Если вы хотите InputStream вместо File , вы можете просто вернуть url.openStream() вместо преобразования InputStream в File .