在Spring上下文中查找* .properties文件的绝对路径

时间:2014-12-22 15:36:35

标签: java spring maven tomcat apache-commons-config

我有一些传统的罐子,我正试图在弹簧环境中工作。

在我的applicationContext.xml中,我使用:

加载属性文件
<context:property-placeholder location="classpath*:META-INF/spring/*.properties" />

......在春天的环境中它完美无缺。

在遗留代码中,我需要获取该配置文件的绝对路径,并且当我运行mvn tomcat:run并将其打包到war文件并部署到Tomcat容器(在如果你想知道,是的,春天和遗留代码共享相同的application.properties配置文件)。

@Service
public class Startup {    

    Logger log = LoggerFactory.getLogger(Startup.class);   

    @PostConstruct
    public void startup() throws Exception {
        if (!LegacyCode.isInit()){
            // this works using a hardcoded path
            LegacyCode.init("/home/user/absolute/path/to/application.properties"); 
            // this doesn't work, but would the preferred solution if it did
            // LegacyCode.init("classpath*:META-INF/spring/*.properties"); 
        }
    }
}

我考虑过使用:

    String config[] = { "classpath*:META-INF/spring/applicationContext.xml" };
    ApplicationContext ctx = new ClassPathXmlApplicationContext(config);

然后使用ctx.getResource劫持路径,但除了第二次加载applicationContext以获取application.properties的绝对路径效率非常低之外,它还会导致@PostConstruct的无限循环被执行。

遗留代码使用Commons Configuration(根据我可以看到并基于依赖性错误)来设置其配置,我正在寻找的是Commons Configuration加载正确的application.properties文件的一种方式,无论它是否正在运行在Linux,Windows,WAR文件或嵌入式Tomcat等

2 个答案:

答案 0 :(得分:2)

看起来你的legacyCode想要一个合适的filePath,并且不了解Spring资源("classpath*:META-INF/spring/applicationContext.xml"

我个人会做以下事情:

LegacyCode.init(new File(this.getClass().getClassLoader().getResource("application.properties").toURI()).getPath());

getResource("application.properties")是Java等价的Spring表示法

答案 1 :(得分:0)

在spring上下文中添加此bean

<bean class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer" />
<bean class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer" />

创建类

之后
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:mypropfile.properties")
public class Config {
    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}

并注释你的变量

@Value( “$ {cert.path}”) private String certPath;