Как указать относительный путь для приложения разворачиваемого на сервере Tomcat

Вот то, что не получается: введите сюда описание изображения

Если не указывать абсолютный путь, выпадает с ошибкой FieNotFoundException

Я пробовала следющие пути:

../../../resources/connection.properties

src/main/resources/connection.properties

web/src/main/resources/connection.properties

connection.properties

resources/connection.properties

Вот, что пишет:

Caused by: java.io.FileNotFoundException: ***my attempts*** (The system cannot find the path specified)

Проект собирается в war

Как же указать относительный путь?

Источник проблем:

@Service
public class SocketConnectionPropertiesLoader implements ConnectionPropertiesLoader {
    @Override
    public Properties loadProperties(String pathToProperties) {
        File file = new File(pathToProperties);
        Properties properties = new Properties();

        try {
            properties.load(new FileReader(file));
            return properties;

        } catch (IOException e) {
            throw new SocketConnectionException(e);
        }
    }
}

Так же я попыталась перенести папку с ресурсами в WEB-INF, к сожалению, так же неудачно


Ответы (1 шт):

Автор решения: Roman Konoval

Если файл находится в ресурсах вашего проекта, то можно так:

@Value("classpath:/connection.properties")
Resource connectionPropertiesResource;

Если файл в корне resources, то cпринг его автоматически внедрит. Дальше уже пользуйтесь методами Resource типа getFile, чтобы достать содержимое.

Ключевые момент тут (и то что не работает в ваших попытках):

  1. файл из корня папки resources при сборке попадает в корень classpath
  2. соответственно и загрузку нужно делать из корня classpath (можно и вручную используя getClass().getResourceAsStream("/connection.properties") - это то, что спринг делает, если использовать Resource с автовнедрением).

Но конкретно для properties более удобно воспользоваться PropertySource:

@Configuration
@PropertySource("classpath:/connection.properties")
public class ConnectionProperties {
}

и далее используйте @Value или @Inject в других бинах:

@Service
class SomeOtherService {
    @Value("${value.from.connection.properties}")
    private String someProperty;
}

ConnectionProperties из примера, должен находится либо в пакете, который попадает под автоматическое сканирование конфигурации, либо явно включен через @Import.

→ Ссылка