#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
.