4

プロジェクトの現在のディレクトリを Java から取得しようとしています。次のコード行を使用して、パスの詳細を取得しています。

タイプ 1:

File directory = new File (".");
try {
    System.out.println ("Current directory's canonical path: " 
            + directory.getCanonicalPath()); 
    System.out.println ("Current directory's absolute  path: " 
                + directory.getAbsolutePath());
}catch(Exception e) {
    System.out.println("Exceptione is ="+e.getMessage());
}

タイプ 2:

String currentDir = System.getProperty("user.dir");
System.out.println("Current dir using System:" +currentDir);

上記のコードをメイン クラスから実行しているときに、プロジェクト ディレクトリを取得しています。サーバー側から実行すると、「System:D:\Apache Tomcat 6.0.16\bin を使用した現在のディレクトリ」として取得されます。しかし、私のプロジェクトは にありD:\Apache Tomcat 6.0.16\wepapps\SampleStructsます。

これについて何か提案があれば教えてください。

4

4 に答える 4

7

まず、問題の主な原因は、現在の作業ディレクトリと実行可能ファイルの場所の違いです。Linux の現在の作業ディレクトリは、実行可能ファイルがあるディレクトリではなく、プログラムが開始された現在のディレクトリであることを知っておく必要があります。

current例として、現在のディレクトリを出力するプログラムがあり、それが にあるとし/home/user/scripts/ます。

これを行う場合:

cd /home/user/scripts
./current

印刷されます:/home/user/scripts/ しかし、これを行うと:

cd /home/user/
scripts/current

出力は次のようになります。/home/user/

可能な解決策に関しては、私が役立つと思ったもののいくつかは次のとおりです。

  • クラスパスに関連するプロジェクト リソースを参照してください。詳細については、 を参照ClassLoader.getResourceAsStream()してください。
  • ユーザーのホーム ディレクトリに関連する、プロパティ ファイルなどの構成リソースを参照してください。
  • メディア ディレクトリ パスなどの他のすべての場所と、上記の構成ファイルと同様の場所を配置します。
  • 他のすべてのオプションが利用可能または実用的でない場合getClass().getProtectionDomain().getCodeSource().getLocation().getPath()。このアプローチと考えられる問題の詳細については、次を参照してください:実行中の JAR ファイルのパスを取得する方法は?
于 2012-12-27T11:56:25.453 に答える
3

メインクラスから実行するとすべて問題ありませんが、このコードはサーバー上で実行され、現在のディレクトリを調べ、現在のディレクトリ構造はサーバーを起動した場所(run.bat)からのApache 'bin'であるためです。

于 2012-12-27T06:09:02.390 に答える
2

このコードを使用できます

String absolutePath = getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
        absolutePath = absolutePath.substring(0, absolutePath.lastIndexOf("/"));

このコードは私のために前に働いています! WindowsまたはLinuxのフォルダーのフルパスを返します。

于 2012-12-27T06:52:34.263 に答える
0

ここで話しているさまざまなコンテキストがあります。1. アプリケーションをスタンドアロン モードで実行します。2. サーバー側のコンテナーでアプリケーションを実行します。#1では、アプリケーションは呼び出されたディレクトリから実行されます。

ただし、#2 の場合、アプリケーションはコンテナーに対して相対的に実行されるため、サーバー ディレクトリの場所が表示されます。これにより、アプリケーション コードも保護されます。

于 2012-12-27T07:19:21.977 に答える