Как указать относительный путь для приложения разворачиваемого на сервере 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 шт):
Если файл находится в ресурсах вашего проекта, то можно так:
@Value("classpath:/connection.properties")
Resource connectionPropertiesResource;
Если файл в корне resources, то cпринг его автоматически внедрит. Дальше уже пользуйтесь методами Resource типа getFile, чтобы достать содержимое.
Ключевые момент тут (и то что не работает в ваших попытках):
- файл из корня папки resources при сборке попадает в корень classpath
- соответственно и загрузку нужно делать из корня 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.
