Проблема с работающим каталогом в IntelliJ IDEA - PullRequest
0 голосов
/ 07 января 2020

Я знаю, это старая история, но есть ли какой-нибудь достойный способ сделать каталог рабочего проекта в качестве текущего запущенного каталога в 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\ и вернуть их обратно после отладки ... но это также немного неудобно, если не сказать больше.

1 Ответ

1 голос
/ 07 января 2020

Текущий рабочий каталог абсолютно не связан с текущим классом, который может быть любым, когда вы запускаете программу Java. root вашего проекта - это именно то, что IDEA выбирает по умолчанию, если вы не указали что-либо в конфигурации запуска.

У вас есть различные варианты:

  1. , определяющие, что именно ваше приложение ожидает, что текущий рабочий каталог будет (то есть, какие файлы должны быть там), убедитесь, что все способы, которыми вы выполняете ваше приложение, настроили это правильно и используйте относительные пути, чтобы найти ваши ресурсы
  2. не используют текущий рабочий каталог, но предоставьте приложению конфигурацию или параметр, который скажет ему, где найти его ресурсы (например, как передать имя каталога в метод main). Этот очень похож на # 1, но вместо неявного использования текущего рабочего каталога вы делаете базовый путь явным.
  3. связывает все необходимые файлы в ваших jar-файлах и использует механизмы загрузки ресурсов для их загрузки (опять же, используя относительные пути, но в этом случае ресурсы могут не быть «файлами» в традиционном смысле, если они упакованы в файл jar.

Какой из них выбрать, зависит от вашего точного требования. Для файлов данных, которые являются фиксированными, №3 обычно является лучшим выбором, поскольку он является наиболее надежным (не нужно иметь правильный рабочий каталог или передавать правильные аргументы). Если конечный пользователь должен иметь возможность изменять файлы ресурсов (или предоставлять свои собственные), тогда один из двух других вариантов лучше подходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...