これには本当に困惑しました。
私の Eclipse ワークスペースには、「Java スクラッチパッド」というプロジェクトがあります。「パッケージ エクスプローラー」では、この下に「src」(ソース フォルダー) が表示され、次に「ルート」(パッケージ) が表示されます。「ルート」の下には、「LoggingTest.java」という .java ファイルがあります。
したがって、この Java ファイルへのパスは「G:\My Documents\software projects\workspace\Java scratchpad\src\root\LoggingTest.java」です。
Eclipse で次のコードを実行すると:
Path currentRelativePath = Paths.get("");
String s_currRelPath = currentRelativePath.toAbsolutePath().toString();
String pathWithForwardSlashes = s_currRelPath.replace( "\\", "/" );
System.out.println( "path " + pathWithForwardSlashes );
結果は
パス G:/マイ ドキュメント/ソフトウェア プロジェクト/ワークスペース/Java スクラッチパッド
しかし...コマンドプロンプトで同じコードを実行しているときは、次のディレクトリから開始する必要があります。
G:\マイ ドキュメント\ソフトウェア プロジェクト\ワークスペース\Java スクラッチパッド\ bin
...そしてjava root.LoggingTest
、プロンプトで>に進みます。
上記のコードからの出力は次のようになります。
パス G:/マイ ドキュメント/ソフトウェア プロジェクト/ワークスペース/Java スクラッチパッド/ビン
つまり、コマンド プロンプトで実行すると \bin ディレクトリの下で .class ファイルが実行されますが、Eclipse で実行すると、Eclipse フレームワークは bin ディレクトリが存在しないように「ふりをします」。
結果として、Eclipse で実行しているか、コマンド プロンプトで実行しているかによって、「現在の相対パス」(CWD) の値が異なります。CWD に相対的なディレクトリを作成または使用する場合、Eclipse で実行しているか、コマンド プロンプトで実行しているかによって、異なる値を取得します。
今夜はかなりゆっくりしています。私は何をすべきか?プロジェクトが Eclipse で実行されているか、コマンド プロンプトで実行されているかを検出する方法はありますか? または、パスが「\ bin」で終わるかどうかを検出し、それらの 4 文字を削除してパスを同等にする必要がありますか?
後で
E-Riz からのコメントへの返信にメモを追加するだけです。
それは簡単なことです: ログを作成し、Lucene インデックスを作成したい...そして、物事を 1 つの場所に保持する (この段階ではとにかく) この出力を...\Java scratchpad\output\indices\[name of index]
それぞれ やなどの場所に配置したいだけです...\Java scratchpad\output\logging\[name of log]
。
そして、はい、もちろん、現時点では、ここに含まれる絶対パスを知っています...ただし、名前が示すように、これは「スクラッチパッド」またはテスト領域です...そのため、CWD を使用してどこに移動するかを決定するこのコードログまたはインデックスの put または find は、関連する絶対パスを知らなくても、より一般的に使用できます。
ただし、Eclipse またはコマンド プロンプトで動作する必要があります...!
注意:私の現在の回避策はpathWithForwardSlashes
、「\ bin」で終わっているかどうかを確認し、そうである場合はこれらの最後の4文字を削除することです。この奇妙なことに遭遇したのは私だけではありません。もっと賢い解決策があるに違いない!