6

Как получить путь к выполняемому JAR-файлу?

7

Описание проблемы:

У меня есть код, который выполняется внутри JAR-файла, например, foo.jar. Мне нужно определить, в какой папке находится исполняемый foo.jar.

Другими словами, если foo.jar находится по пути C:\FOO</code>, я хочу получить этот путь, независимо от того, в каком каталоге я сейчас работаю.

Не могли бы вы помочь мне с этим? Я пробовал несколько подходов, но никак не могу найти решение.

5 ответ(ов)

6

Для получения пути к файлу, из которого загружен ваш класс, вы можете использовать следующий код:

return new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation()
    .toURI()).getPath();

Замените "MyClass" на имя вашего класса.

Однако имейте в виду, что данный метод будет работать некорректно, если ваш класс был загружен из источника, отличного от файловой системы (например, из JAR-файла или сетевого местоположения).

2

Лучшее решение для меня:

String path = Test.class.getProtectionDomain().getCodeSource().getLocation().getPath();
String decodedPath = URLDecoder.decode(path, "UTF-8");

Это должно решить проблему с пробелами и специальными символами.

0

Вы также можете использовать следующий код для получения директории JAR-файла:

CodeSource codeSource = YourMainClass.class.getProtectionDomain().getCodeSource();
File jarFile = new File(codeSource.getLocation().toURI().getPath());
String jarDir = jarFile.getParentFile().getPath();

Этот код сначала получает источник кода вашего класса с помощью getProtectionDomain().getCodeSource(). Затем создается объект File, который ссылается на JAR-файл, и с помощью getParentFile().getPath() вы можете получить путь к директории, в которой находится JAR. Убедитесь, что ваш класс заменён на актуальное название.

0

Вам нужно получить путь к папке, содержащей JAR-файл, в котором находится класс? Вот решение, которое работает как на Linux, так и на Mac и Windows:

public static String getJarContainingFolder(Class aclass) throws Exception {
  CodeSource codeSource = aclass.getProtectionDomain().getCodeSource();

  File jarFile;

  if (codeSource.getLocation() != null) {
    jarFile = new File(codeSource.getLocation().toURI());
  }
  else {
    String path = aclass.getResource(aclass.getSimpleName() + ".class").getPath();
    String jarFilePath = path.substring(path.indexOf(":") + 1, path.indexOf("!"));
    jarFilePath = URLDecoder.decode(jarFilePath, "UTF-8");
    jarFile = new File(jarFilePath);
  }
  return jarFile.getParentFile().getAbsolutePath();
}

Этот метод сначала пытается получить местоположение JAR-файла из CodeSource. Если оно доступно, он создает объект File для этого пути. Если нет, то он пытается извлечь путь к JAR-файлу из пути к классу, который вы передали, декодирует его и возвращает абсолютный путь к родительской директории.

Не забудьте обработать возможные исключения и проверить наличие файла, чтобы избежать ошибок во время выполнения!

0

Если вы действительно ищете простой способ получить каталог, в котором находится ваш JAR-файл, вам стоит использовать следующую реализацию. Найти такие решения не так просто, и многие из них больше не поддерживаются, а другие предоставляют путь к файлу вместо фактического каталога. Это решение проще, чем многие другие, которые вы можете найти, и оно работает для версии Java 1.12.

new File(".").getCanonicalPath()

Эта реализация предполагает, что рабочий каталог (в котором находится пользователь при выполнении JAR-файла) совпадает с исполняемым JAR. Если это не так, вы можете использовать следующий вариант: Собрано из других ответов:

String localPath = new File(getClass().getProtectionDomain().getCodeSource().getLocation().toURI()).getParentFile().getPath() + "\\"; 

Обе реализации вернут строку в следующем формате:

"C:\Users\User\Desktop\Folder\"

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь