Как правило, вы не можете легко определить, где находится ваш JAR-файл во время выполнения. Среда выполнения вашей виртуальной машины может сообщить вам каталог пользователя (как вы сказали), но это каталог, из которого была запущена виртуальная машина. Так что, если вы дважды щелкнете по JAR, это каталог, в котором находится JAR. Но если вы вызываете Java в командной строке, например
c: \ some \ directory> java -cp c: \ temp \ test.jar main.Class
тогда «user.dir» будет содержать «c: \ some \ directory».
Это отсутствие информации является преднамеренным, поскольку оно позволяет виртуальной машине прозрачно загружать классы из разных мест.
Ваш лучший выбор, чтобы сделать то, что вы хотите, - передать выбранный каталог в качестве аргумента командной строки. И в худшем случае вы можете использовать «user.dir» по умолчанию. Но лучшее решение на самом деле зависит от того, почему вы хотите разместить каталог, в котором находится JAR.