为部署在 jetty 作为服务的两个应用程序设置不同的 java 系统属性

问题描述

我正在运行 jetty(9.2.1) 作为部署两个应用程序的服务。 这些是我遵循的步骤

  • 启动码头服务

  • 我有两个应用程序要部署在同一个码头实例中。我在 jetty 主目录中添加了两个 war 文件。在“webapps”文件夹中创建了两个 xml 文件来设置上下文路径和战争。应用程序在上下文路径中启动。

但是我要部署两场战争,这两个应用程序都需要为系统属性“appConfigPath”设置不同的值。我怎样才能做到这一点?

尝试过的解决方

如果它只是一个应用程序并且它不是作为服务运行的,我可以像这样运行它 - java -Dappconfig=service.properties -jar start.jar

如果只有一个应用程序并且它作为服务运行,我可以在 start.ini 中指定系统属性

引用此 - Jetty - set system property 并且我尝试在我在 webapps 中创建的 xml 文件添加 setProperty,如下所示,但它不起作用。

jetty-app1.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
  <Set name="contextpath">/app1</Set>
  <Set name="war">/opt/jetty/app1.war</Set>
  <Call class="java.lang.System" name="setProperty">     
     <Arg>appConfigPath</Arg>     
    <Arg>opt/jetty/service1.properties</Arg>   
  </Call>
</Configure>


jetty-app2.xml

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
  <Set name="contextpath">/app2</Set>
  <Set name="war">/opt/jetty/app2.war</Set>
  <Call class="java.lang.System" name="setProperty">     
     <Arg>appConfigPath</Arg>     
    <Arg>opt/jetty/service2.properties</Arg>   
  </Call>
</Configure>

解决方法

正如安德烈亚斯所说。这在 Java 中是不可能的。

系统属性存储在 java.lang.System 类的静态字段中。 每个加载的类都会实例化一个静态字段。因此,您可以在不同的类加载器中拥有静态字段的不同实例。 Hawever Java“系统类”(java.lang.* 和其他)需要由根类加载器加载,因此只能有一个 java.lang.System 类加载到 JVM 中,因此给定的值只有一个JVM 中的系统属性。

基本上,您在 XML 中尝试将两次相同的属性设置为两个不同的值,最后一个执行将覆盖另一个。

虽然无法满足您的要求(在同一个 Jetty 实例中运行两个具有不同系统属性的应用),但您可以放宽它们:

  • 要么使用两个 Jetty 实例,
  • 使用相同的系统属性运行这些应用(但配置不同,使用 JNDI 或上下文参数,如您链接的问题中所述)。

同样,如您链接的问题(以及 Andreas 评论)中所述:在 Java 网络应用程序中使用系统属性进行配置是一个错误我会建议向制作该应用的人报告并要求他们修复它。