有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我将jetty(9.2.1)作为一种服务运行,用于部署两个应用程序。 以下是我遵循的步骤

  • 开始了码头服务

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

但我要部署两个WAR,这两个应用程序都需要为系统属性“appConfigPath”提供不同的值。我怎样才能做到这一点

已试用的解决方案

如果它只是一个应用程序,而不是作为服务运行,我可以像这样运行-java-Dappconfig=service。属性-jar启动。罐子

如果只有一个应用程序,并且它作为服务运行,我可以在start中指定system属性。伊尼

引用了这个-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>

共 (1) 个答案

  1. # 1 楼答案

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

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

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

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

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

    同样,正如您链接的问题(以及Andreas评论)中所解释的:在Java web应用程序中使用系统属性进行配置是一个错误我建议将其报告给那个应用程序的开发者,并要求他们修复它