Tomcat 7 i JSTL

Napisałem aplikację internetową z Eclipse Tomcat i działa ona na moim lokalnym Tomcat 7, kiedy próbowałem opublikować ją online na Tomcat 7, miałem następujący błąd:

: Servlet.service() dla servleta [obliquid.servlet.Index] w kontekście ze ścieżką [/cp] wyrzucił wyjątek [bezwzględny uri: http://java.sun.com/jsp/jstl/core nie może być rozwiązany w żadnej z sieci.xml lub pliki JAR wdrożone w tej aplikacji]

Tomcat 7 ma "wersje Spec: Servlet 3.0, JSP 2.2, EL 2.2", więc JSTL nie jest wliczony?

Kiedy próbowałem wgrać standard.jar i jstl.jar miałem następujący błąd:

Org.Apacz.jasper.JasperException: / JSP / index.JSP (linia: 3, kolumna: 62) Nie można odczytać TLD "META-INF/c.tld" z pliku JAR "jndi:/localhost/CP/WEB-INF/lib/standard.jar": org.Apacz.jasper.JasperException: nie udało się załadować lub utworzyć instancję klasy TagLibraryValidator: org.Apacz.taglibs.standard.tlv.JstlCoreTLV

Trochę wygooglowałem, ale nie mogłem tego uporządkować, niektórzy mówili może to być spowodowane sprzecznymi wersjami słoików. Może nie powinienem dołączać tych słoików i używać innego adresu URL JSTL? Mój jest dla JSTL 1.1 myślę, czy jest nowy URL dla JSTL 1.2?

Co zrobić, aby rozwiązać problem i uruchomić aplikację?

Author: Jarrod Dixon, 2011-05-23

9 answers

Tomcat nigdy nie włączył JSTL.

Powinieneś umieścić JSTL i standardowe Jary w WEB-INF/lib (już to zrobiłeś) , i upewnij się, że masz uprawnienia do ich odczytu (chmod)

Twój URI jest poprawny i powinien działać (działa tutaj)

 44
Author: Bozho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-23 08:23:47

Walczę z tym od kilku godzin. Oto kompletne rozwiązanie.

  1. Używam Tomcat 7, który jest serwerem zgodnym z Servletem 3.0.

  2. Jeśli chcesz używać specyfikacji Servlet 3.0, musisz mieć swoją sieć.xml w następujący sposób:

    <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. Jeśli używasz Mavena, Twój pom.xml powinien mieć te linie.
    <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>
    

    Te zależności są bardzo ważne. JSTL 2.1 + Tomcat 7 + Servlet 3.0 jest bardzo zepsuty, chyba że naprawisz go za pomocą te linie, zwłaszcza część wykluczająca. Dzieje się tak, że JSTL 2.1 faktycznie ściąga złe wersje Servlet spec--2.5. Jeśli tego nie powstrzymasz, będziesz w całym świecie bólu. Specjalne podziękowania dla Pana Murraya Todda Williamsa za te spostrzeżenia .

  4. Na koniec, jeśli Maven nie może znaleźć tych słoików, możesz uszczęśliwić Eclipse, dodając trzy słoiki do swojego projektu i wykonując zwykły projekt--> właściwości-- > Java Build Ścieżka i włącz je w ten sposób - choć Maven powinien się tym zająć.
    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. Uwaga! Ta dokładna konfiguracja ma zastosowanie tylko wtedy, gdy używasz magicznej kombinacji:

    1. Serwer aplikacji zgodny z Servletem 3.0, taki jak Tomcat 7

    2. Twoja sieć.xml ma odpowiednią przestrzeń nazw dla Servlet 3.0 spec

    3. Masz te trzy słoiki i nie ma innych słoików JSTL ani Servlet na swojej ścieżce klasowej.

  6. Marka na pewno nie umieszczasz kopii tych słoików w swoim katalogu WEB-INF / lib, ponieważ w takim przypadku zostaną one wysłane na serwer powodując tym samym linkowanie.

  7. W Twoim JSP, musisz mieć tę dokładną linię, sformatowaną dokładnie tak, jak ja, bo inaczej Eclipse będzie narzekać, że nie rozpoznaje znaczników c: blah:

    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    
  8. Co za pita! Jest to o wiele trudniejsze do wdrożenia niż jakakolwiek inna wersja JSTL. To jedyny przykład tego, że coś staje się dużo bardziej skomplikowane niż prostsze w późniejszych iteracjach.

 54
Author: Tom Hunter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-28 22:17:05

Twój uri jest poprawny dla JSTL 1.2. Musisz zrobić dwie rzeczy:

Zmień swoją web.xml, Aby korzystać z najnowszej wersji aplikacji internetowej.

Powinno wyglądać coś takiego lub późniejsza wersja;

<?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">

Po Drugie umieść poprawną wersję JSTL jars w swoim kodzie. Dla wersji 1.2 możesz je pobrać tutaj .

To powinno dać ci dwa słoiki:

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

Użyj tych, zamiast standard.jar i jstl.jar, które były dla poprzednia wersja.

Daj nam znać, jak to działa dla Ciebie.
 15
Author: VikC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-28 22:18:44

Do uruchamiania na Apache tomcat 7 dodanie ich do POM jest prawdopodobnie odpowiednie. Te słoiki nie odwołują się do javaxa.słoiki servlet jak te glassfish, więc nie ma potrzeby wykluczania.

<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>
 4
Author: K.Nicholas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-23 17:40:52

Dla Tomcat istnieje prostsze rozwiązanie zależności dla 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>

Zobacz tutaj Po Więcej Szczegółów (osobisty blog).

Rem: Więcej Szczegółów zgodnie z życzeniem, należy uwzględnić zależności JSTL, aby były dostępne w Tomcat. Jednak Wersja 1.2 nie jest tak naprawdę potrzebna, ponieważ Wersja 1.1.2 (dostarczana przez Apache, podobnie jak Tomcat) również wykonuje to zadanie. Jego jedynym wymaganiem jest Servlet 2.4 i JSP 2.2, A OP wymienić Servlet 3.0 i JSP 2.0, który jest dobry wystarczy.

 0
Author: Jérôme Verstrynge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-30 13:22:11

Istnieją dwie odpowiedzi, które są w większości poprawne w odniesieniu do tego, jak rozwiązać ten problem, gdy używasz Mavena, gdy radzisz sobie z tym problemem. Jednak oba nie są w 100% kompletne.

Using Exclusions per @ Tom Hunter ' s answer

Ta odpowiedź działa. Jednak nadal będą wyświetlane komunikaty dziennika Tomcat dotyczące zduplikowanych definicji TLD. Dzieje się tak dlatego, że zarówno artefakty jstl, jak i JSTL-impl zawierają definicje TLD. Aby usunąć te wiadomości, myślę, że lepsza konfiguracja Mavena jest taka:

<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>

Obejmuje to tylko klasy api jstl z niezbędnymi wykluczeniami, aby uniknąć problemów opisanych w pozostałej części tej odpowiedzi.

Używanie nowszych wersji POM na @George ' s answer

Zajęło mi to trochę czasu, ale są nowsze wersje JSTL pom ' s dostępne. Jest to naprawdę mylące, ponieważ te nowsze Pakiety używają podobnych, ale nieco innych konwencji nazewnictwa. Te nowsze wersje oznaczają javax.servlet, javax.zależności jsp, etc, jak przewidziano zakres tak, że nie muszą być wykluczone. Wersja 1.2.1 zależy od wersji 1.2.1 jstl-api. I tak to by działało jak wyżej odpowiedź:
<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>javax.servlet.jsp.jstl</artifactId>
    <version>1.2.1</version>
    <scope>runtime</scope>
</dependency>

Różni się to nieco od odpowiedzi George ' a, ponieważ zmieniłem Zakres na runtime. / Align = "left" / Z podanym zakresem, jars musiałby być skopiowany ręcznie do katalogu Tomcat lib, lub jakaś inna zależność musiałaby zawiera niezbędne wdrożenie.

jednakże, nie mogłem znaleźć wersji 1.2.1 impl w Maven central, JBoss repo lub jakichkolwiek innych repo. Skończyłem w kółko i w końcu użyłem lokalnego repo opartego na pliku do przechowywania słoika. Zależność i jar są opisane tutaj:

 0
Author: kaliatech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:46:49

Żaden z nich nie działał dla mnie, po prostu stworzyłem Projekt bez użycia Mavena i dodawania plików JAR bezpośrednio.

 0
Author: pgonzaleznetwork,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-16 19:18:25

Doznałem błędu: SEVERE: Servlet.service() dla servleta [obliquid.servlet.Index] w kontekście ze ścieżką [/cp] wyrzucił wyjątek [bezwzględny uri: http://java.sun.com/jsp/jstl/core nie można rozwiązać w żadnej sieci.xml lub pliki JAR wdrożone z tą aplikacją] na Tomcat 7

Rozwiązanie: kopiarka JSTL-1.2.jar i javax.servlet.jsp.jstl-api-1.2.1.jar prosto do katalogu biblioteki Tomcat. Ponownie zainstaluj bibliotekę Tomcat w Eclipse.

 -1
Author: Tomasz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-10 11:53:21

Następujące zależności w pom.wydaje się, że xml rozwiązuje problem:

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

<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>javax.servlet.jsp.jstl-api</artifactId>
    <version>1.2.1</version>
    <scope>provided</scope>
</dependency>

To było dziwne połączenie - dwie różne grupy-ale to działa :). Oczekiwałem, że zobaczę ten sam identyfikator grupy dla obu słoików. Udało mi się bez problemu przenieść do Tomcat 7.

Również, jeśli widzisz " Unkown tag

 -1
Author: George,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-07 06:23:18