Как получить реальный путь к Java-приложению во время выполнения? - PullRequest
36 голосов
/ 27 октября 2010

Я создаю приложение Java, где я использую log4j. Я дал абсолютный путь к файлу конфигурации log4j, а также абсолютный путь к сгенерированному файлу журнала (где генерируется этот файл журнала) Я могу получить абсолютный путь к веб-приложению Java во время выполнения через:

String prefix =  getServletContext().getRealPath("/");

но что мы можем использовать в контексте обычного Java-приложения?

Ответы [ 13 ]

44 голосов
/ 27 октября 2010

Постарайтесь;

String path = new File(".").getCanonicalPath();
30 голосов
/ 27 октября 2010

Не ясно, о чем вы просите. Я не знаю, что «в отношении веб-приложения, которое мы используем» означает, что getServletContext().getRealPath() не ответ, но:

  • Текущий рабочий каталог текущего пользователя задается как System.getProperty("user.dir")
  • Домашний каталог текущего пользователя задается как System.getProperty("user.home")
  • Местоположение файла JAR, из которого был загружен текущий класс, задается как this.getClass().getProtectionDomain().getCodeSource().getLocation().
9 голосов
/ 17 сентября 2011

А как насчет использования this.getClass().getProtectionDomain().getCodeSource().getLocation()?

4 голосов
/ 27 октября 2010

Если вы говорите о веб-приложении, вы должны использовать getRealPath из ServletContext объекта.

Пример:

public class MyServlet extends Servlet {
    public void doGet(HttpServletRequest req, HttpServletResponse resp) 
              throws ServletException, IOException{
         String webAppPath = getServletContext().getRealPath("/");
    }
}

Надеюсь, это поможет.

1 голос
/ 15 мая 2017

Я использую этот метод, чтобы получить полный путь к jar или exe.

File pto = new File(YourClass.class.getProtectionDomain().getCodeSource().getLocation().toURI());

pto.getAbsolutePath());
1 голос
/ 22 апреля 2017

Поскольку путь к приложению JAR и приложению, запущенному из IDE, отличается, я написал следующий код, чтобы последовательно возвращать правильный текущий каталог:

import java.io.File;
import java.net.URISyntaxException;

public class ProgramDirectoryUtilities
{
    private static String getJarName()
    {
        return new File(ProgramDirectoryUtilities.class.getProtectionDomain()
                .getCodeSource()
                .getLocation()
                .getPath())
                .getName();
    }

    private static boolean runningFromJAR()
    {
        String jarName = getJarName();
        return jarName.contains(".jar");
    }

    public static String getProgramDirectory()
    {
        if (runningFromJAR())
        {
            return getCurrentJARDirectory();
        } else
        {
            return getCurrentProjectDirectory();
        }
    }

    private static String getCurrentProjectDirectory()
    {
        return new File("").getAbsolutePath();
    }

    private static String getCurrentJARDirectory()
    {
        try
        {
            return new File(ProgramDirectoryUtilities.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()).getParent();
        } catch (URISyntaxException exception)
        {
            exception.printStackTrace();
        }

        return null;
    }
}

Просто позвоните getProgramDirectory(), и в любом случае вам будет хорошо.

1 голос
/ 13 июля 2016
/*****************************************************************************
     * return application path
     * @return
     *****************************************************************************/
    public static String getApplcatonPath(){
        CodeSource codeSource = MainApp.class.getProtectionDomain().getCodeSource();
        File rootPath = null;
        try {
            rootPath = new File(codeSource.getLocation().toURI().getPath());
        } catch (URISyntaxException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }           
        return rootPath.getParentFile().getPath();
    }//end of getApplcatonPath()
1 голос
/ 27 октября 2010

Лучше сохранять файлы в подкаталоге user.home, чем где бы приложение. может проживать.

Sun приложила немало усилий, чтобы обеспечить апплеты и приложения. запущенный с помощью Java Web Start не может определить приложения. реальный путь. Это изменение сломало много приложений. Я не удивлюсь, если изменения будут распространены на другие приложения.

0 голосов
/ 03 марта 2019

У меня есть файл "cost.ini" в корне моего пути к классам. Мой файл JAR называется "cost.jar".

Следующий код:

  • Если у нас есть файл JAR, берет каталог, в котором находится файл JAR.
  • Если у нас есть * .class файлы, берет каталог корня классов.
try {
    //JDK11: replace "UTF-8" with UTF_8 and remove try-catch
    String rootPath = decode(getSystemResource("cost.ini").getPath()
            .replaceAll("(cost\\.jar!/)?cost\\.ini$|^(file\\:)?/", ""), "UTF-8");
    showMessageDialog(null, rootPath, "rootpath", WARNING_MESSAGE);
} catch(UnsupportedEncodingException e) {}

Путь, возвращаемый из .getPath(), имеет формат:

В банке: file:/C:/folder1/folder2/cost.jar!/cost.ini В * .классе: /C:/folder1/folder2/cost.ini

Каждое использование File приводит к исключению, если приложение предоставляется в формате JAR.

0 голосов
/ 01 ноября 2018

Если вы хотите использовать этот ответ: https://stackoverflow.com/a/4033033/10560907

Вы должны добавить оператор импорта следующим образом:

import java.io.File;

в самом начале исходного кода Java.

нравится этот ответ: https://stackoverflow.com/a/43553093/10560907

...