Как да отворите ресурсен файл във WAR, като използвате име на низ?

Създавам WAR/EAR и един от моите компоненти чете в много потребителски конфигурационни файлове, използвайки File IO:

Reader reader = new BufferedReader(new FileReader(path));

Пътят по-горе е низ, който се предава като свойство на този клас чрез файла applicationContext.xml на Spring.

Какъв път на низ трябва да посоча, ако искам да поставя всички тези конфигурационни файлове в WAR? Може ли това дори да се направи? Или компонентът е неправилен и трябва да използва getResourceAsStream() вместо това?

Разгледах наоколо и намерих много информация за getResource() и URI. Не можах обаче да намеря дали е възможно да създам правилния файлов път към ресурс в applicationContext.xml


person Victor Lyuboslavsky    schedule 19.03.2012    source източник


Отговори (2)


В пролетна среда е по-добре да използвате пролетни ресурси API Прост пример:

@Inject
private ResourceLoader resourceLoader;

public void someMethod() {
    Resource resource = resourceLoader.getResource("file:my-file.xml");
    InputStream is = null;
    try {
        is = resource.getInputStream();
        // do work
        ....
    } finally {
        IOUtils.closeQuetly(is);
    }
}

Ако искате да осъществите достъп до външни файлове (не-classpath ресурси, които трябва да се намират в META-INF/ресурси в архива) с нефиксирани пътища, трябва да поставите такива пътища в основния файл със свойства и да го заредите при внедряване на приложението.

редактиране: променете @Resource на @Inject в примера

person alexkasko    schedule 19.03.2012

Ключът към достъпа до файловете е да ги направите достъпни във вашия classpath. По подразбиране във WAR файл всички файлове под WEB-INF/класове се добавят към пътя на класа и можете да препращате към тези файлове.

Например: нека приемем, че това е вашата WAR файлова структура

webapp.war
 |
 |---> WEB-INF
 |------|
 |      |----> classes
 |              |----> MyResource.properties
 |---> index.html
 |---> images
 |-------|
 |       ----> logo.gif

Можете да получите достъп до вашите "MyResource.properties", като използвате следния API

Reader reader = new BufferedReader(new FileReader("MyResource.properties"));

Надявам се това да помогне.

Късмет!

person uaarkoti    schedule 19.03.2012
comment
Наличието на файлови ресурси във вашия classpath улеснява достъпа. Но има и друга възможност, като описаната в отговора на този въпрос. API на сервлета описва къде трябва да се намират такива ресурси. По принцип вашият WAR трябва да съдържа папка META-INF/resources, където трябва да бъдат поставени вашите файлове, които не трябва да са в classpath. - person Markus; 19.03.2012
comment
Този отговор не работи за мен. Получавам IOException, защото файлът не може да бъде намерен. Също така видях следния коментар, По подразбиране класовете в пакета java.io винаги разрешават относителни имена на пътища спрямо текущата потребителска директория. Тази директория се наименува от системното свойство user.dir и обикновено е директорията, в която е извикана виртуалната машина на Java. на java.io.File javadoc - person Victor Lyuboslavsky; 20.03.2012
comment
Според spring трябва да посочите ресурса, като използвате classpath:MyResource.properties. Можете да намерите препратката тук static.springsource.org/spring/ docs/2.0.x/reference/ - person uaarkoti; 20.03.2012