spring-boot中的catalina.base系统属性覆盖?

时间:2014-08-13 14:24:46

标签: eclipse spring spring-boot embedded-tomcat-7

我的项目使用catalina.base系统属性获取相对于该属性的文件夹位置的资源。在Eclipse中工作时,我传递-Dcatalina.base =。作为应用程序主类的VM参数。

我的主要类是这样实现的:

@ComponentScan
@EnableAutoConfiguration
public class Main {

    private static final Logger logger = LogManager.getLogger();

    public static void main(String[] args) {

        if ( logger.isDebugEnabled() )  {
            String debugCatalinaBase = System.getProperty("catalina.base");
            // here catalinaBase is set to "." as expected.
            logger.debug("catalinaBase: {}", debugCatalinaBase);
        }

        SpringApplication.run(Main.class, args);
    }
}

作为这个项目的一部分,我有一个ApplicationConfig类,它实现如下:

@Configuration
public class ApplicationConfig {

    private static final Logger logger = LogManager.getLogger();

    @Value("${catalina.base}")
    private String catalinaBase;

    @Bean
    public Properties jndiProperties() {

        if ( logger.isDebugEnabled() )  {
            String debugCatalinaBase = System.getProperty("catalina.base");
            // here catalinaBase is set to "C:\Users\theUser\AppData\Local\Temp\tomcat.8558104871268204693.8081". NOT as expected!!!
            logger.debug("catalinaBase: {}", debugCatalinaBase);
        }

        Properties properties = new Properties();
        properties.setProperty(Context.INITIAL_CONTEXT_FACTORY,
            CnsContextFactory.class.getName());
        properties.setProperty(Context.PROVIDER_URL,
            "file:" + catalinaBase + "\\conf\\jndi.properties");
        return properties;
    }

    @Bean( name = "propertyConfigurer" )
    public static PropertySourcesPlaceholderConfigurer propertyConfigurer() {
        PropertySourcesPlaceholderConfigurer configurer = 
            new PropertySourcesPlaceholderConfigurer();
        return configurer;
    }
}

正如您在代码段的注释中所看到的,在ApplicationConfig中,catalina.base系统属性已更改,我不确定为何或何处发生这种情况?

有关信息,我的项目使用spring-boot-starter-xxx:1.1.4.RELEASE jars和spring-xxx:4.0.6.RELEASE jars。

另外,我有另一个项目遵循几乎相同的整体模式并使用相同的jar,该项目总是将catalina.base设置为"。"正如所料。所以我想知道问题是否与在有问题的项目中加载弹簧配置的顺序或者那些沿线的东西有关?

提前感谢您提供任何帮助。 PM

1 个答案:

答案 0 :(得分:4)

字符串引导从Tomcat.setBaseDir(...)使用临时目录作为源来调用TomcatEmbeddedServletContainerFactory。当catalina.base中的initBaseDir()方法被调用时,Tomcat实际上设置了org.apache.catalina.startup.Tomcat属性。

如果您不希望Spring Boot使用临时文件夹,则需要将server.tomcat.basedir添加到application.properties