Java Spring Profiles在Linux中不起作用

时间:2015-11-24 18:12:03

标签: java linux spring environment-variables spring-profiles

我有一个在Windows上开发的Web应用程序,之后我将其部署到Linux(暂存和生产)。

我为每个环境创建了3个.properties文件:

  • application-dev.properties
  • application-staging.properties
  • application-prod.properties

我决定实施以下sollution - 在每台具有相关值(dev / staging / prod)的机器上创建环境变量,并根据此能够加载corect .properties文件。

该解决方案在Windows上完美运行,但我无法在Linux上以同样的方式工作。

这是我的代码:

Web.xml中

<context-param>

    <param-name>contextInitializerClasses</param-name>

    <param-value>com.app.server.configuration.ConfigurableApplicationContextInitializer</param-value>

</context-param>

ConfigurableApplicationContextInitializer类:

import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;


public class ConfigurableApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {

    @Override
    public void initialize(ConfigurableApplicationContext context) {
        String APP_ENV = System.getenv("APP_ENV");
        context.getEnvironment().setActiveProfiles(APP_ENV);
        System.setProperty("spring.profiles.active", APP_ENV);

    }
}

ContextsConfiguration类:

    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.PropertySource;
    import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;


@Configuration
@PropertySource("classpath:application-${spring.profiles.active}.properties")
public class ContextsConfiguration {

    @Bean
    public static PropertySourcesPlaceholderConfigurer configurer() {
            return new PropertySourcesPlaceholderConfigurer();
    } 


    @Value("${FTPport}")
    public String FTPport;
    @Value("${FTPserver}")

在Linux中我已经在百万个地方定义了这个变量(APP_ENV)。在.environment文件中,在.bash文件中,在setenv.sh文件中。当我做printenv时 - 我在那里看到它。

我尝试创建简单的java类 - main,它打印System.getenv(“APP_ENV”)的值和正在打印的“staging”值。

但在我的应用程序中,我总是看到 - 开发而不是暂存。

我看到分段的唯一方法是在web.xml中添加“硬编码”活动配置文件

<context-param>  
    <param-name>spring.profiles.active</param-name>  
    <param-value>dev</param-value>  
</context-param>

但我真的不想以这种方式工作,我希望它能自动识别和dinamycally。

请帮助:)

2 个答案:

答案 0 :(得分:0)

其中一个原因可能是您的tomcat在不同的用户下运行,因此您可能需要为运行tomcat的 用户设置环境变量。

您还可以在$CATALINA_BASE/bin/setenv.sh文件

中为tomcat设置必需的环境变量

答案 1 :(得分:0)

显然,setenv.sh的正确位置是:usr/share/tomcat7/bin 我在那里有一个带有“dev”值的旧文件:) 因此,在修复此文件后 - 它完美地运行:)