home Glamenv-Septzen(ぐらめぬ・ぜぷつぇん)(archive)

Java/Tomcat, Jetty と ServletContext.getRealPath() の末尾

作成日: 2012-04-09 23:03:39   /   last updated at: 2012-04-09 23:16:13
カテゴリ: Java 

Java/Maven3/Eclipse上でサクサクWeb開発 (例:tomcat-maven-plugin) にて tomcat-maven-plugin を選択した理由に、
「実働環境はTomcatなのに、開発をJettyとすることで不要な地雷を踏み抜きそうな悪寒がした。」
と書きましたが、今思い出しました。

実際に地雷を踏み抜いていたから、わざわざTomcatを選んだのでした。

その理由は簡単で、javax.servlet.ServletContext#getRealPath("/") が返す文字列が、Tomcatの場合末尾が '/' 付きで、Jettyの場合末尾の '/' が付いてこない。で、件のEclipseプロジェクトでは

getRealPath("/") + "WEB-INF/foo/bar...";

としていたものだから(他人から引き継いだ既存プロジェクト)、Jettyに載せ替えようと思っても載せ替えられない。

実例:/work/tmp/mvntest/servlet1/src/main/webapp/WEB-INF/web.xml をdeploy

Tomcat上でのgetRealPath("/")
/work/tmp/mvntest/servlet1/src/main/webapp/
Jetty上でのgetRealPath("/")
/work/tmp/mvntest/servlet1/src/main/webapp

まぁ他にも地雷が埋まってそうだったので、素直にTomcatで打てる手が無いか探していた結果、tomcat-maven-plugin を見つけた次第です。
これだと、

getRealPath("/") + "WEB-INF/foo/bar..." 

がJettyだと

/work/tmp/mvntest/servlet1/src/main/webappWEB-INF/foo/bar...

になってしまい、ファイル操作が失敗してしまうという罠・・・。

この辺、もしかして仕様が決まってないのかな?JavaDoc確認しても、J2EE 1.3 と Java EE 6 の双方で、ディレクトリを指定した場合の末尾のPATH SEPARATORについて明確な言及がない。


original url: https://www.glamenv-septzen.net/view/1073