私の質問は、Tomcat 6.0.18から7.0.22へのアップグレードに由来しますが、他のバージョンで問題が起きそうです。私はそれがTomcat documentationを検索した後、Tomcatについての以前の質問(効果的に引用するには数が多すぎます)と様々なソースからのさまざまなブログ記事(これは、引用する価値がある)、私は迷っています。tomcatはどのように作業ディレクトリー* _jsp.javaファイルを生成するのですか?何が原因でゼロバイトのファイルが生成されるのですか?
私が扱っているアプリケーションは、何百ものJSPページを含む大規模なJavaアプリケーションです。これまでTomcat 6では、実行時にコンパイルするのに問題はありませんでした。彼らは(ほとんどの場合)正確に*_jsp.java
ファイルをTomcatの作業ディレクトリ内に生成し、* .classファイルへのコンパイルは期待通りに機能します。プロダクション設定で使用されていないレガシーコードではなく、ここで指定する価値がないためコードベースに残っています。
Tomcat 7、特に7.0.22に移動すると、予期しない動作が発生しました。大多数のJSPページは、作業ディレクトリに正確にコンパイルされます(.java
コードとその関連する.class
ファイル)。ただし、一部のファイルでは0バイトの.java
ファイルが生成されます。
この問題で私が最初に取ったのは、「TomcatのJSPコンパイルに関することが、2つのバージョン間で変更されました。 in the docsを突き止めた後、何も明らかに見えなかったので、私はattempted to pre-compile all the jsps using Antです。
は、これは非常に簡単なAntスクリプトを使用して、心配していた.javaファイルへの変換限りにおいて成功:<project name="myApp" default="all" basedir=".">
<import file="${tomcat.home}/bin/catalina-tasks.xml"/>
<target name="jspc">
<jasper
validateXml="false"
uriroot="${webapp.home}"
webXmlFragment="${webapp.home}/WEB-INF/generated_web.xml"
outputDir="${webapp.home}/WEB-INF/classes"
failonerror="false" />
</target>
<target name="all" depends="jspc">
</target>
</project>
*_jsp.java
ファイルが正しくjasperによって生成された、トラブルの原因となった0バイトのファイルがコンパイルされたときに この方法でTomcatが作業ディレクトリに正しくコンパイルしていました。 Tomcat 6の作業ディレクトリ*_jsp.java
ファイルと比較すると、若干の違いがありましたが、おそらくJSP spec version upgrade between 6 and 7に関連しているようです。残念ながら、従来のコードでは、結果として生じた.java
ファイルのいくつかは、一般に両方のバージョンで互換性がありません。 .java
〜.class
(.jsp
〜*_jsp.java
〜*_jsp.class
)とコンパイルするには、深いリファクタが必要です。したがって、私は真のJSPプレコンパイル戦略を追求することができません。 Tomcatはこれらのファイルをもっと知的に扱っているように見えますが、これはまったく驚くべきことではありません。
私の質問は、少し広がっています:tomcatが空の*_jsp.java
ファイルを作業ディレクトリに生成する原因は何ですか?当然、Tomcatがどのようなプロセスでそれらのファイルを作業ディレクトリに生成するのか、それはAntスクリプトを使ってファイルを生成する方法とどのように違いますか?私は、Tomcatの中核的な振る舞いをより深く理解することで、明白な解決策、説明可能な問題、または少なくとも「これは設計されています。リファクタリングしてください。
0バイトのファイルについてはわかりませんが、従来のコンパイルされていないJSPが使用されていない場合は、単に削除しないでください。そして、もしそれらが使われていたら、なぜそれらを修正しないのですか? –
私は削除しようとしている未使用の古いファイルです。他のものは古い[ベストプラクティスに従わないJSP](http://stackoverflow.com/a/3180202/877115)です。プレコンパイルはパフォーマンス上の理由から考えられますが、残念ながらリファクタリングは私の組織の初心者ではありません。 – Christopher
コンパイルするかコンパイルしないのですか?コンパイルしないと、リファクタリングは必要ありません。固定または削除する必要があります。プリコンパイルでコンパイルしないと、Tomcatでもコンパイルされません。 –