如何将外部文件加载到类路径 Play Framework 2.3
How to load external file into classpath Play Framework 2.3
我需要使用 Play Framework 2.3 (Java)
将 外部文件 加载到 class 路径中
规定:
外部文件不能存在于我的 Play 应用程序中(即 /conf
和 /lib
目录等不是一个选项)
文件必须是 .properties
或 .conf
文件,这样我才能指定 属性 值
这是我的场景:
我有一个自定义 JAR,其中有一些代码在使用时在 class 路径中查找特定文件(我们称之为 myproperties.properties
)。我试图找到 myproperties.properties
的方法是在驻留在该自定义 JAR 中的 class 中执行此操作:
ClassLoader classLoader = com.my.package.MyCustomJavaClass.class.getClassLoader();
InputStream inputStream = classLoader.getResourceAsStream("/path/to/myproperties.properties");
我有权更改属性文件名及其在 JAR 中的路径。
我的 Play Framework 应用程序(使用 Java)在它的 /lib
文件夹中有这个自定义 JAR,所以它会自动添加到 class 路径(这个经测试并正常工作)。我的 Play 应用程序在首次加载 /
路由(索引路由)时调用 MyCustomJavaClass,因此当我点击时,上面的 class 加载器和输入流代码被启动我在浏览器中播放应用程序。
问题:
在启动 Play 应用程序时,我尝试以自定义 JAR 中的代码可以看到的方式将 /path/to/myproperties.properties
加载到 class 路径,但没有成功它。
我一直在尝试像这样开始使用 classpath 命令,试图为 JVM 提供外部文件:
activator start -J-classpath "-J-classpath:/path/to/myproperties.properties"
我将 -J-classpath;
添加到路径的开头,以尝试复制当前在 class 路径中的所有内容,然后只添加我的单个外部文件。但是,这样做似乎不起作用(即我的 inputStream 为空)。
问题:
我在启动播放应用程序时是否正确执行了 activator start -J-classpath
命令?尝试首先复制现有 class 路径的其他变体不允许播放应用程序启动,但此命令至少启动了我的应用程序。
参考(指定额外的 JVM 参数):https://www.playframework.com/documentation/2.3.x/ProductionConfiguration
我还有哪些其他方法可以完成这项工作?我探索了使用 activator start -Dconfig.file=/path/to/application-override.conf
覆盖 application.conf
文件并将我的属性放入新的 application-override.conf
文件中。但是,它似乎没有将该文件放入 class 路径,以便 MyCustomJavaClass 使用 Class 加载程序进行查找。也许我也错误地执行了这个命令?
Play Framework classpath 是否有可能与我的自定义 JAR 看到的 classpath 分开?我一直假设它都在一个 JVM 和 classpath.
中
这是我想出的解决方案,希望它能帮助其他人:
在我的 "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.conf
、pre-prod-override.conf
、prod-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("\"","")
我需要使用 Play Framework 2.3 (Java)
将 外部文件 加载到 class 路径中规定:
外部文件不能存在于我的 Play 应用程序中(即
/conf
和/lib
目录等不是一个选项)文件必须是
.properties
或.conf
文件,这样我才能指定 属性 值
这是我的场景:
我有一个自定义 JAR,其中有一些代码在使用时在 class 路径中查找特定文件(我们称之为
myproperties.properties
)。我试图找到myproperties.properties
的方法是在驻留在该自定义 JAR 中的 class 中执行此操作:ClassLoader classLoader = com.my.package.MyCustomJavaClass.class.getClassLoader(); InputStream inputStream = classLoader.getResourceAsStream("/path/to/myproperties.properties");
我有权更改属性文件名及其在 JAR 中的路径。
我的 Play Framework 应用程序(使用 Java)在它的
/lib
文件夹中有这个自定义 JAR,所以它会自动添加到 class 路径(这个经测试并正常工作)。我的 Play 应用程序在首次加载/
路由(索引路由)时调用 MyCustomJavaClass,因此当我点击时,上面的 class 加载器和输入流代码被启动我在浏览器中播放应用程序。
问题:
在启动 Play 应用程序时,我尝试以自定义 JAR 中的代码可以看到的方式将
/path/to/myproperties.properties
加载到 class 路径,但没有成功它。我一直在尝试像这样开始使用 classpath 命令,试图为 JVM 提供外部文件:
activator start -J-classpath "-J-classpath:/path/to/myproperties.properties"
我将
-J-classpath;
添加到路径的开头,以尝试复制当前在 class 路径中的所有内容,然后只添加我的单个外部文件。但是,这样做似乎不起作用(即我的 inputStream 为空)。
问题:
我在启动播放应用程序时是否正确执行了
activator start -J-classpath
命令?尝试首先复制现有 class 路径的其他变体不允许播放应用程序启动,但此命令至少启动了我的应用程序。参考(指定额外的 JVM 参数):https://www.playframework.com/documentation/2.3.x/ProductionConfiguration
我还有哪些其他方法可以完成这项工作?我探索了使用
activator start -Dconfig.file=/path/to/application-override.conf
覆盖application.conf
文件并将我的属性放入新的application-override.conf
文件中。但是,它似乎没有将该文件放入 class 路径,以便 MyCustomJavaClass 使用 Class 加载程序进行查找。也许我也错误地执行了这个命令?Play Framework classpath 是否有可能与我的自定义 JAR 看到的 classpath 分开?我一直假设它都在一个 JVM 和 classpath.
中
这是我想出的解决方案,希望它能帮助其他人:
在我的 "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.conf
、pre-prod-override.conf
、prod-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("\"","")