AWS Lambda Java如何读取属性文件

时间:2017-08-14 15:22:05

标签: java amazon-web-services aws-lambda

我尝试从文件中将属性加载到Properties类中。我希望这个解决方案有效:How to load property file from classpath in AWS lambda java

我有一个静态方法很少的类,我想将它用作Config持有者。里面有这条线

[http://jsbin.com/ewitun/1/edit?html,js,output][1]

并且它始终返回null。我下载了Lambda正在使用的zip包,文件在root下面。但是不起作用。

有人有过类似的问题吗?

编辑: 配置文件在这里:

final InputStream inputStream = 
Config.class.getClass().getResourceAsStream("/application-main.properties");

编辑: 我的临时"解决方法看起来像这样:

project
└───src
│   └───main
│      └───resources
│            application-main.properties

在测试期间,它从类路径中读取,在AWS Lambda运行时部署后,它使用文件系统。要识别我使用env变量的文件:

// LOAD PROPS FROM CLASSPATH...
try (InputStream is = Config.class.getResourceAsStream(fileName)) {
        PROPS.load(is);
    } catch (IOException|NullPointerException exc) {
        // ...OR FROM FILESYSTEM
        File file = new File(fileName);
        try (InputStream is = new FileInputStream(file)) {
            PROPS.load(is);
        } catch (IOException exc2) {
            throw new RuntimeException("Could not read properties file.");
        }
    }

但我宁愿只使用classpath而不用解决这个问题。

6 个答案:

答案 0 :(得分:2)

如果要加载属性文件,可以使用ResourceBundle加载属性。

String version = ResourceBundle.getBundle("application-main").getString("version");

与将文件作为InputStream加载不一样,但这对我有用。

我有一个简单的Hello-World Lambda,它从github上的属性文件中读取当前版本。

答案 1 :(得分:1)

假设src / main / resources / config.properties

File file = new File(classLoader.getResource("resources/config.properties").getFile());
FileInputStream fileInput = new FileInputStream(file);
prop.load(fileInput);

答案 2 :(得分:0)

假设您有以下文件夹结构:



project
└───src
│   └───main
│      └───resources
│            config.properties




你的Lambda Handler:



ClassLoader loader = Config.class.getClassLoader();
InputStream input = loader.getResourceAsStream("config.properties");




这可能有用......

答案 3 :(得分:0)

如果src / main / resource包中有.properties文件,请尝试:

gather(bind_rows(data, .id = 'sample'), signature, score, -sample)

您可以这样调用它:

protected static Properties readPropertiesFile() {
    ClassLoader classLoader = Utils.class.getClassLoader();
    try {
        InputStream is = classLoader.getResourceAsStream("PropertiesFile.properties");
        Properties prop = new Properties();
        prop.load(is);
        return prop;
    } catch (Exception e) {
        return null;
    }
}

答案 4 :(得分:0)

要解决此类问题,您可以使用 lightweight-config,它是一个用于将 .yml 文件加载到 POJO 中的库。这包含了在资源中查找配置文件的样板文件,并且还处理将环境变量或系统属性等内容插入到配置中。这比 Properties 更易于使用,并且删除了所有样板。

例如

username: ${DB_USERNAME}
port: 3306

然后用一个 java 类来表示这些(因为 PropertiesMap 的类型安全性较低):

public class Config {
    private String username;
    private int port;

    // getters and setters
}

加载:

Config config = ConfigLoader.loadYmlConfigFromResource("config.yml", Config.class);

此处提供完整的库 - https://github.com/webcompere/lightweight-config

答案 5 :(得分:0)

我很困惑 lambda 是无服务应用程序的一部分。因此,当您将 Lambda 上传到 AWS Lambda 时,它不会看到属性文件。因为那是在你的开发环境中。