Компоненты среды Java для Tomcat 7 (JNDI-less)

Я запускаю Tomcat 7, и мне нужно передать моим двум веб-приложениям переменную среды с тем же именем, но с другим значением для каждого веб-приложения.

Есть ли способ иметь переменные среды приложения (одна и та же переменная имеет другое значение для каждого приложения) без использования JNDI?

Я думаю о чем-то вроде -Dname = bob в контексте приложения.

Ответ 1

Создайте файл для приложения, названного как файл войны приложения, и файл, который находится в каталоге Tomcat 7 conf/Catalina/localhost/.

Каждый файл может содержать некоторые переменные среды, специфичные для приложения.

Например, два приложения project1.war и project2.war развернуты в каталоге webapps.

В файле conf/Catalina/localhost/project1.xml

<Context path="" docBase="project1">
  <Environment name="product" value="one" type="java.lang.String" override="false" />
</Context>

конф/Каталина/локальный/project2.xml

<Context path="" docBase="project1">
  <Environment name="product" value="two" type="java.lang.String" override="false" />
</Context>

Также я не испытал двойное развертывание.

Мой хост сервера разработки:

<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true" deployOnStartup="true">

И мой хост производственного сервера:

<Host name="www.learnintouch.com"  appBase="webapps" unpackWARs="true" autoDeploy="true" deployOnStartup="true">

Чтобы получить значение переменной, я использую контекст условия Spring:

public class ProductProjectCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return context.getEnvironment().getProperty("product") == null || context.getEnvironment().getProperty("product").equals("project");
    }

}

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Conditional(ProductProjectCondition.class)
public @interface ProductProject {
}

Затем можно использовать аннотацию @ProductProject.