为作为服务部署在码头中的两个应用程序设置不同的 java 系统属性
Setting up different java system properties for two applications deployed in jetty as a service
我正在 运行ning jetty(9.2.1) 作为部署两个应用程序的服务。
这些是我遵循的步骤
启动码头服务
我有两个应用程序要部署在同一个码头实例中。我在码头主目录中添加了两个 war 文件。在 'webapps' 文件夹中创建了两个 xml 文件以设置上下文路径和 war。应用程序已在上下文路径中启动。
但是我有两个 war 需要部署,这两个应用程序都需要不同的系统值 属性 'appConfigPath'。我怎样才能做到这一点?
尝试过的解决方案
如果它只是一个应用程序而不是 运行 作为一项服务,我可以 运行 像这样 - java -Dappconfig=service.properties -jar start.jar
如果只有一个应用程序并且它是 运行 作为一项服务,我可以在 start.ini.
中指定系统 属性
引用了这个 - Jetty - set system property 并且我尝试在我在 webapps 中创建的 xml 文件中添加 setProperty,如下所示,但没有成功。
码头-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>
码头-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
class 的静态字段中。静态字段在每次加载 class 时实例化一次 。因此,您可以在不同的 class 加载程序中拥有静态字段的不同实例。 Hawever Java "system classes" (java.lang.* and others) 需要由根 classloader 加载,因此只能有一个 java.lang.System
class 加载到 JVM 中,因此 JVM 中的给定系统 属性 只有一个值。
基本上,您在 XML 中尝试将相同的 属性 设置为两个不同的值,最后执行的将覆盖另一个。
虽然无法满足您的要求(运行在具有不同系统属性的同一 Jetty 实例中安装两个应用程序),但也许您可以放宽要求:
- 要么使用两个 Jetty 实例,
- 运行 那些具有相同系统属性(但配置不同,使用 JNDI 或上下文参数,如您链接的问题中所述)的应用程序。
同样,如您链接的问题(以及 Andreas 评论)中所述:使用系统 属性 在 Java 网络应用程序中进行配置 是一个错误。 我建议将它报告给制作该应用程序的人并要求他们修复它。
我正在 运行ning jetty(9.2.1) 作为部署两个应用程序的服务。 这些是我遵循的步骤
启动码头服务
我有两个应用程序要部署在同一个码头实例中。我在码头主目录中添加了两个 war 文件。在 'webapps' 文件夹中创建了两个 xml 文件以设置上下文路径和 war。应用程序已在上下文路径中启动。
但是我有两个 war 需要部署,这两个应用程序都需要不同的系统值 属性 'appConfigPath'。我怎样才能做到这一点?
尝试过的解决方案
如果它只是一个应用程序而不是 运行 作为一项服务,我可以 运行 像这样 - java -Dappconfig=service.properties -jar start.jar
如果只有一个应用程序并且它是 运行 作为一项服务,我可以在 start.ini.
中指定系统 属性引用了这个 - Jetty - set system property 并且我尝试在我在 webapps 中创建的 xml 文件中添加 setProperty,如下所示,但没有成功。
码头-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>
码头-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
class 的静态字段中。静态字段在每次加载 class 时实例化一次 。因此,您可以在不同的 class 加载程序中拥有静态字段的不同实例。 Hawever Java "system classes" (java.lang.* and others) 需要由根 classloader 加载,因此只能有一个 java.lang.System
class 加载到 JVM 中,因此 JVM 中的给定系统 属性 只有一个值。
基本上,您在 XML 中尝试将相同的 属性 设置为两个不同的值,最后执行的将覆盖另一个。
虽然无法满足您的要求(运行在具有不同系统属性的同一 Jetty 实例中安装两个应用程序),但也许您可以放宽要求:
- 要么使用两个 Jetty 实例,
- 运行 那些具有相同系统属性(但配置不同,使用 JNDI 或上下文参数,如您链接的问题中所述)的应用程序。
同样,如您链接的问题(以及 Andreas 评论)中所述:使用系统 属性 在 Java 网络应用程序中进行配置 是一个错误。 我建议将它报告给制作该应用程序的人并要求他们修复它。