Как получить путь к выполняемому JAR-файлу?
Описание проблемы:
У меня есть код, который выполняется внутри JAR-файла, например, foo.jar. Мне нужно определить, в какой папке находится исполняемый foo.jar.
Другими словами, если foo.jar находится по пути C:\FOO</code>, я хочу получить этот путь, независимо от того, в каком каталоге я сейчас работаю.
Не могли бы вы помочь мне с этим? Я пробовал несколько подходов, но никак не могу найти решение.
5 ответ(ов)
Для получения пути к файлу, из которого загружен ваш класс, вы можете использовать следующий код:
return new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation()
.toURI()).getPath();
Замените "MyClass" на имя вашего класса.
Однако имейте в виду, что данный метод будет работать некорректно, если ваш класс был загружен из источника, отличного от файловой системы (например, из JAR-файла или сетевого местоположения).
Лучшее решение для меня:
String path = Test.class.getProtectionDomain().getCodeSource().getLocation().getPath();
String decodedPath = URLDecoder.decode(path, "UTF-8");
Это должно решить проблему с пробелами и специальными символами.
Вы также можете использовать следующий код для получения директории 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. Убедитесь, что ваш класс заменён на актуальное название.
Вам нужно получить путь к папке, содержащей 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-файлу из пути к классу, который вы передали, декодирует его и возвращает абсолютный путь к родительской директории.
Не забудьте обработать возможные исключения и проверить наличие файла, чтобы избежать ошибок во время выполнения!
Если вы действительно ищете простой способ получить каталог, в котором находится ваш 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\"
Таким образом, вы получите нужный путь всего в одной простой и лаконичной строке.
Как создать исполняемый JAR-файл с зависимостями с использованием Maven?
Не удается выполнить jar-файл: "отсутствует основной атрибут манифеста"
Как правильно создать JAR-файлы в IntelliJ IDEA?
Как создать утечку памяти в Java?
Инициализация ArrayList в одну строчку