44

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

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

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

4

14 に答える 14

57

試す;

String path = new File(".").getCanonicalPath();
于 2010-10-27T12:15:55.693 に答える
38

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

  • 現在のユーザーの現在の作業ディレクトリは、System.getProperty("user.dir")
  • 現在のユーザーのホームディレクトリは、System.getProperty("user.home")
  • 現在のクラスがロードされたJARファイルの場所は。で指定されthis.getClass().getProtectionDomain().getCodeSource().getLocation()ます。
于 2010-10-27T12:23:33.930 に答える
11

そして、使用するのはthis.getClass().getProtectionDomain().getCodeSource().getLocation()どうですか?

于 2011-09-17T00:42:44.737 に答える
5

aのアプリケーションパスと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()で、どちらの方法でもうまくいくはずです。

于 2017-04-21T22:45:44.403 に答える
4

Webアプリケーションについて話している場合はgetRealPath、オブジェクトからを使用する必要がありServletContextます。

例:

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

お役に立てれば。

于 2010-10-27T12:09:12.557 に答える
2

このメソッドを使用して、jarまたはexeへの完全なパスを取得します。

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

pto.getAbsolutePath());
于 2017-05-15T04:04:36.503 に答える
1
new File(".").getAbsolutePath()
于 2010-10-27T12:16:58.110 に答える
1

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

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

于 2010-10-27T12:23:59.613 に答える
1
/*****************************************************************************
     * 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()
于 2016-07-13T11:52:48.227 に答える
0

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

@GetMapping("/")
public String index(ModelMap m, HttpServletRequest request) {
    String realPath = request.getServletContext().getRealPath("/");
    System.out.println(realPath);
    return "index";
}
于 2018-07-28T14:34:34.657 に答える
0

私は誰もがこれに関する重要な問題を見逃していると思います。

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

サーブレットインスタンスは、任意の数のノードの1つに存在する可能性があり、技術的にはファイルシステムをまったく必要としません。

たとえば、Java EEコンテナでは、アプリケーションをデータベースまたはディレクトリサーバーからロードできます。アプリケーションのさまざまな部分をさまざまなノードで実行することもできます。アプリケーションの外部へのアクセスは、アプリケーションサーバーによって提供されます。

従来のlog4jとの互換性を維持する必要がある場合は、java.util.loggingまたはApacheCommonsLoggingを使用してください。ログファイルの保存先をアプリケーションサーバーに通知します。

于 2021-04-22T14:40:37.343 に答える
-1

この回答を使用したい場合: https ://stackoverflow.com/a/4033033/10560907

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

import java.io.File;

非常に最初のJavaソースコード。

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

于 2018-11-01T08:49:30.340 に答える
-1

クラスパスのルートにファイル「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
  • クラスで:/C:/folder1/folder2/cost.ini

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

  • 于 2019-03-03T11:29:26.010 に答える
    -2

    表現

    new File(".").getAbsolutePath();
    

    JVMの実行に関連付けられている現在の作業ディレクトリを取得します。ただし、JVMは、

    System.getProperty(propertyName); 
    

    インターフェース。これらのプロパティのリストは、ここにあります

    これらにより、プラットフォームに依存しない方法で、現在のユーザーディレクトリや一時ディレクトリなどを参照できます。

    于 2010-10-27T12:31:10.213 に答える