Я не думаю, что это можно сделать приятным, на 100% бесконечно совместимым способом. Java на самом деле пытается отвлечь вас от файловой системы с помощью механизма classpath.
Тем не менее, вы обычно можете получить путь к файлу через загрузчик классов. Первый шаг - получить ссылку на загрузчик классов, который может найти любой интересующий вас ресурс (обычно загрузчик классов для любого из ваших собственных классов будет работать нормально; если у вас более сложный сценарий, вы должны знать, какой загрузчик классов использовать) .
Затем вы можете запросить у загрузчика классов местоположение данного ресурса в виде URL, например:
final ClassLoader loader = getClass().getClassLoader();
final URL resourceLocation = loader.getResource("com/mycomp/coolapp/checkthis.doc");
Теперь, если вам повезет, URL будет использовать протокол file:/
и будет описывать местоположение в вашей локальной файловой системе. Если это так, вы можете извлечь этот путь и использовать его в качестве расположения файловой системы любого ресурса classpath, который вы только что искали. Если это не ресурс file:/
, класс может даже не существовать на вашем локальном компьютере (например, он загружается удаленно через RMI), поэтому в любом случае вам не повезло.
Если это звучит сложно - возможно, вы можете передать рабочий каталог как системное свойство из вашего скрипта запуска Java (например, java ... -Dworking.dir=$(pwd)
).