Java tomcat中每个战争的不同环境变量

Java tomcat中每个战争的不同环境变量,java,tomcat,Java,Tomcat,有没有一种方法可以让tomcat中的不同war文件具有不同的环境变量?我使用的是第三方war,需要对同一个war进行多个部署,但使用不同的环境变量(因此它加载不同的配置)。如果独立运行两个Tomcat实例,这很容易。我假设您在这里讨论的是OS环境变量 您还可以在Tomcat中为每个war/web应用程序设置属性。这将允许您在一个Tomcat实例中运行两次战争。但这不是你要问的。好吧,完全是疯狂的黑客想法: 为每个应用程序实例实现PropertyPlayHolderConfigure(或使用Tom

有没有一种方法可以让tomcat中的不同war文件具有不同的环境变量?我使用的是第三方war,需要对同一个war进行多个部署,但使用不同的环境变量(因此它加载不同的配置)。

如果独立运行两个Tomcat实例,这很容易。我假设您在这里讨论的是OS环境变量


您还可以在Tomcat中为每个war/web应用程序设置属性。这将允许您在一个Tomcat实例中运行两次战争。但这不是你要问的。

好吧,完全是疯狂的黑客想法:

为每个应用程序实例实现PropertyPlayHolderConfigure(或使用Tomcat中的web.xml),并加载与System.properties()同名的属性

然后,创建一个包含两组属性的委托属性类。然后

Properties props = new DelegatingProperties(app1Props,app2Props)
System.setProperties(delegate);

public class DelegatingProperties extends Properties {

   private Properties app1Props;
   private Properties app2Props;

   public DelegatingProperties(Properties app1Props, Properties app2Props) {
        this.app1Props = app1Props;
        this.app2Props = app2Props;   
   }

   public String getProperty(String prop) {
       // begin crazy science
       String caller = new Throwable().getStackTrace()[0].getClassName();
       // this is where you get creative.
       // Do the System.setProperties() above so you can intercept calls to  
       //getProperty()
       // and find out the FQCN of the library class(es) that need these variable 
       // (use your debugger).
       // then implement the logic here to decide which of the 2 property sets you have
       // you will query to get the correct results     
   }
}
这些是我们正在讨论的系统属性,它们旨在应用于整个系统。您的库可能是在1-app-1-jvm时开发的(或者开发人员是tard,这也很可能)


我至少能得到创意的道具吗?:)

它必须是一个环境变量,还是这只是你表达问题的方式?第三方代码是System.getenv,所以它必须在其中。是的,我需要将该值设置为OS环境变量(实际上只需要进入System.getenv)。我可以尝试设置两个不同的Tomcat(atm只需要两个不同的路径),所以我是在bin/setenv.sh中进行设置,还是有更好的地方呢?使用tcServer版本的Tomcat非常简单。你必须在谷歌上搜索一下如何使用香草Tomcat。我可能只会在inetd中设置两个shell脚本,运行同一个Tomcat实例,但之前设置的环境不同。@ekaq实际上只是复制并粘贴整个TC目录。我已经将Tomcat设置为只运行两个不同的进程,其中每个进程在执行前都有ENV设置。这对我来说很有效