Найти абсолютный путь к файлу *.properties в контексте Spring

У меня есть несколько устаревших банок, которые я пытаюсь заставить работать в контексте весны.

Внутри моего applicationContext.xml я загружаю файлы свойств, используя:

<context:property-placeholder location="classpath*:META-INF/spring/*.properties" />

... и он отлично работает в контексте весны.

В устаревшем коде мне нужно получить абсолютный путь к этому файлу (файлам) конфигурации, и он должен работать, когда я запускаю mvn tomcat:run и когда он упакован в файл войны и развернут в контейнере Tomcat (если вам интересно, да , spring и устаревший код используют один и тот же файл конфигурации 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 (насколько я вижу и на основе ошибок зависимостей) для настройки своей конфигурации, я ищу способ для конфигурации Commons загрузить правильный файл application.properties независимо от того, работает ли он в Linux, Windows, из файла WAR или из встроенного Tomcat и т. д.


person Jan Vladimir Mostert    schedule 22.12.2014    source источник
comment
У вас есть несколько файлов свойств в вашем Spring xml, но вы LegacyCode принимает только один?   -  person yunandtidus    schedule 22.12.2014
comment
Правильно, конфигурация, которая мне нужна для устаревшего материала, сегментирована, поэтому для jar1 мне нужна конкретная конфигурация, а для jar2 мне нужна другая конфигурация, обе используют конфигурацию Commons, Spring нужны обе, ваш ответ выглядит так, как будто он сделает работу, немного проверит и вернет ваш ответ.   -  person Jan Vladimir Mostert    schedule 22.12.2014


Ответы (2)


Кажется, что вы legacyCode хотите правильный путь к файлу и не понимаете ресурсы Spring ("classpath*:META-INF/spring/applicationContext.xml")

Я лично сделал бы следующее:

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

getResource("application.properties") — это Java-эквивалент нотации Spring.

person yunandtidus    schedule 22.12.2014
comment
Работает на 100%, это то, что я использовал в конце: LegacyCode.init(new File(this.getClass().getClassLoader().getResource(META-INF/spring/application.properties).toURI()).getPath( )); Спасибо Юнандтидус!! - person Jan Vladimir Mostert; 23.12.2014

В весеннем контексте добавьте эти бобы

<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;

person David Chaava    schedule 24.12.2014