web-dev-qa-db-ja.com

実行時にJavaアプリケーションの実際のパスを取得するには?

Log4jを使用しているJavaアプリケーションを作成しています。構成log4jファイルの絶対パスと、生成されたログファイル(このログファイルが生成される)の絶対パスも指定しました。実行時にJava Webアプリケーションの絶対パスを次の方法で取得できます。

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

しかし、通常のJavaアプリケーションでは、何を使用できますか?

36
Sameek Mishra

試してみてください。

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

何を求めているのか明確ではありません。 getServletContext().getRealPath()が答えではない場合、「使用しているWebアプリケーションに関して」とはどういう意味かわかりませんが、

  • 現在のユーザーの現在の作業ディレクトリは、System.getProperty("user.dir")で与えられます
  • 現在のユーザーのホームディレクトリはSystem.getProperty("user.home")で与えられます
  • 現在のクラスがロードされたJARファイルの場所は、this.getClass().getProtectionDomain().getCodeSource().getLocation()で指定されます。
30
user207421

this.getClass().getProtectionDomain().getCodeSource().getLocation()の使用はどうですか?

9
I.Cougil

Webアプリケーションの場合は、getRealPathオブジェクトのServletContextを使用する必要があります。

例:

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

お役に立てれば。

4
Sudantha

JARIDEの内部から実行されるアプリケーションのアプリケーションパスが異なるため、一貫して正しい現在のディレクトリを返すために次のコードを記述しました。

_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
BullyWiiPlaza

アプリを保存する場所よりも、user.homeのサブディレクトリにファイルを保存することをお勧めします。存在する可能性があります。

Sunは、アプレットとアプリを確実にするためにかなりの努力をしました。 Java Web Startはアプリを特定できません。実際のパス。この変更により多くのアプリが壊れました。変更が他のアプリに拡張されても驚かないでしょう。

1
Andrew Thompson

このメソッドを使用して、jarまたは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
new File(".").getAbsolutePath()
0
Bozho

クラスパスのルートに「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()から返されるパスの形式は次のとおりです。

  • JARの場合:_file:/C:/folder1/folder2/cost.jar!/cost.ini_
    • * .class:_/C:/folder1/folder2/cost.ini_

      アプリケーションがJAR形式で提供されている場合、Fileを使用するたびに例外が発生します。

  • 0
    Chameleon

    Java Spring(Servlet)などのWebアプリケーションの実際のパスを取得する場合、HttpServletRequestに付属するServlet Contextオブジェクトから取得できます。

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

    この回答を使用する場合: https://stackoverflow.com/a/4033033/10560907

    次のようなimportステートメントを追加する必要があります。

    import Java.io.File;

    はじめにJavaソースコード。

    この答えのように: https://stackoverflow.com/a/43553093/10560907

    0
    Lpia IT