2009-06-04 15 views
7

私はJBoss 4.2のQAでこの厄介な振る舞いに襲いかかりました。私たちが生産に入り、他のコーナーケースを見つける前に、私はそれを芽の中に挟みたいと思います。JBoss 4.2でjspを強制的に再コンパイルできますか?

A JSP calles次のシグネチャを有していた方法

public void methodName(String arg) 

これをに変更した:

methodName("param"); 

public void methodName(String arg, Object... args) 

既存のJSPを介して、このメソッドを呼び出し

変更されたコードの展開では、JBossはJSPを再コンパイルしなかったため、QAがクラッシュしました。 jspに愚かなコメントを追加すると、問題が解決しました(JBossはJSPが変更され、再コンパイルされたことを認識しました)。

再起動時に強制的にJSPを再コンパイルする設定がJBossにはありますか?

EDIT:答えのいくつかの点を明確にするために、JSPは耳の一部である戦争の一部です。耳には瓶の中にあるすべてのクラスがあります。

jspがコンパイルを必要としているとシステムが思っていない場合、事前コンパイルの要望に関して、強制的に再コンパイルするでしょうか?そうは思われません。ここでのエラーは合併エラーではなく、(変更されたコードコードレベルではなく)バイトコードレベルのメソッドシグネチャであるため、メソッド呼び出しエラーです。

補足:私たちは、受け入れられた回答のフラグが設定されていても、JSPが実際に変更されたにもかかわらず、JSPが再コンパイルしなかったことに最近気付きました。主なバグはありますが、JBossは正常にシャットダウンしていました。現時点ではJBossの古いバージョンになっていますが、まだ使用している場合は、作業ディレクトリとtmpディレクトリの内容を削除することが確実です。

私は受け入れられた答えを変更していないのは、本当に質問が探していた点に到達したからです。 JBossのバグは別の問題です。

答えて

11

も参照してください。 warファイル内のJSPは、最後のデプロイ時のJBossコンパイルされたクラスファイルよりも新しいタイムスタンプを持っていませんか?そうでない場合は、展開する前にWAR/EARを構築する際にJSPに触れることができませんでした。 [私は手動で各JSPファイルに触れていない、Unixの "タッチ" コマンドを使用してを参照しています。]

また、$ JBOSSでDeleteWorkDirOnContextDestroy設定/サーバー/デフォルト/展開/のjboss-web.deployer/META-INF /jboss-service.xmlがあなたが探しているものかもしれません。デフォルトではfalseですが、必要に応じてtrueに設定することもできます。私は、再配置時にJSPのクラスファイルを削除して、各JSPの最初のアクセス時に再作成する必要があると思います。

詳細はhttps://jira.jboss.org/jira/browse/JBAS-3358を参照してください。

+1

素晴らしい!私はそれが動作することを確認し、答えを受け入れるかどうかを確認します。 – Yishai

+5

+1ありがとう! JBoss 5.1.0GAに注意するだけで、同等のファイルは$ JBOSS/server/default/deplyers/jbossweb.deployer/META-INF/war-deployers-jboss-beans.xml –

+1

ありがとう、これはjspの変更で問題を解決しました配備後に反映されませんでした。 –

1

設定はわかりませんが、JBossインスタンスの作業ディレクトリで生成されたJavaクラスファイルを削除すると、次に呼び出されるときにJSPが再コンパイルされます。

+1

ありがとうございます。しかし、実際の運用環境ではそれは難しいでしょう。 – Yishai

1

コンパイルされたJSPが格納されている "tmp"および/または "work"ディレクトリを明示的に削除するようにJBossの起動スクリプトを変更できます。 JBossは、それらをすべて再コンパイルする以外に選択肢はありませんでした。

微妙ではありませんが、仕事をします。

0

ビルド時にすべてのjspをプリコンパイルすることをお勧めします。これは、コンパイルエラーをすばやく警告します。

これを実際に行うこともできます。最初のアクセスを高速化することができますが、何よりもQAのステップでこれをもっと必要とする気がします。その場合、プリコンパイル・ステップを、選択したビルド・ツールのテスト・フェーズに追加して、CI環境に追加することもできます。これは、コンパイルしないjspがテストを終了しないという保証を提供します。

Jboss Jasper configuration

・ホープ、このことができます:

は、プリコンパイルタスクの実行の詳細については、これを参照してください。

+0

ありがとう、私たちは実際にこれを行います。問題は、ビルドスクリプトがきれいに準拠していることです。きれいなコンパイルでは、この例は問題ありません。ここでの問題は、元のJSPが変更されずに動作するように再コンパイルする必要があり、再コンパイルは機能しますが、JSPは再コンパイルなしでは動作しません。 – Yishai

+0

ビルド時にこのエラーが見つからないほど十分です。プロダクションでのプリコンパイルを検討しましたか? – Pablojim

+0

プロダクションでどのようにプリコンパイルしますか(どの設定を使用しますか)。すべてを再コンパイルしますか? – Yishai

0

一部のJSPコンテナ(JSP 1.2仕様のセクション8.4.2)は、JSPページをプリコンパイルする機能をサポートしています。 JSPページは実行されません?のjsp_precompile

http://hostname.com/mywebapp/mypage.jsp?jsp_precompile 

のクエリ文字列をページにアクセスし、JSPページをプリコンパイルするには

。コンテナがプリコンパイルをサポートしている場合は、必要に応じてJSPページがコンパイルされます。 JSPはjarファイルとして展開されているEARの一部であり、WARの一部である場合

はあなたのJSPが再コンパイルされていない理由を、私は明確ではないよ、http://www.rgagnon.com/javadetails/java-0414.html

0

パブロジムは正しい方向にあります。何が起こっているのかを完全に把握するには、さらに詳しい情報が必要です。ここで私はそれを理解する方法です。

prodでは、他のjspを再コンパイルする必要があるjspを変更しました。それらを再コンパイルするには、2つのうちの1つを実行する必要があります。

  1. jspのコンパイル済みバージョンを削除する必要があります。
  2. JSP自体を変更する必要がある(またはそれが「感動」だ場合でも - 更新日時が更新される)

あなたはまだ、すべてのJSPが動作することを確認する必要がある場合、それらはすべてprecompiled using an ant taskする必要があります。これにより、warファイルにプリコンパイルされたjspを含むwarファイルをデプロイすることもできます。これはあなたの問題を解決するはずです。

ファイルがwarファイルに展開されていないものの、展開された形式のファイルの場合は、展開用のwarファイルにseriously consider packaging your web appを含める必要があります。これは、環境間で展開するための素晴らしいパッケージになります。

+0

これは戦争中にデプロイされ、プリコンパイルで検証されますが、プリコンパイルの結果は破棄されるだけなので、JBossは再コンパイルに関する独自の決定を下しており、この場合は十分に攻撃的ではありません。 – Yishai

関連する問題