2012-01-19 136 views
5

Tomcat 6.0.24から7.0.23へのアップグレード中です。私はjspc mavenプラグインを使ってJSPをプリコンパイルするmaven 2.2.1プロジェクトを持っています。Tomcat 7のJSPがNoClassDefFoundErrorで失敗する:Lorg/apache/AnnotationProcessor

私は私のアプリのためのWARファイルをデプロイし、JSPを訪問しようとすると、私は次のエラーを取得する:

javax.servlet.ServletException: Error instantiating servlet class org.apache.jsp.my_jsp 
... 
root cause: 
java.lang.NoClassDefFoundError: Lorg/apache/AnnotationProcessor; 
    java.lang.Class.getDeclaredFields0(Native Method) 
    java.lang.Class.privateGetDeclaredFields(Class.java:2291) 
    java.lang.Class.getDeclaredFields(Class.java:1743) 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928) 
... 

私はJSPC仕事をするためにthis blog postからPOMのスニペットを借りて試してみましたTomcat 7、しかしこれは問題を修正していません。どうすればこの問題に対処できますか?正しい方向のポインタがあれば分かるはずです。

答えて

5

サブディレクトリPOMファイル(myproject-war/pom.xml)のJSPCプラグインへの別の参照がありました。 /pom.xmlとmyproject-war/pom.xmlの両方を修正するだけで問題を解決できました。ここでは、更新POMは、私が使用したスニペットです:

 <plugin> 
      <groupId>org.codehaus.mojo.jspc</groupId> 
      <artifactId>jspc-maven-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>jspc</id> 
        <phase>compile</phase> 
        <goals> 
         <goal>compile</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <inputWebXml>${basedir}/target/web.xml</inputWebXml> 
       <packageName>org.apache.jsp</packageName> 
       <source>1.5</source> 
       <target>1.5</target> 
       <trimSpaces>false</trimSpaces> 
      </configuration> 
      <dependencies> 
       <dependency> 
        <groupId>com.csc.aims</groupId> 
        <artifactId>aims-jar</artifactId> 
        <version>${project.version}</version> 
        <classifier>${env}</classifier> 
       </dependency> 
       <!-- 
        Hack the jspc plugin, which only supports Tomcat 6, to work for Tomcat 7. See: 
        http://hasini-gunasinghe.blogspot.com/2011/09/how-to-use-pre-compiled-jsps-in-webapp.html 
       --> 
       <dependency> 
        <groupId>org.codehaus.mojo.jspc</groupId> 
        <artifactId>jspc-compiler-tomcat6</artifactId> 
        <version>2.0-alpha-3</version> 

        <exclusions> 
         <exclusion> 
          <groupId>org.apache.tomcat</groupId> 
          <artifactId>jasper</artifactId> 
         </exclusion> 
         <exclusion> 
          <groupId>org.apache.tomcat</groupId> 
          <artifactId>jasper-el</artifactId> 
         </exclusion> 
         <exclusion> 
          <groupId>org.apache.tomcat</groupId> 
          <artifactId>jasper-jdt</artifactId> 
         </exclusion> 
         <exclusion> 
          <groupId>org.apache.tomcat</groupId> 
          <artifactId>servlet-api</artifactId> 
         </exclusion> 
         <exclusion> 
          <groupId>org.apache.tomcat</groupId> 
          <artifactId>jsp-api</artifactId> 
         </exclusion> 
         <exclusion> 
          <groupId>org.apache.tomcat</groupId> 
          <artifactId>el-api</artifactId> 
         </exclusion> 
         <exclusion> 
          <groupId>org.apache.tomcat</groupId> 
          <artifactId>annotations-api</artifactId> 
         </exclusion> 
        </exclusions> 
       </dependency> 

       <dependency> 
        <groupId>org.apache.tomcat</groupId> 
        <artifactId>tomcat-jasper</artifactId> 
        <version>${tomcat.version}</version> 
       </dependency> 

       <dependency> 
        <groupId>org.eclipse.jdt.core.compiler</groupId> 
        <artifactId>ecj</artifactId> 
        <version>3.5.1</version> 
       </dependency> 
      </dependencies> 
     </plugin> 

を加えて、各Tomcat依存性のたartifactIdが新しいバージョンに変更されているので、私は、私のTomcatの提供の依存関係を更新しなければならなかったが、例:

   <dependency> 
        <groupId>org.apache.tomcat</groupId> 
        <artifactId>tomcat-jasper</artifactId> 
        <version>${tomcat.version}</version> 
        <scope>provided</scope> 
       </dependency> 

の代わり:

   <dependency> 
        <groupId>org.apache.tomcat</groupId> 
        <artifactId>jasper</artifactId> 
        <version>${tomcat.version}</version> 
        <scope>provided</scope> 
       </dependency> 

(注意:tomcat.versionは私のメインのPOMで定義されたプロパティです):

<properties> 
    ... 
    <tomcat.version>7.0.23</tomcat.version> 
    ... 
</properties> 
+0

たぶん私はそれを得ることはできませんが、あなたのクラスパスにtomcat-jasperとjspcプラグインの除外のbuchを持つ目的は何ですか? – Zarathustra

0

クラスパスに必要なjarを含めていないようです。これは、JARファイルのリンクが示す以上

http://www.jarfinder.com/index.php/java/info/org.apache.AnnotationProcessor

はそれでクラスを持っていると私はそれがである参照カタリナ-6 *の.jar これが削除されたので、私は推測しています/非推奨/ Tomcatの中で更新7

このjarファイルをクラスパスに含めると、他の競合が発生したりアプリケーションの移植性に影響を与える可能性があります。

+0

のすべてjasper.jarを必要としないそうすれば、それは、Tomcat 6からライブラリファイルがストップギャップのアプローチとして、問題を解決する可能性がありますを含むように思えます。他の解決策が見つからない限り、私はそのコースを追求したくありません。私は、Tomcat 7用のJSPをコンパイルする "正しい"方法を理解したいと思っています。それが問題の原因であると仮定します。 – RMorrisey

1

私はEvalTag.jarので、同じ問題を抱えていました実行するorg.apache.AnnotationProcessorが必要

私の単純な修正は、自分のアプリケーションに直接インターフェイスを再作成することでしたイオン。私は同意するTomcatの6

package org.apache; 
import java.lang.reflect.InvocationTargetException; 
import javax.naming.NamingException; 

public interface AnnotationProcessor { 
    public void postConstruct(Object instance) throws IllegalAccessException, InvocationTargetException; 
    public void preDestroy(Object instance) throws IllegalAccessException, InvocationTargetException; 
    public void processAnnotations(Object instance) throws IllegalAccessException, InvocationTargetException, NamingException; 
} 
関連する問題