1

あらすじ

サーブレットのサーバー側に存在する次の(要約された)コードがあるとします(Tomcatはコンテナーです)。これはGWTアプリケーションですが、関係ないはずです(私は思います)。

ServletContext context = getServletContext();
String dataFilePath= context.getRealPath("/WEB-INF/dir/dataFile.txt");
File dataFile = new File(dataFilePath);

TestCaseGenerator testCaseGenerator = new TestCaseGenerator(dataFile);
testCaseGenerator.generateTestCase();

TestCaseGeneratorプロジェクトのwar/WEB-INF/libフォルダにあるjarのクラスであり、外部ライブラリとしてGWTプロジェクトに追加されています。

問題

testCaseGenerator.generateTestCase()実行されると、dataFileを作成するために使用できなくなりnew LineNumberReader(new FileReader(dataFile));FileNotFoundExceptionがスローされます。

Stringの値dataFilePathが正しく、読み取る必要のあるサーバー上のファイルへの適切な実際のパスが含まれていることを確認しましたが、そうでdataFileはありませんnullTestCaseGeneratorまた、このGWTアプリケーションの外部で、コマンドラインから呼び出されたときに正常に実行されることも確認しました。

ファイルの実際のファイルパスを渡したので、渡しTestCaseGeneratorたオブジェクトを使用できない理由がわかりません。Fileこの問題を回避するためのいくつかの代替ソリューションを考え出すことができますが、ファイルが見つからない理由に本当に興味があります。

洞察を事前に感謝します。

4

1 に答える 1

0

解決しました

dir/dataFile.txt私は愚かにも私build.xmlのターゲットにを含めることを怠ったwarので、実際にはファイルはwarパッケージに含まれていなかったため、Tomcatコンテナ内に配置されることはありませんでした。

<include name="dir/**" />

そして、私はまた、context.getRealPath("/WEB-INF/dir/dataFile.txt");実際に何が返ってくるのか誤解しました。ServletContextjavadocから

指定された仮想パスに対応する実際のパスを取得します。たとえば、パスが/index.htmlと等しい場合、このメソッドは、http://://index.html形式のリクエストがマップされるサーバーのファイルシステム上の絶対ファイルパスを返します。ここで、はに対応します。このServletContextのコンテキストパス。

したがってgetRealPath、パス値を返しても、必ずしもファイルがその実際のパスにあることを意味するわけではありません。

于 2013-01-16T19:24:11.073 に答える