如何使用Java在GAE中设置环境变量 – 未在主代码中公开?或者其他隐藏应用程序使用的密钥的方法?

我正在使用
Java在GAE上开发一个Web应用程序,我将在
Github上打开这个Web应用程序的代码.

但是,我不想在代码中公开一些API密钥.因此,我正在寻找一种方法来存储应用程序可以获得的一些数据,而不会在Github上发布的工作应用程序代码中显示这些数据.

例如,这个servlet https://github.com/GoogleCloudPlatform/java-docs-samples/blob/master/appengine/mailgun/src/main/java/com/example/appengine/mailgun/MailgunServlet.java使用System.getenv()获取API密钥,通常环境变量written in appengine-web.xml还有另一种方法吗?要从Google Developers Console设置环境变量,还是安全地存储并从GAE Datastore获取它们?

最佳答案 通常它是通过外部.properties文件(和
Properties类)完成的.假设您有一个用于演示开发,一个用于生产(通常还有第三个用于测试).因此,您可以将开发文件上传到Github,并为自己保留生产配置(也不要忘记将其添加到.gitignore中).

基本上你的资源文件夹中有3个文件:

> myapp.prod.properties
> myapp.dev.properties
> myapp.test.properties

(命名模式取决于您,它可能只是prod.properties,但在这种情况下,它可能与来自第三方lib的某些文件冲突).

有一个教程如何阅读这些文件:https://docs.oracle.com/javase/tutorial/essential/environment/properties.html和JavaDoc https://docs.oracle.com/javase/8/docs/api/java/util/Properties.html

你需要这样的东西:

Properties props = new Properties();
String name;
if (SystemProperty.Environment.Value.Development == SystemProperty.environment.value()) {
    name = "myapp.dev.properties";
} else {
    name = "myapp.prod.properties";
}
props.load(Classname.class.getClassLoader().getResourceAsStream(name));

大多数Java Web框架都可以自动为您完成.例如,在Spring中,查看Profiles,@ PropertySource和ConfigurableApplicationContext

点赞