如何让 WebApp 在嵌入式码头的类路径上找到应用程序属性?
Posted
技术标签:
【中文标题】如何让 WebApp 在嵌入式码头的类路径上找到应用程序属性?【英文标题】:How to have WebApp find application properties on classpath in embedded jetty? 【发布时间】:2019-03-08 16:34:02 【问题描述】:我们有一个包含一个war 文件和两个属性文件的应用程序。 在正常情况下,我们只需将战争放入 /webapps (jetty) 并将配置放入 /resources,一切都运行良好。
我们如何使用嵌入式码头做到这一点? 所以我有一个类文件,它可以创建一个嵌入式码头服务器并使用以下方式部署战争文件:
WebAppContext ctx = new WebAppContext(warfileLocation,"/");
服务器运行起来,但应用程序没有启动,因为它找不到应用程序引用的属性,该应用程序希望在类路径中找到 .properties 文件。
如何以编程方式将配置属性文件部署到嵌入式码头上下文? 大概是通过在上下文中使用某种方法来引用我本地磁盘上的文件?
谢谢。
【问题讨论】:
你试过把.properties文件放在projectRoot/src/main/resources
下吗?
@NestorSokil 你的意思是,将属性文件嵌入到战争的 meta-inf 目录中?这对我不起作用,因为属性文件需要保存在战争之外,因为我们有多个环境,每个环境都使用相同的战争,但属性不同
【参考方案1】:
WebAppContext
是与服务器类路径隔离的类加载器,使服务器类路径上的内容对WebAppContext
不可用。
你有两个选择。
-
翻转类加载器隔离规则。
如果您的嵌入式码头中只有 1 个 WebAppContext,并且您不关心类加载器隔离,请致电 WebAppContext.setParentLoaderPriority(true);
-
将您需要的特定类路径条目添加到
WebAppContext
。
在将其添加到 HandlerCollection
并启动/部署之前,您可以调用 WebAppContext.setExtraClasspath(String)
将您想要的任意类路径条目添加到 WebAppContext
。
【讨论】:
:) 这就是答案......我在你之前几秒钟发布了我的发现......不过谢谢你的回复。【参考方案2】:您的主要目标是您的配置最终出现在应用程序的classpath
中。如何做到这一点取决于您的用例。
您可以将 .properties 文件放在您的 jar(运行嵌入式 Jetty 的那个)的 project/src/main/resources
下,该 jar 自动位于类路径中。
这在开发中很有用,但这意味着配置文件将包含在您编译的 jar 文件中。除非您在 Maven/Gradle 构建文件中明确排除它们(如果您正在使用它们)。对于生产用途,您可能希望外部化您的配置。
例如,您可以将配置文件放入外部configs
文件夹,然后使用java -classpath my.jar:configs/ Main
运行您的jar。
外部configs
文件夹中的所有文件现在都应该在您的类路径中。
当然还有其他选项可以修改类路径。请参阅Setting the class path。如果您仍想使用-jar
选项运行,您可以修改META-INF/MANIFEST.mf
中的类路径。这个选项被描述为here。
【讨论】:
【参考方案3】:全部,
我找到了使用“extraClassPath”的解决方案
//add application config properties
String resourcesDirectory = System.getProperty("resourcesDirectory");
if (resourcesDirectory!=null)
String ecp = ctx.getExtraClasspath();
ecp = ecp + "," + resourcesDirectory;
ctx.setExtraClasspath(ecp);
其中 ctx 是从返回的上下文:
WebAppContext ctx = new WebAppContext(warfileLocation,"/");
基本上,您可以使用此方法将本地目录添加到嵌入式码头服务器的类路径中。该路径中的任何内容都将出现在类路径中
【讨论】:
以上是关于如何让 WebApp 在嵌入式码头的类路径上找到应用程序属性?的主要内容,如果未能解决你的问题,请参考以下文章
sbt-web-plugin:使用 configurationXml 指定码头的类路径
在 azure 中设置 webapp %PATH% 环境变量