Непростая вещь с каталогом \bin в Eclipse

Это действительно сбило меня с толку.

В моем рабочем пространстве Eclipse у меня есть проект под названием "Блокнот Java". В "Package Explorer" вы видите "src" (Исходная папка) под этим и затем "root" (Package). Под "корнем" находится файл.java с именем "LoggingTest.java".

Таким образом, путь к этому Java-файлу - "G:\ Мои документы \ программные проекты \workspace\Java scratchpad\src\root\LoggingTest.java".

Когда я запускаю следующий код в Eclipse:

        Path currentRelativePath = Paths.get("");
        String s_currRelPath = currentRelativePath.toAbsolutePath().toString();
        String pathWithForwardSlashes = s_currRelPath.replace( "\\", "/" );
        System.out.println( "path " + pathWithForwardSlashes );

Результат

путь G:/ Мои документы / программные проекты / рабочая область / блокнот Java

Но... когда я запускаю тот же кусок кода в командной строке, я должен начать в следующем каталоге:

G: \ Мои документы \ программные проекты \ рабочее пространство \ блокнот Java \bin

... а потом иди> java root.LoggingTest по подсказке.

Выход из вышеупомянутого бита кода тогда:

путь G:/ Мои документы / программные проекты / рабочее пространство / блокнот Java /bin

Другими словами, когда вы запускаете объект в командной строке, вы запускаете файл.class в каталоге \bin, но когда вы запускаете в Eclipse, платформа Eclipse "делает вид", что каталог bin не существует.

И в результате я получаю разные значения для "текущего относительного пути" (CWD) в зависимости от того, работаю ли я в Eclipse или в командной строке. Если я хочу создать или использовать каталог относительно CWD, я получу разные значения в зависимости от того, работаю ли я в Eclipse или в командной строке.

Я чувствую себя довольно медленно сегодня вечером. Что я должен делать? Есть ли способ определить, выполняется ли проект в Eclipse или в командной строке? Или я должен просто попытаться определить, заканчивается ли путь в "\bin", и удалить эти четыре символа, чтобы сделать пути эквивалентными?

потом

Просто добавив заметку в ответ на комментарий от E-Riz:

Это простая вещь: я хочу создавать журналы и хочу создавать индексы Lucene... и хранить вещи в одном месте (на данном этапе в любом случае). Я просто хочу поместить этот вывод в такое место, как ...\Java scratchpad\output\indices\[name of index] или, соответственно, ...\Java scratchpad\output\logging\[name of log],

И да, конечно, в настоящее время я знаю абсолютный путь, связанный с этим... однако, как следует из названия, это "блокнот" или тестовая область... так что этот код, который использует CWD, чтобы определить, куда Журналы или индексы put or find могут использоваться более широко, без необходимости знать абсолютные пути.

Но он должен работать либо в Eclipse, либо в командной строке...!

NB мой текущий обходной путь действительно проверить, является ли pathWithForwardSlashes оканчивается на "\bin", и если да, то удалить эти последние 4 символа. Я не могу быть единственным человеком, который столкнулся с этой странностью. Спорим, есть более умные решения!

1 ответ

Решение

Есть пара фактов, которые вы должны знать или иметь в виду:

  • Во время выполнения Java может (должен) быть предоставлен путь к классу для работы; путь к классу приложения по умолчанию просто . (текущий каталог, где java был вызван из). Вот почему вам кажется, что вы должны запустить свою программу из \bin каталог вашего проекта; потому что вы нигде не сказали JVM искать классы. Вы должны установить путь к классу времени выполнения при запуске приложения, что может быть сделано различными способами, но для простых программ это часто делается с помощью командного файла или сценария оболочки. Обратите внимание, что с помощью -cp указание пути к классу будет иметь решающее значение, когда вы зависите от любых JAR-файлов.
  • В Eclipse, поскольку приложения не запускаются через командную строку, Eclipse имеет конфигурации запуска, которые включают в себя все детали, необходимые для запуска программы (в режиме "запуска" или "отладки"). Вот достойный учебник (хотя и немного устаревший; вы можете найти гораздо больше информации о Launch Configurations там на Interwebs. Ключевой элемент конфигурации, который вы ищете, находится на вкладке Arguments, где вы можете указать рабочий каталог для Конфигурация запуска программы. По умолчанию это корневой каталог проекта. Посмотрите, как это отличается от того, когда вы запускали свою командную строку? Это объясняет разницу, которую вы видите в выводе. Вы можете изменить рабочий каталог в конфигурации запуска Eclipse., но я предпочитаю оставить его в качестве корня проекта.

Итак, у вас есть несколько вариантов, чтобы сделать вещи согласованными: используйте скрипт / пакет для запуска приложения в командной строке, указав -cp поэтому JVM знает, где находятся ваши файлы классов (и любые другие JAR, которые могут понадобиться в будущем); или заново настройте запуск Eclipse в соответствии с тем, откуда вы запускаете в командной строке. Я думаю, что (безусловно) предпочтительный вариант - первый.

Сказав все это, вы обычно не должны делать какие-либо манипуляции с путями, когда дело доходит до файлов / ресурсов в Java. Все относительно текущего рабочего каталога, из которого была запущена Java, или пути к классам.

Другие вопросы по тегам