19

Linux(java 1.6.x)上のtomcat7.0.23にmaven3.0.3ビルドWebアプリケーションをデプロイし、ログインページにクレデンシャルを投稿してアクセスすると、次のエラーが発生しました。pom.xmlは、サーブレット2.5、jsp 2.1、およびJSTL1.2を参照します。

なぜこのエラーが発生するのですか?それを避けるために私は何ができますか?

同じTomcatインスタンスに他の.warファイルをデプロイしましたが、これらのアプリでこの問題に直面したことはありません。

http GETを実行した最初のJSP(login.jsp)はエラーをスローしませんでした。1番目のJSPから2番目のJsp(ChLogin.jsp)へのPOSTで問題が発生しました。

===========================

根本的な原因

java.lang.VerifyError: (class: org/apache/jsp/ChLogin_jsp, method: _jspService signature: (Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V) Inconsistent stack height 0 != 1
    java.lang.Class.getDeclaredConstructors0(Native Method)
    java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)
    java.lang.Class.getConstructor0(Class.java:2699)
    java.lang.Class.newInstance0(Class.java:326)
    java.lang.Class.newInstance(Class.java:308)
    org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:172)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

UPDATE1webapp
のWEB-INF\libには、サーブレット、jsp、またはJSTLjarが含まれていません。多くのアプリケーションの依存関係とSpringjarが含まれています(Spring MVCを使用しています)。

UPDATE2JSP
はプリコンパイルしません。しかし、それは別の日の目標です。

UPDATE3
この問題はtomcat7.0.12、7.0.14、7.0.16にはなく、7.0.19から始まっていることがわかりました。Tomcatユーザーのメーリングリストに投稿されました。おそらくEclipseJDTコンパイラに問題があるという返信がありました。tomcat 7.0.23 /27のコンパイラーをtomcat7.0.16のJDTコンパイラーとLO&BEHOLDに置き換えることで、実際にそうであることを確認しました。すべて問題ありません。Eclipse JDTコンパイラーチーム(存在する場合)に書き込み、このエラーについて投稿する予定です。

4

6 に答える 6

11

このエラーは、JSPが特定のサーブレット/ JSP / JSPL実装用にコンパイルされているが、TomcatがClassPathで使用可能な他の実装/バージョンでコンパイルされたクラスをロードしようとしていることを意味します。

これはおそらく、WARにサーブレット、jsp、jstl API、および/または実装を含むjarファイルが含まれているために発生します。使用されているバージョンはTomcat5.5の実装と一致しているため、そこでは機能しますが、最近の実装では失敗します。

そのjarをWARから除外するには、MavenPOMでそのような依存関係のスコープをに設定する必要があります。providedWEB-INF/lib

オンザフライでコンパイルされたコードが代替の依存関係をロードしないことを検証するには、Tomcatをで実行する必要があります-verbose:class。エラーの前の最新の行は、何が悪いのかを推測するのに役立つ場合があります。

更新2012/05/30jasperまたはjavax.elまたはel-apijarが入って いますWEB-INF/libか?もしそうなら、それ/それらも削除します。

使用したtaglibがTomcat5.5サーブレット2.3API用に特別にコンパイルされ、Tomcat7で機能しなくなる可能性もあります。

于 2012-04-02T20:47:08.183 に答える
4

エラーは非常に明白です。バイトコードを作成するジャスパーにバグがあります。生成されたコードはスタックフレームを適切にクリアしませんInconsistent stack height 0 != 1

コードをシャッフルし、メソッドに分割し、行をあちこちに移動しようとすると、バグがなくなる可能性があります。また、web.xml(通常はconfのどこかにある)からjspサーブレット(* .jspに一致)の関連情報を投稿して、コンパイラーパラメーターをチェックできますか?

于 2012-05-27T18:10:39.677 に答える
2

Split Verifierを無効にしてみましたか? -XX:-UseSplitVerifier

JVMオプションのリファレンスは次のとおりです 。http ://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

Java7とVerifyErrorに似たものを見てきました。

于 2012-04-26T00:43:40.140 に答える
1

クラスパスを出力してみてください(System.out.println("java.class.path");)tomcat5とtomcat7のクラスパスを比較します。クラスパスの違いを確認してください。

于 2012-05-02T12:23:22.033 に答える
0

これは、Tomcat 6.0.35で、次の1つのjspページでのみ発生しました。

<jsp:forward page="/sindicato/consultaServidor.jsp"/>

解決策は、jspタグをjstlタグに置き換えることでした。

<c:redirect url="/sindicato/consultaServidor.jsp"/>

そして、理由を聞かないでください!そのjspタグ(jsp:forward)を持つjspページがもっとあるので、問題はありません。

于 2012-07-25T15:19:25.027 に答える
0

java.lang.VerifyError:

簡単W/A

これは、Tomcatコンパイラが組み込まれているためです。

EclipseJDTのJavaコンパイラがデフォルトのコンパイラとして含まれています。これは、Tomcatクラスローダーからすべての依存関係をロードする高度なJavaコンパイラであり、数十のJARを含む大規模なインストールでコンパイルする場合に非常に役立ちます。高速サーバーでは、これにより、大きなJSPページでも1秒未満の再コンパイルサイクルが可能になります。

このような問題が発生した場合は、以下の回避策に従ってください

以前のTomcatリリースで使用されていたApacheAntは、lib / ecj-*。jarファイルを削除し、最新のAntディストリビューションからant.jarファイルとant-launcher.jarファイルを配置するだけで、新しいコンパイラの代わりに使用できます。 libフォルダーにあります。

于 2016-03-25T09:33:41.983 に答える