如何让 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 指定码头的类路径

如何为嵌入式码头/弹簧安全启用 HTTP 摘要?

在 azure 中设置 webapp %PATH% 环境变量

HTTP/2 Java 8、码头和 ALPN

我应该如何从带有嵌入式码头的 web.xml 加载 servlet?

如何使用嵌入式码头添加 servlet 过滤器