如何将外部文件加载到类路径 Play Framework 2.3

How to load external file into classpath Play Framework 2.3

我需要使用 Play Framework 2.3 (Java)

外部文件 加载到 class 路径中

规定:

这是我的场景:

问题:

问题:

这是我想出的解决方案,希望它能帮助其他人:

  • 在我的 "upper environments"(AWS 服务器)中部署了我的播放应用程序,我将一个 application-override.conf 文件放在播放框架应用程序的 conf 文件夹中目录

  • application-override.conf 与我的 application.conf 完全相同,但我在两者中都有一些自定义属性,它们的值在播放应用程序所在的每个环境中都不同

  • 我的 play framework 应用程序在 git repo 中,它在每个上层环境中被克隆,所以我将 application-override.conf 添加到 .gitignore (我不希望它检查它到回购所以它只存在于服务器上)

  • 启动播放应用程序时,我现在使用activator start "-Dconfig.trace=loads -Dconfig.file=conf/application-override.conf"。这将用 application-override.conf 覆盖 application.conf 文件,并且 application-override.conf 将位于播放用于 运行 应用程序的 JVM 类路径中(因为它位于 conf 目录中). -Dconfig.trace=loads 发出更多日志记录,让您知道 .conf 文件是否正确加载;如果一切正常,它不是必需的标志。

  • 在 java 端,在我的自定义 JAR 中,我现在可以执行以下操作:

    Properties properties;
    InputStream stream;
    ClassLoader classLoader = com.my.package.MyCustomJavaClass.class.getClassLoader();
    
    // first, look for application-override.conf in the classpath (upper environments)
    stream = classLoader.getResourceAsStream("application-override.conf");
    
    // if null, check for application.conf (local environment)
    if (stream == null) {
        stream = classLoader.getResourceAsStream("application.conf");
    }
    
    properties = new Properties();
    properties.load(stream);
    stream.close();
    

其他注意事项:

  • 我考虑过在 conf 目录中做一个 symlink/softlink 并将 application-override.conf 文件放在我环境中的其他地方,但是在 Play 2.4 之前,你conf 目录中不能有符号链接,所以我只是将实际的 application-override.conf 文件放在 conf 文件夹中

  • application-override.conf 文件对每个 "upper environment" 都有不同的 属性 值,否则我只会将一个覆盖文件传送到 git回购。在自定义 JAR 中,我不想放入寻找不同文件名的逻辑,如 dev-override.confpre-prod-override.confprod-override.conf 等。我想要一个单一的上层环境覆盖文件.

  • 我将 -classpath=/path/to/myproperties.properties-J-classpath=/path/to/myproperties.properties 命令与 activator start 结合使用没有成功。我也没有成功尝试附加到类路径,例如activator start -J-classpath=-J-classpath:/path/to/myproperties.properties 或其他类似组合

  • 将属性放入 application-override.conf 文件的路线实际上对我来说是一石二鸟,因为我一直想通过覆盖 .conf 来进行一些特定于环境的更改我的每个环境中的文件以及自定义属性

  • .conf 文件的 HOCON 格式要求我在我的 属性 值周围加上双引号,因为我的 属性 值的性质。当阅读 Java 中的那些属性时,引号对我来说仍然存在,所以我必须在阅读这些属性时做一个 str.replace("\"","")