Я знаю, это старая история, но есть ли какой-нибудь достойный способ сделать каталог рабочего проекта в качестве текущего запущенного каталога в IntelliJ IDEA, чтобы я мог читать локальные файлы, расположенные в том же каталоге, с классом чтения, по их относительным путям ?
Предположим, в каталоге моего проекта src
(C:\projects\Test1\src\
) есть два файла:
- ReaderClass.java
- properties.xml
Когда проект компилируется и собирается, выходные данные перемещаются в production
каталог (C:\projects\Test1\out\production\Test1\
):
- ReaderClass.class
- properties.xml
Однако, если мой ReaderClass
содержит некоторый код, такой как:
Properties props = new Properties();
try (InputStream is = Files.newInputStream(Paths.get("properties.xml"))) {
props.loadFromXML(is);
...
}
, я получаю ошибку: java.nio.file.NoSuchFileException: properties.xml
Проблема в том, что при отладке класса из IntelliJ IDEA и System.getProperty("user.dir")
, и Paths.get("").toAbsolutePath()
ссылаются на C:\projects\Test1\
как на текущий запущенный каталог.
Итак, чтобы получить «настоящий» производственный каталог, работающий в данный момент, я должен украсить свой код с помощью обходных путей, таких как:
try {
URI currentRelativeURI = MethodHandles.lookup().lookupClass().getResource("").toURI();
Path currentRelativePath = Paths.get(currentRelativeURI);
} catch (URISyntaxException e) {
...
}
или, как в этом конкретном примере, я мог бы получить InputStream
путем вызова MethodHandles.lookup().lookupClass().getResourceAsStream("properties.xml")
.
Это немного раздражает, поскольку я мог бы просто использовать Paths.get("")
и Paths.get("properties.xml")
для ссылки на локальные файлы по их относительным путям в рабочем коде без необходимости обрабатывать все эти URI URISyntaxExceptions только для целей отладки.
Альтернативное решение - временно переместить все локальные файлы из src
в C:\projects\Test1\
и вернуть их обратно после отладки ... но это также немного неудобно, если не сказать больше.