Этот вопрос возникает у довольно большого количество людей. Узнать путь к каталогу с jar-файлом на самом деле не так тривиально, потому что jar-файлов может быть много. На самом деле мы запускаем не jar-файл, а виртуальную машину, которой указываем classpath и класс, в котором расположен стартовый метод. Но тем не менее найти путь в jar-файлу, в котором расположен текущий класс можно. Приведённый ниже пример отлично это делает:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
package ru.urvanov.examples.applicationstartuppath; import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.net.URL; import java.nio.file.Path; import java.nio.file.Paths; ; /** * Класс для определения пути к каталогу, из которого запущен jar-файл. * */ public class ApplicationStartUpPath { /** * @return Путь к каталогу, в котором расположен jar-файл с классом * ApplicationStartUpPath. */ public Path getApplicationStartUp() throws UnsupportedEncodingException, MalformedURLException { URL startupUrl = getClass().getProtectionDomain().getCodeSource() .getLocation(); Path path = null; try { path = Paths.get(startupUrl.toURI()); } catch (Exception e) { try { path = Paths.get(new URL(startupUrl.getPath()).getPath()); } catch (Exception ipe) { path = Paths.get(startupUrl.getPath()); } } path = path.getParent(); return path; } } |
Пример использования:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package ru.urvanov.examples.applicationstartuppath; public class MainClass { public static void main(String[] args) { ApplicationStartUpPath startUpPath = new ApplicationStartUpPath(); try { System.out.println("startUpPath: " + startUpPath.getApplicationStartUp()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |