web-dev-qa-db-ja.com

Tomcat 7およびJSTL

Eclipse Tomcatを使用してWebアプリケーションを作成しましたが、Tomcat 7でオンラインで公開しようとしたときに、ローカルTomcat 7で動作し、次のエラーが発生しました。

SEVERE:パス[/ cp]を含むコンテキストのサーブレット[obliquid.servlet.Index]のServlet.service()が例外をスローしました[絶対URI:http://Java.Sun.com/jsp/jstl/core web.xmlまたはこのアプリケーションでデプロイされたjarファイルのいずれでも解決できません]

Tomcat 7には「仕様バージョン:サーブレット3.0、JSP 2.2、EL 2.2」があるため、JSTLは含まれていませんか?

Standard.jarとjstl.jarをアップロードしようとしたときに、次のエラーが発生しました。

org.Apache.jasper.JasperException:/jsp/index.jsp(行:3、列:62)JARファイル "jndi:/ localhost/cp/WEB-INF"からTLD "META-INF/c.tld"を読み取れません/lib/standard.jar ":org.Apache.jasper.JasperException:TagLibraryValidatorクラスのロードまたはインスタンス化に失敗しました:org.Apache.taglibs.standard.tlv.JstlCoreTLV

私はいくつかのグーグルを行いましたが、それを整理することはできませんでした。たぶん、それらのjarを含めて、別のJSTL URLを使用するべきではありませんか?私のものはJSTL 1.1用です。JSTL1.2用の新しいURLはありますか?

問題を解決してこのアプリケーションを実行するにはどうすればよいですか?

44
stivlo

TomcatにはJSTLが含まれていません。

Jstlおよび標準jarをWEB-INF/libに配置し(これを実行した)、それらを読み取るためのアクセス許可があることを確認する必要があります(chmod)

URIは正しく、機能するはずです(ここで機能します)

45
Bozho

私はこれと数時間戦ってきました。完全なソリューションを次に示します。

  1. サーブレット3.0準拠のサーバーであるTomcat 7を使用しています。

  2. Servlet 3.0仕様を使用する場合は、次のようにweb.xmlが必要です。

    <web-app 
      xmlns="http://Java.Sun.com/xml/ns/javaee" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee
      http://Java.Sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> 
    
  3. Mavenを使用している場合、pom.xmlにこれらの行が含まれている必要があります。

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.0.1</version>
        <scope>provided</scope>
    </dependency>
    
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
    
    <dependency>
        <groupId>org.glassfish.web</groupId>
        <artifactId>jstl-impl</artifactId>
        <version>1.2</version>
        <exclusions>
            <exclusion>
                <artifactId>servlet-api</artifactId>
                <groupId>javax.servlet</groupId>
            </exclusion>
            <exclusion>
                <artifactId>jsp-api</artifactId>
                <groupId>javax.servlet.jsp</groupId>
            </exclusion>
            <exclusion>
                <artifactId>jstl-api</artifactId>
                <groupId>javax.servlet.jsp.jstl</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    

    これらの依存関係は非常に重要です。 JSTL 2.1 + Tomcat 7 + Servlet 3.0は、これらの行、特に除外部分を使用して修正しない限り、非常に壊れています。何が起こっているのかというと、JSTL 2.1ジャーは実際には間違ったバージョンのサーブレット仕様(2.5)を取り入れています。それが起こるのを止めない限り、あなたは痛みの全世界にいるでしょう。 これらの洞察についてのMur。Todd Williams氏 への特別な感謝。

  4. 最後に、MavenがそれらのJARを見つけられない場合、プロジェクトに3つのJARを含め、通常のProject-> Properties-> Java Build Path and include Mavenがその方法で処理する必要があります。

    javax.servlet-api-3.0.1.jar
    javax.servlet.jsp.jstl-1.2.1.jar
    javax.servlet.jsp.jstl-api-1.2.1.jar
    
  5. ご注意ください!この正確な構成は、次の魔法の組み合わせを使用している場合にのみ適用されます。

    1. Tomcat 7などのサーブレット3.0準拠のアプリケーションサーバー

    2. Web.xmlには、Servlet 3.0仕様に適した名前空間があります

    3. これらの3つのJARがあり、クラスパスに他のJSTLまたはサーブレットJARはありません。

  6. これらのJARのコピーをWEB-INF/libディレクトリに配置しないでください。その場合、これらのJARはサーバーに送信され、LinkageErrorsが発生します。

  7. JSPでは、このPRECISE行を正確にフォーマットする必要があります。そうしないと、Eclipseはc:blahタグを認識しないようになります。

    <%@taglib uri="http://Java.Sun.com/jsp/jstl/core" prefix="c" %>
    
  8. なんとピタ!これは、JSTLの他のどのバージョンよりも実装が非常に困難です。これは、後の反復で単純化するのではなく、はるかに複雑化する何かの唯一の例です。

54
Tom Hunter

UriはJSTL 1.2に適しています。次の2つのことを行う必要があります。

web.xmlを変更して、最新のWebアプリバージョンを使用します。

これは、このバージョンまたはそれ以降のバージョンのように見えるはずです。

<?xml version="1.0" encoding="UTF-8"?>
<web-app 
    xmlns="http://Java.Sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    version="3.0">

次に、コードに正しいバージョンのjstl jarを追加します。 1.2の場合、それらをダウンロードできます こちら

これにより、2つのjarが提供されます。

  • jstl-api.jar
  • jstl-impl.jar

旧バージョンのstandard.jarおよびjstl.jarの代わりにこれらを使用します。

これがどのように機能するかをお知らせください。

14
VikC

Apache Tomcat 7で実行するには、これらをPOMに追加することがおそらく適切です。これらのjarは、glassfishのようにjavax.servlet jarを参照しないため、除外する必要はありません。

<dependency>
    <groupId>org.Apache.taglibs</groupId>
    <artifactId>taglibs-standard-spec</artifactId>
    <version>1.2.1</version>
</dependency>
<dependency>
    <groupId>org.Apache.taglibs</groupId>
    <artifactId>taglibs-standard-impl</artifactId>
    <version>1.2.1</version>
</dependency>
5
K.Nicholas

Tomcatの場合、JSTL 1.1.2にはより簡単な依存関係ソリューションがあります。

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <!-- Apache Taglibs does not implement version 1.2 -->
    <version>1.1.2</version>
  </dependency>
  <dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
    </dependency>
  <dependency>
    <groupId>taglibs</groupId>
    <artifactId>c</artifactId>
    <version>1.1.2</version>
    <type>tld</type>
  </dependency>
  <dependency>
    <groupId>taglibs</groupId>
    <artifactId>fmt</artifactId>
    <version>1.1.2</version>
    <type>tld</type>
  </dependency>
<dependency>

詳細については、 here を参照してください(個人ブログ)。

REM:要求に応じて、Tomcatで使用できるようにJSTL依存関係を含める必要があります。ただし、バージョン1.1.2(TomcatのようにApacheによって提供される)も仕事をするため、バージョン1.2は実際には必要ありません。その唯一の要件はサーブレット2.4とJSP 2.2であり、OPはサーブレット3.0とJSP 2.0に言及していますが、これで十分です。

0

この問題に対処するときにMavenを使用する場合にこの問題を解決する方法に関しては、ほとんど正しい2つの回答があります。ただし、両方とも完全に完全ではありません。

@ Tom Hunterの回答ごとの除外の使用

この答えは機能します。ただし、重複したTLD定義に関するTomcatからのログメッセージは引き続き存在します。これは、jstlアーティファクトとjstl-implアーティファクトの両方にTLD定義が含まれているためです。これらのメッセージを削除するには、Mavenのより良いセットアップがこれだと思います。

<dependency>
    <version>1.2</version>
    <scope>runtime</scope>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>jstl-api</artifactId>
    <exclusions>
        <exclusion>
            <artifactId>servlet-api</artifactId>
            <groupId>javax.servlet</groupId>
        </exclusion>
        <exclusion>
            <artifactId>jsp-api</artifactId>
            <groupId>javax.servlet.jsp</groupId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>jstl-impl</artifactId>
    <version>1.2</version>
    <scope>runtime</scope>
    <exclusions>
        <exclusion>
            <artifactId>servlet-api</artifactId>
            <groupId>javax.servlet</groupId>
        </exclusion>
        <exclusion>
            <artifactId>jsp-api</artifactId>
            <groupId>javax.servlet.jsp</groupId>
        </exclusion>
        <exclusion>
            <artifactId>jstl-api</artifactId>
            <groupId>javax.servlet.jsp.jstl</groupId>
        </exclusion>
    </exclusions>
</dependency>

これには、残りの回答で説明されている問題を回避するために必要な除外を含むjstl apiクラスのみが含まれます。

@ George's answerごとに新しいPOMバージョンを使用する

それを実現するのにしばらく時間がかかりましたが、JSTL pomの新しいバージョンが利用可能です。これらの新しいパッケージは類似しているがわずかに異なる命名規則を使用しているため、非常に混乱しています。これらの新しいバージョンでは、javax.servlet、javax.jspなどの依存関係を提供されたスコープとしてマークするため、除外する必要はありません。 1.2.1バージョンは、jstl-apiの1.2.1バージョンに依存しています。したがって、この上記の答えと同様に機能します:

<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>javax.servlet.jsp.jstl</artifactId>
    <version>1.2.1</version>
    <scope>runtime</scope>
</dependency>

これは、スコープをランタイムに変更したため、ジョージの答えとは少し異なります。 Georgeは提供されたスコープを指定しました。提供されたスコープでは、jarファイルをTomcat libディレクトリに手動でコピーするか、必要な実装を他の依存関係に含める必要があります。

ただし、Maven Central、jboss repoでimplの1.2.1バージョンが見つかりませんでした、またはその他のリポジトリ。私は最終的に円を巡回し、ついにローカルファイルベースのレポを使用してjarを保存しました。依存関係とjarは次のとおりです。

0
kaliatech

これらはどれもうまくいきませんでした。Mavenを使用してJARファイルを直接追加せずにプロジェクトを作成しただけです。

0
CommonCoreTawan