Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于Spring的web应用程序的特定于环境的配置?_Java_Spring_Deployment_Spring Mvc_Jakarta Ee - Fatal编程技术网

Java 基于Spring的web应用程序的特定于环境的配置?

Java 基于Spring的web应用程序的特定于环境的配置?,java,spring,deployment,spring-mvc,jakarta-ee,Java,Spring,Deployment,Spring Mvc,Jakarta Ee,我如何知道web应用程序的部署环境,例如,它是本地的、开发的、qa的还是产品的,等等。有什么方法可以在运行时在spring应用程序上下文文件中确定这一点吗?我们在应用程序中这样做,但不在spring配置中 在应用程序启动期间(在上下文侦听器中),我们读取机器的主机名,并将匹配的prod、dev、qa信息存储在静态变量中 我们不直接访问变量(虽然可以),但我们有一个spring服务,它与该变量交互,让我们可以访问服务器环境信息。不要在代码中添加逻辑来测试您运行的环境-这是一个灾难的配方(或者至少会

我如何知道web应用程序的部署环境,例如,它是本地的、开发的、qa的还是产品的,等等。有什么方法可以在运行时在spring应用程序上下文文件中确定这一点吗?

我们在应用程序中这样做,但不在spring配置中

在应用程序启动期间(在上下文侦听器中),我们读取机器的主机名,并将匹配的prod、dev、qa信息存储在静态变量中


我们不直接访问变量(虽然可以),但我们有一个spring服务,它与该变量交互,让我们可以访问服务器环境信息。

不要在代码中添加逻辑来测试您运行的环境-这是一个灾难的配方(或者至少会在路上开很多夜车)

你使用弹簧,所以好好利用它。使用依赖项注入为代码提供特定于环境的参数。例如,如果您需要在测试和生产中调用具有不同端点的web服务,请执行以下操作:

public class ServiceFacade {
    private String endpoint;

    public void setEndpoint(String endpoint) {
        this.endpoint = endpoint;
    }

    public void doStuffWithWebService() {
        // use the value of endpoint to construct client
    }
}
接下来,使用Spring(或者PropertyOverrideConfiguler)从.properties文件或JVM系统属性填充此属性,如下所示:

<bean id="serviceFacade" class="ServiceFacade">
    <property name="endpoint" value="${env.endpoint}"/>
</bean>

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <value>classpath:environment.properties</value>
    </property>
</bean>
在environment-test.properties中:

env.endpoint=http://dev-server:8080/
env.endpoint=http://test-server:8080/
现在,为每个环境获取适当的属性文件,将其重命名为environment.properties,并将其复制到应用程序服务器的lib目录或应用程序类路径上的其他位置。例如,对于Tomcat:

cp environment-dev.properties $CATALINA_HOME/lib/environment.properties
现在部署您的应用程序-Spring将替换值“http://dev-server:8080/“当它在运行时设置端点属性时


有关如何加载属性值的更多详细信息,请参阅Spring文档。

一种方法是查看纯java方法。然而,这可能不是一个好主意,因为您不应该在应用程序中真正执行此类环境逻辑

另一种方法是服务器配置(为每个环境的服务器配置不同的应用程序上下文文件)

Spring3.1还引入了新的方法,用可互换的属性文件“正确”地完成这类工作。你应该看一下这张照片。有更多的细节在。

值得注意的是。这可能是这一需求的最终答案。所以请注意它


同时,我个人完全按照帕维尔所描述的做了。

感谢您的快速回复。您使用的示例就是我正在研究的示例。我正在做的是,创建一个类,构造函数具有参数endpoint和客户端代理。在appcontext.xml中,根据环境使用映射传递端点,就像伟大的答案一样!我只有一个后续问题。lib文件夹不是为库设计的吗?是否有一个不同的位置可以从类路径访问,比如conf或其他什么?谢谢做更多的研究,我认为lib文件夹实际上并不是最好的选择,不仅仅是对Tomcat来说。我最近一直在研究ZooKeeper(请参阅:),但在Spring/JavaEE引入对动态属性的支持之前,大多数解决方案都会有点麻烦。