सवाल टॉमकैट 7 और जेएसटीएल


मैंने एक्लिप्स टॉमकैट के साथ एक वेब एप्लीकेशन लिखा और यह मेरे स्थानीय टॉमकैट 7 पर काम करता है, जब मैंने इसे टॉमकैट 7 पर ऑनलाइन प्रकाशित करने का प्रयास किया, तो मुझे निम्न त्रुटि मिली:

सेव: Servlet.service () servlet [obliquid.servlet.Index] के लिए पथ [/ cp] के संदर्भ में संदर्भ के लिए अपवाद [पूर्ण यूरी: http://java.sun.com/jsp/jstl/core किसी भी web.xml या इस एप्लिकेशन के साथ तैनात जार फ़ाइलों में हल नहीं किया जा सकता है]

टॉमकैट 7 में "स्पेक संस्करण: सर्वलेट 3.0, जेएसपी 2.2, ईएल 2.2" है, इसलिए जेएसटीएल शामिल नहीं है?

जब मैंने standard.jar और jstl.jar अपलोड करने का प्रयास किया तो मुझे निम्न त्रुटि मिली:

org.apache.jasper.JasperException: /jsp/index.jsp (रेखा: 3, कॉलम: 62) जेएआर फ़ाइल से टीएलडी "मेटा-आईएनएफ / सीटीएलडी" पढ़ने में असमर्थ "jndi: / localhost / cp / WEB-INF /lib/standard.jar ": org.apache.jasper.JasperException: टैगLibraryValidator वर्ग को लोड या तत्काल करने में विफल: org.apache.taglibs.standard.tlv.JstlCoreTLV

मैंने कुछ googling किया, लेकिन मैं इसे हल नहीं कर सका, कुछ ने कहा कि यह जार के विरोधाभासी संस्करणों के कारण हो सकता है। शायद मुझे उन जारों को शामिल नहीं करना चाहिए और एक अलग जेएसटीएल यूआरएल का उपयोग नहीं करना चाहिए? मेरा जेएसटीएल 1.1 है, मुझे लगता है, क्या जेएसटीएल 1.2 के लिए एक नया यूआरएल है?

समस्या को हल करने और इस एप्लिकेशन को चलाने के लिए मुझे क्या करना चाहिए?


44
2018-05-23 07:52


मूल


क्या आप आर कोड पोस्ट कर सकते हैं - Ravi Parekh
हाय रवि, मैं प्रासंगिक भागों को पोस्ट करने की कोशिश करूंगा। इस बीच, मैं कोशिश कर रहा था और rsync के साथ प्रकाशित करने की बजाय (जैसा कि मैंने हमेशा किया है), मैंने युद्ध प्रकाशित किया, और इस बार एप्लिकेशन ने काम किया। चूंकि इसे ऑनलाइन रहने की आवश्यकता है, इसलिए मैं इस सर्वर को नहीं छूंगा और उसी टॉमकैट 7.0.14 के साथ एक नया सेटअप करूंगा। मुझे कई मिनट की आवश्यकता होगी ... - stivlo
हमारे जेएसटीएल विकी पेज देखें: stackoverflow.com/tags/jstl/info होवर करते समय आप उन प्रकार के पेज प्राप्त कर सकते हैं [tag] एक बॉक्स पॉप अप होने तक और फिर क्लिक करने तक प्रश्न के नीचे जानकारी संपर्क। - BalusC
बैलससी धन्यवाद, हमेशा सहायक, शायद इसे सर्वलेट 3.0 घोषणा के साथ भी अपडेट किया जाना चाहिए। <? xml संस्करण = "1.0" एन्कोडिंग = "यूटीएफ -8"?> <वेब-ऐप xmlns = "java.sun.com/xml/ns/javaee "; xmlns: वेब = "java.sun.com/xml/ns/javaee/web-app_3_0.xsd "; xmlns: xsi = "w3.org/2001/XMLSchema-instance "; xsi: schemaLocation = "java.sun.com/xml/ns/javaee  java.sun.com/xml/ns/javaee/web-app_3_0.xsd "; आईडी = "आपका_वेबैप_आईडी" संस्करण = "3.0"> - stivlo


जवाब:


टोमकैट ने कभी भी जेएसटीएल शामिल नहीं किया है।

आपको जेएसटीएल और मानक जार डालना चाहिए WEB-INF/lib (आपने यह किया है), और सुनिश्चित करें कि आपके पास उन्हें पढ़ने की अनुमति है (chmod)

आपका यूआरआई सही है और इसे काम करना चाहिए (यहां काम करता है)


42
2018-05-23 08:23



"टोमकैट ने कभी जेएसटीएल को शामिल नहीं किया है": धन्यवाद, मैंने सोचा कि नया टॉमकैट 7 था, यह जानना अच्छा था। यह एक अनुमति समस्या हो सकती है, अब मैं फिर से स्थापित कर रहा हूं और जांच करूंगा, धन्यवाद, मैं आपको अपडेट करूंगा, धन्यवाद। - stivlo
ठीक है, तो यहां अद्यतन है: मैंने सबकुछ इंस्टॉल किया क्योंकि यह नए सर्वर में था और सबकुछ काम करता है। अंतर यह था कि मैं पहले रूट उपयोगकर्ता के रूप में rsyncing था, और अब मैं tomcat के रूप में rsynced। मुझे लगता है कि इसका मतलब यह होना चाहिए कि यह वास्तव में एक अनुमति समस्या थी। - stivlo


मैं इसके साथ कई घंटों तक लड़ रहा हूं। यहां एक पूरा समाधान है।

  1. मैं टोमकैट 7 का उपयोग कर रहा हूं, जो एक सर्वलेट 3.0-अनुरूप सर्वर है।

  2. यदि आप सर्वलेट 3.0 spec का उपयोग करना चाहते हैं, तो आपके पास अपना वेब.एक्सएमएल निम्नानुसार होना चाहिए:

    <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. यदि आप मेवेन का उपयोग कर रहे हैं, तो आपके 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>
    

    ये निर्भरता बहुत महत्वपूर्ण हैं। जेएसटीएल 2.1 + टोमकैट 7 + सर्वलेट 3.0 बहुत टूटा हुआ है जब तक कि आप इन लाइनों का उपयोग करके इसे ठीक नहीं करते हैं, विशेष रूप से बहिष्करण भाग। क्या हो रहा है जेएसटीएल 2.1 जार वास्तव में सर्वलेट spec-2.5 के गलत संस्करणों में खींच रहे हैं। जब तक आप इसे होने से रोक नहीं देते, तब तक आप दर्द की पूरी दुनिया में रहेंगे। एक विशेष धन्यवाद इन अंतर्दृष्टि के लिए श्री मरे टोड विलियम्स ।

  4. आखिरकार, अगर मैवेन उन जारों को नहीं ढूंढ पाता है, तो आप अपनी परियोजना के साथ तीन जारों को शामिल करके ग्रहण कर सकते हैं और सामान्य परियोजना -> गुण -> जावा बिल्ड पथ कर सकते हैं और उन्हें इस तरह शामिल कर सकते हैं - हालांकि मैवेन को लेना चाहिए इसकी देखभाल करें।

    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. एक सर्वलेट 3.0-अनुरूप अनुप्रयोग सर्वर जैसे कि टॉमकैट 7

    2. Servlet 3.0 spec के लिए आपके web.xml का सही नामस्थान है

    3. आपके पास उन तीन जार हैं और आपके क्लासपाथ पर कोई अन्य जेएसटीएल या सर्वलेट जार नहीं है।

  6. सुनिश्चित करें कि आप इन वेबर्स की प्रतियों को अपनी वेब-आईएनएफ / lib निर्देशिका में नहीं रखते हैं क्योंकि वे उस मामले में सर्वर पर भेजे जाएंगे जिससे लिंकेज एरर हो।

  7. आपके जेएसपी में, आपको यह सटीक रेखा होना चाहिए, जैसा कि मेरे पास है, ठीक उसी तरह स्वरूपित है या अन्यथा ग्रहण करेगा कि यह सी को पहचान नहीं पाएगा: ब्ला टैग:

    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    
  8. क्या एक खतरनाक पिटा! जेएसटीएल के किसी भी अन्य संस्करण की तुलना में यह लागू करना बहुत कठिन है। बाद में पुनरावृत्तियों में आसान होने के बजाय कुछ अधिक जटिल होने का यह एकमात्र उदाहरण है।


54
2018-05-20 14:01



धन्यवाद! मैं इसी सटीक समस्या से गुज़र गया ... यह मेरे दिन के घंटों को चूस गया, इसे जानने के लिए धन्यवाद! - Daniel Macias
अगर किसी को लगता है कि समाधान उनके लिए काम नहीं करता है, तो जांचें कि ईएल को नजरअंदाज नहीं किया गया है। नीचे दिए गए लाइन को अपने जेएसपी पृष्ठों में जोड़ें। यह ख्याल रखता है कि ईएल को नजरअंदाज नहीं किया जाता है। <% @ पृष्ठ isELIgnored = "false"%> है - Vishnu
आपका बहुत बहुत धन्यवाद। सबसे अच्छा anwser, विशेष रूप से maven config के लिए धन्यवाद। मैंने इसे 3.1.0 सर्लेट्स के साथ उपयोग करने के लिए संशोधित किया है और यह एक आकर्षण की तरह काम है - Oleg Abrazhaev


आपकी यूरी जेएसटीएल 1.2 के लिए सही है। आपको दो चीजें करने की ज़रूरत है:

अपना बदलें web.xml नवीनतम वेब-ऐप संस्करण का उपयोग करने के लिए।

इसे इस तरह या बाद के संस्करण की तरह दिखना चाहिए;

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

दूसरी बार अपने कोड में जेएसटीएल जार का सही संस्करण डालें। 1.2 के लिए आप उन्हें डाउनलोड कर सकते हैं यहाँ

यह आपको दो जार देना चाहिए:

  • JSTL-api.jar
  • JSTL-impl.jar

इसके बजाय, इन का प्रयोग करें standard.jar तथा jstl.jar जो पिछले संस्करण के लिए थे।

हमें बताएं कि यह आपके लिए कैसे काम करता है।


15
2017-09-14 09:54



धन्यवाद, यह मेरी मदद की। - Kiran


अपाचे टॉमकैट 7 पर चलने के लिए इन्हें आपके पीओएम में जोड़ना शायद उचित है। ये जार ग्लासफिश की तरह javax.servlet जार का संदर्भ नहीं देते हैं, इसलिए बहिष्करण की कोई आवश्यकता नहीं है।

<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
2017-07-23 17:40





टॉमकैट के लिए, जेएसटीएल 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>

देख यहाँ अधिक जानकारी के लिए (व्यक्तिगत ब्लॉग)।

रेम: अनुरोध के रूप में अधिक जानकारी, किसी को जेएमटीएल निर्भरताओं को टॉमकैट पर उपलब्ध कराने के लिए शामिल करना होगा। फिर भी, संस्करण 1.2 वास्तव में आवश्यक नहीं है, क्योंकि संस्करण 1.1.2 (अपाचे द्वारा वितरित, टोमकैट की तरह) नौकरी भी करता है। इसकी एकमात्र आवश्यकता सर्वलेट 2.4 और जेएसपी 2.2 है, और ओपी सर्वलेट 3.0 और जेएसपी 2.0 का उल्लेख करता है, जो काफी अच्छा है।


0
2017-07-28 21:43



क्या आप अपने उत्तर को संपादित करने पर विचार करेंगे ताकि इसमें आपके कोड का स्पष्टीकरण शामिल हो, और यह सवाल का जवाब क्यों है? - Andrew Barber
मुझे लगता है कि यह उन लोगों के लिए बहुत आत्म-व्याख्यात्मक है जो टॉमकैट पर जेएसपी / जेएसटीएल का उपयोग करते हैं। निर्भरता का यह सेट भी काम करता है। - Jérôme Verstrynge


इस मुद्दे से निपटने के दौरान मेवेन का उपयोग करते समय इस समस्या को हल करने के तरीके के संबंध में यहां दो जवाब दिए गए हैं। हालांकि, दोनों 100% पूर्ण नहीं हैं।

प्रति बहिष्करण का उपयोग करना @ टॉम हंटर का जवाब

यह जवाब काम करता है। हालांकि, अभी भी टोमकैट से डुप्लिकेट टीएलडी परिभाषाओं के संबंध में लॉग संदेश होंगे। ऐसा इसलिए है क्योंकि जेएसटीएल और जेएसटीएल-इंपर्ट कलाकृतियों में टीएलडी परिभाषाएं शामिल हैं। उन संदेशों को हटाने के लिए, मुझे लगता है कि एक बेहतर मेवेन सेटअप यह है:

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

इसमें केवल उस उत्तर के बाकी हिस्सों में समझाई गई समस्याओं से बचने के लिए आवश्यक बहिष्करण के साथ जेएसटीएल एपीआई कक्षाएं शामिल हैं।

प्रति नए पीओएम संस्करणों का उपयोग करना @ जॉर्ज का जवाब

मुझे यह महसूस करने में थोड़ी देर लग गई, लेकिन जेएसटीएल पोम के नए संस्करण उपलब्ध हैं। यह वास्तव में भ्रमित है क्योंकि ये नए पैकेज समान उपयोग करते हैं, लेकिन थोड़ा अलग नामकरण सम्मेलन। ये नए संस्करण 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>

यह जॉर्ज के जवाब से थोड़ा अलग है क्योंकि मैंने रनटाइम को दायरा बदल दिया है। जॉर्ज ने प्रदान किए गए दायरे को निर्दिष्ट किया। प्रदान किए गए दायरे के साथ, जार को मैन्युअल रूप से टोमकैट lib निर्देशिका में कॉपी करना होगा, या कुछ अन्य निर्भरता में आवश्यक कार्यान्वयन शामिल करना होगा।

तथापि, मैं maven केंद्रीय, jboss repo, या किसी अन्य repos में प्रत्यारोपण के 1.2.1 संस्करण नहीं मिला। मैं सर्कल में चारों ओर जा रहा था और आखिरकार जार को स्टोर करने के लिए स्थानीय फाइल आधारित रेपो का इस्तेमाल किया। निर्भरता और जार का वर्णन यहां किया गया है:


0
2017-09-20 14:21





इनमें से कोई भी मेरे लिए काम नहीं करता, मैंने बस मेवेन का उपयोग किए बिना परियोजना बनाई और सीधे जेएआर फाइलें जोड़ दीं।


0
2017-12-16 19:18





मुझे त्रुटि से पीड़ित: SEVERE: Servlet.service () servlet [obliquid.servlet.Index] पथ के संदर्भ में [/ cp] अपवाद फेंक दिया [पूर्ण यूरी: http://java.sun.com/jsp/jstl/core Tomcat 7 पर या तो web.xml या इस एप्लिकेशन के साथ तैनात जार फ़ाइलों में हल नहीं किया जा सकता है]

समाधान: jars jstl-1.2.jar और javax.servlet.jsp.jstl-api-1.2.1.jar को सीधे टॉमकैट लाइब्रेरी निर्देशिका में कॉपी करें। ग्रहण में फिर से टॉमकैट लाइब्रेरी को दोबारा तैनात करें।


-1
2018-05-10 11:53





Pom.xml में निम्न निर्भरता समस्या को हल करने लगती है:

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

यह एक अजीब संयोजन था - दो अलग-अलग समूह आईडी - लेकिन यह काम करता है :)। मेरी उम्मीद दोनों जारों के लिए एक ही समूह आईडी देखना था। मैं टॉमकैट 7 के बिना किसी समस्या के पुनर्निर्माण में कामयाब रहा।

इसके अलावा, अगर आप "अनकॉउन टैग" देखते हैं     


-1
2018-06-07 06:23