JBoss 4.2 で jsps の再コンパイルを強制するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/952309

  •  11-09-2019
  •  | 
  •  

質問

QA で JBoss 4.2 のこの厄介な動作に気付きました。本番環境に入る前に、この問題の芽を摘み取り、他の例外的なケースを見つけたいと考えています。

JSP は、次のシグネチャを持つメソッドを呼び出します。

 public void methodName(String arg)

これは次のように変更されました。

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

既存の JSP は、次の方法でこのメソッドを呼び出しました。

 methodName("param");

変更されたコードのデプロイメント時に、JBoss は JSP を再コンパイルしなかったため、QA でクラッシュが発生しました。JSP に愚かなコメントを追加すると、問題が修正されました (JBoss は JSP が変更されたことを認識し、それを再コンパイルしました)。

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

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

プリコンパイルしたいという要望に関して、システムが JSP にコンパイルが必要ないと考えている場合、プリコンパイルは再コンパイルを強制しますか?そうではないようです。ここでのエラーはコンパイル エラーではなく、メソッド シグネチャ (実際にはコード レベルではなくバイト コード レベルで) が「変更された」ためのメソッド呼び出しエラーです。

補遺:最近実稼働環境で、受け入れられた回答のフラグが設定されていても、実際には JSP が変更されたにもかかわらず、JSP が再コンパイルされないことを経験したことに注意してください。重大なバグがありましたが、それにもかかわらず、JBoss は正常にシャットダウンされました。現時点では JBoss の古いバージョンになりつつありますが、まだ使用している場合は、work ディレクトリと tmp ディレクトリの内容を削除することが確実な唯一の方法です。

質問が求めていたことの核心を突いているという理由だけで、受け入れられた回答を変更するつもりはありません。JBoss のバグは別の問題です。

役に立ちましたか?

解決

JSP が、jar としてデプロイされている EAR の一部である WAR の一部である場合、JSP が再コンパイルされない理由がわかりません。war ファイル内の JSP には、前回のデプロイ時に JBoss でコンパイルされたクラス ファイルよりも新しいタイムスタンプが付いていませんか?そうでない場合は、デプロイする前に WAR/EAR の構築の一環として JSP に触れることはできないでしょうか。[各 JSP ファイルを手動でタッチするのではなく、Unix の「タッチ」コマンドを使用することを指します。]

あるいは、$JBOSS/server/default/deploy/jboss-web.deployer/META-INF/jboss-service.xml の DeleteWorkDirOnContextDestroy 設定が探しているものになる可能性があります。デフォルトでは false ですが、true に設定することが必要な場合があります。これにより、再デプロイ時に JSP のクラス ファイルが削除され、各 JSP の最初のアクセス時に再作成されるようになると思います。

見る https://jira.jboss.org/jira/browse/JBAS-3358 詳細については。

他のヒント

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

JBoss 起動スクリプトを変更して、コンパイルされた JSP が保存されている「tmp」ディレクトリまたは「work」ディレクトリ、あるいはその両方を明示的に削除できます。その場合、JBoss にはすべてを再コンパイルする以外に選択肢はありません。

微妙ではありませんが、機能します。

1 つのオプションは、ビルド時にすべての JSP をプリコンパイルすることです。これにより、コンパイル エラーにすぐにフラグが立てられます。

これを実稼働環境で行うこともでき、最初のアクセスを高速化できますが、他の何よりも QA ステップとしてこれを望んでいるように感じます。その場合は、選択したビルド ツールのテスト フェーズにプリコンパイル ステップを追加し、CI 環境にも追加できます。これにより、コンパイルできない JSP がテストから外されないことが保証されます。

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

Jboss Jasper の設定

お役に立てれば。

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

JSP ページをプリコンパイルするには、クエリ文字列 ?jsp_precompile を使用してページにアクセスします。

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

JSP ページは実行されません。コンテナーがプリコンパイルをサポートしている場合、JSP ページは必要に応じてコンパイルされます。

こちらも参照 http://www.rgagnon.com/javadetails/java-0414.html

パブロジムは正しい道を進んでいる。何が起こっているのかを完全に把握するには、さらに情報が必要です。私はこう理解しています。

prod で、他の JSP の再コンパイルが必要な JSP を変更しました。再コンパイルするには、次の 2 つのうちのいずれかが起こる必要があります。

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

すべての jsps が機能することを確認する必要がある場合は、すべてを次のようにする必要があります。 Ant タスクを使用してプリコンパイルされる. 。これにより、war ファイル内のプリコンパイルされた jsps を使用して war ファイルをデプロイすることもできます。これで問題は解決するはずです。

ファイルが war ファイルではなく、展開された形式でデプロイされている場合は、次のようにする必要があります。 Web アプリのパッケージ化を真剣に検討してください デプロイメント用の war ファイル内。これにより、環境間でデプロイするのに適したパッケージになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top