次のエラーが表示されます。
情報:validateJarFile(C:\ dev\server\Tomcat6\webapps Sempedia\WEB-INF\lib\servlet-api.jar)-jarがロードされていません。サーブレット仕様2.3、sectoin 9.7.2を参照してください。問題のあるクラス:javax/servlet/Servlet.class
既存のリソースは、servlet.jarまたは私の場合はservlet-api.jarファイルとの競合が原因であると言っています。/webappsフォルダーから他のすべてのプロジェクトを削除しました。Tomcat6/ libディレクトリーにあるservlet-api.jarファイルを取得し、それだけをプロジェクトのビルドパスに追加したので、どのように表示されるかわかりませんまだ対立です。
アプリケーションを実行しようとすると、次のスタックトレースが表示されます。
org.Apache.jasper.JasperException:JSPのクラスをコンパイルできません:
次の行でエラーが発生しました:生成されたJavaファイルで22メソッドgetJspApplicationContext(ServletContext)はJspFactory型に対して未定義です
スタックトレース:
org.Apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.Java:92)org.Apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.Java:330)org.Apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler。 Java:439)org.Apache.jasper.compiler.Compiler.compile(Compiler.Java:334)org.Apache.jasper.compiler.Compiler.compile(Compiler.Java:312)org.Apache.jasper.compiler.Compiler。 compile(Compiler.Java:299)org.Apache.jasper.JspCompilationContext.compile(JspCompilationContext.Java:586)org.Apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.Java:317)org.Apache.jasper.servlet。 JspServlet.serviceJspFile(JspServlet.Java:342)org.Apache.jasper.servlet.JspServlet.service(JspServlet.Java:267)javax.servlet.http.HttpServlet.service(HttpServlet.Java:717)
これはクラスパス汚染の兆候です。 JSP/Servlet APIライブラリはappserver実装に依存し、Tomcat 6の場合はTomcat/lib
フォルダーに属し、no wayに移動する必要があります他のどこにも複製されませんでした。あなたが今遭遇したように、移植性の問題とクラスローディングの衝突のレシピです。 webappのライブラリは、クラスローディングで優先されます。そこにservlet-api.jar
が見つかった場合、その依存関係を順番に探していますが、明らかにそこにありませんでした。
WebappのWebapp/WEB-INF/lib
からappserver固有のライブラリを削除する必要があります。 onlyにwebapp固有のライブラリを配置する必要があります。アプリサーバー固有のライブラリをアプリサーバーのデフォルトのクラスパスに保持します。これは、あなたのケースではTomcat/lib
です。そのままにしてください。そこにあるすべてのwebappで共有したいライブラリを追加することができます。さらに良いことに、そのためにshared.loader
でTomcat/conf/catalina.properties
を設定できます。
また、JDK/lib
およびJRE/lib
フォルダーからappserver固有およびwebapp固有のライブラリーを削除します(存在する場合)。 「そうでなければコンパイルしない」ために、ライブラリをそこに移動/コピーするスターターがいることを頻繁に見ました。そこに非JRK/JRE固有のライブラリを決してコピーしないでください。移植性トラブルのレシピでもあります。 javac
を使用してクラスをコンパイルする場合、-cp
引数を使用して依存ライブラリを指定する必要があります。
Update:IDEの場合(「ビルドパス」について話しているときに使用するようです) )、Webプロジェクトをアプリケーションサーバーに関連付ける必要がありますたとえば、Eclipseでは、Dynamic Web Projectの作成中にそれを行うオプションがあります。プロジェクトを作成する前にEclipseのサーバーインスタンス。Servers
ビューを使用してそれを行うことができます(Eclipse for Java[〜#〜] ee [〜#〜]開発者、それ以外はアップグレード)。プロジェクトプロパティのServersエントリ。「デフォルト」サーバーとして使用するものを選択すると、そのライブラリが自動的にプロジェクトのビルドパスに含まれます。まったく必要はありません。他の場所にコピー/移動します。 Eclipseプロジェクトにjavax.servlet APIをインポートするにはどうすればよいですか
他の答えが言うように、これはWARにサーブレットAPIクラスが含まれているためですが、そうすべきではありません。
Mavenを使用してプロジェクトをビルドする場合は、コンパイルおよびテスト時にサーブレットAPIを使用可能にするようにMavenに指示しますが、WARには含めません。 依存関係スコープに関するMavenドキュメント が述べているように、サーブレットAPIにはprovided
スコープを使用する必要があります。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
依存関係の一部がコンパイル依存関係としてサーブレットAPIを取り込む場合、サーブレットAPIを推移的依存関係として明示的に除外する必要がある場合もあります。
<dependency>
<groupId>com.example</groupId>
<artifactId>frob-driver-core</artifactId>
<version>1.0.1</version>
<exclusions>
<exclusion>
<artifactId>servlet-api</artifactId>
<groupId>javax.servlet</groupId>
</exclusion>
</exclusions>
</dependency>
Webコンテナによって提供されるサーブレット仕様で定義されているクラスをオーバーライドするクラスをデプロイすることはできません。仕様は次からダウンロードできます。
http://www.jcp.org/aboutJava/communityprocess/final/jsr053/
自分で確認してください。セクション9.7.2は物理ページ63にあります。
サーブレット2.3は、Tomcatの古いバージョンを示すかなり古いバージョンです。新しいものを使用しない特別な理由はありますか?
最初に表示されたエラーメッセージは、Tomcatがサーブレットjarを既にロードしており、競合を回避するためにサーブレットjarをロードする必要がないためです。
通常、警告は安全に無視できます。表示したくない場合は、Tomcatのサーブレットjarを使用するのではなく、プロジェクトからサーブレットjarを移動する必要があります。 Tomcatを1つ取り出してプロジェクトに入れることで、TomcatがWebアプリケーションからロードするのではなく、Webアプリケーションからロードするように説得し、BalusCの回答に記載されているクラスローダーの問題を引き起こしています。
編集:上記の内容は、サーブレットAPI jarをTomcatからWebアプリケーション(および属性BalusC)に入れたときに何が起こっているかを明確にするために編集されました。
実際、このようなエラーとアプリがありました。何らかの理由でWEB-INF/lib
のjarの一部が.JAR
ではなく.jar
(大文字)拡張子を持っているため、開始できませんでした。したがって、すべてのjarが有効であることを確認してください。
除外およびprovided
依存関係は子プロジェクトでは機能しません。
Mavenプロジェクトで継承を使用している場合、must親にこの構成を含めるpom.xml
ファイル。 <parent>...</parent>
セクションのpom.xml 継承を使用している場合。そのため、親にこのようなものがありますpom.xml
:
<groupId>some.groupId</groupId>
<version>1.0</version>
<artifactId>someArtifactId</artifactId>
<packaging>pom</packaging>
<modules>
<module>child-module-1</module>
<module>child-module-2</module>
</modules>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
</dependencies>