web-dev-qa-db-fra.com

Comment obtenir le vrai chemin de l'application Java au moment de l'exécution?

Je crée une application Java sur laquelle j'utilise log4j. J'ai donné le chemin absolu du fichier de configuration log4j ainsi qu'un chemin absolu du fichier journal généré (où ce fichier journal est généré). Je peux obtenir le chemin absolu d’une application Web Java au moment de l’exécution via:

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

mais dans le contexte d'une application Java normale, que pouvons-nous utiliser?

33
Sameek Mishra

Essayer;

String path = new File(".").getCanonicalPath();
43
Qwerky

Ce que vous demandez n'est pas clair. Je ne sais pas ce que "par rapport à l'application Web que nous utilisons" signifie que si getServletContext().getRealPath() n'est pas la solution, mais:

  • Le répertoire de travail actuel de l'utilisateur actuel est donné par System.getProperty("user.dir")
  • Le répertoire personnel de l'utilisateur actuel est donné par System.getProperty("user.home")
  • L'emplacement du fichier JAR à partir duquel la classe actuelle a été chargée est donné par this.getClass().getProtectionDomain().getCodeSource().getLocation().
27
user207421

Et qu'en est-il de l'utilisation de this.getClass().getProtectionDomain().getCodeSource().getLocation()?

8
I.Cougil

Si vous parlez d'une application Web, vous devez utiliser la variable getRealPath à partir d'un objet ServletContext.

Exemple:

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

J'espère que cela t'aides.

4
Sudantha
new File(".").getAbsolutePath()
1
Bozho

Comme le chemin d'application d'un JAR et d'une application s'exécutant à l'intérieur d'un IDE est différent, j'ai écrit le code suivant pour retourner systématiquement le bon répertoire actuel:

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;
    }
}

Appelez simplement getProgramDirectory() et vous devriez être bon dans les deux cas.

1
BullyWiiPlaza

Il est préférable de sauvegarder les fichiers dans un sous-répertoire de user.home plutôt que dans n'importe quelle application. pourrait résider. 

Sun a déployé des efforts considérables pour s'assurer que les applets et les applications. lancé avec Java Web Start ne peut pas déterminer les applications. vrai chemin. Ce changement a cassé de nombreuses applications. Je ne serais pas surpris si les modifications sont étendues à d'autres applications.

1
Andrew Thompson

J'utilise cette méthode pour obtenir un chemin complet vers jar ou exe.

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

pto.getAbsolutePath());
1
Sahan
/*****************************************************************************
     * 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
Mihir Patel

J'ai un fichier "cost.ini" à la racine de mon chemin d'accès aux classes. Mon fichier JAR s'appelle "cost.jar" .

Le code suivant:

  • Si nous avons un fichier JAR, prend le répertoire où il se trouve .
  • Si nous avons des fichiers * .class, prend le répertoire de la racine des classes.

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) {}

Le chemin renvoyé par .getPath() a le format suivant:

  • Dans le fichier JAR: file:/C:/folder1/folder2/cost.jar!/cost.ini
  • Dans * .class: /C:/folder1/folder2/cost.ini

    Toute utilisation de File, entraîne une exception, si l'application est fournie au format JAR.

  • 0
    Chameleon

    Si vous souhaitez obtenir le chemin réel d'une application Web Java tel que Spring (Servlet), vous pouvez l'obtenir à partir de l'objet Contexte Servlet fourni avec votre HttpServletRequest.

    @GetMapping("/")
    public String index(ModelMap m, HttpServletRequest request) {
        String realPath = request.getServletContext().getRealPath("/");
        System.out.println(realPath);
        return "index";
    }
    
    0
    Chhaileng

    Si vous souhaitez utiliser cette réponse: https://stackoverflow.com/a/4033033/10560907

    Vous devez ajouter une déclaration d'importation comme ceci:

    import Java.io.File;

    en tout début de code source Java.

    aimez cette réponse: https://stackoverflow.com/a/43553093/10560907

    0
    Lpia IT