تجاوز سلوك خادم التطبيق لتحميل jsp-api وservlet-api jars في تطبيق ويب مُجمَّع

StackOverflow https://stackoverflow.com/questions/325171

سؤال

لدي مشروع تم إنشاؤه وتعبئته بإصدار محدد من ملفات jsp-api وservlet-api jar.الآن أريد تحميل هذه الجرار عند نشر مشروع الويب على أي خادم تطبيق، على سبيل المثال، Tomcat، WAS، Weblogic وما إلى ذلك.

السلوك الذي رأيته على Tomcat هو أنه يعطي رسائل تفيد بأن الإصدار المعبأ من واجهات برمجة التطبيقات هذه لم يتم تحميله مع فئة مخالفة.

هل هناك أي طريقة يمكنني من خلالها تجاوز إعدادات الخادم أو سلوكه؟

ما يقلقني هو أن السماح بالسلوك الافتراضي للخادم قد يسمح بسلوك مختلف على خوادم مختلفة أو حتى على إصدارات مختلفة من نفس خادم التطبيق.

هل كانت مفيدة؟

المحلول

  1. إذا كان لديك سيطرة على الخادم الذي تريد تثبيت تطبيق الويب هذا عليه، فيمكنك استبدال الجرار الأساسية بجرارك.
  2. بالإضافة إلى ذلك، يمكنك إضافة الجرار في بداية تشغيل خادم التطبيق.

تحديث:

أما بالنسبة للجزء الثاني، فستحتاج إلى تعديل ملف بدء تشغيل خادم التطبيق نفسه.

ليس لدي تثبيت في متناول اليد ولكن لنفترض أنه يوجد في المجلد $YOUR_APPSERV/bin مجموعة من البرامج النصية (إما ملفات .cmd أو .sh)

يقوم البعض منهم بتشغيل خادم التطبيق، والبعض الآخر يساعد في تكوينه.

تحتاج إلى تعديل أحد هذه العناصر بحيث يبدو سطر الأوامر كما يلي:

(افترض تثبيت ويندوز)

java -Xbootclasspath/p:c:\cutomjars\myJar.jar;customjars\myOtherJar.jar ..................... // the rest of the normal command line.

-bootclasspath/p يُلحق الجرار بمسار فئة التطبيق

-bootclasspath/a يُلحق الجرار بـ claspath الخاص بالتطبيق

يتيح لك هذا الخيار تجاوز أي فئة في JVM مع تلك المحددة في الجرار، حتى تتمكن من استبدال java.lang.String إذا كنت تريد ذلك.

هذا نهج واحد.لسوء الحظ -Xbootclasspath هو خيار لـ Sun JVM (أي أن JRockit لا يمتلكه، ولا VM الخاص بـ IBM مهما كان اسمه)

كان هناك خيار آخر حيث تعلن عن مجلد به جميع الامتدادات.بالإضافة إلى ذلك، هناك دليل تحويلة في JRE.

قم بالتعمق في دليل حاوية خادم التطبيق الخاص بك واكتشف الغرض من استخدام كل برنامج نصي، وأنا متأكد من أنك ستنجح في ذلك.

فيما يلي شرح أكثر رسمية لهذا الموضوع: http://java.sun.com/j2se/1.5.0/docs/tooldocs/findingclasses.html

اتمني ان يكون مفيدا.

راجع للشغل، اعتدت أن أفعل هذا منذ سنوات، لاستبدال حزمة CORBA بإصدار قديم للغاية.لذلك هذا يعمل بالتأكيد.

نصائح أخرى

لقد قسمت الإجابة إلى قسمين من أجل الوضوح

توشو، لدي خبران لك.

الشيء الجيد هو أنني تمكنت من استبدال servlet api من 2.5 إلى 2.3 في قطتي باستخدام الخطوات التي وصفتها لك في مشاركتي السابقة (اللقطات أدناه)

الجديد السيئ (وكان يجب أن أخمن هذا من قبل) لن يبدأ Tomcat. هذا واضح، servlet-api.jar هو جوهر Tomcat، ويعتمد الإصدار على بعض الميزات الموجودة هناك.وإذا تم تغييره فلن يعمل المحرك.

الحل الذي أوضحته لك، يعمل على تغيير سلوك فئة أو فئتين، ولكن ليس استبدال النظام بأكمله.

لذلك، الخيارات الوحيدة المتاحة لك هي:

  1. قم بتشغيل حاوية Servlet التي تلبي ترقية مواصفات Servlet الخاصة بك
  2. اختبرها كما هي في المواصفات الجديدة.من المحتمل (وإذا لم تقم بالارتباط بالفصول غير العامة) أن تطبيقك لا يزال يعمل
  3. (لقد فعلت ذلك في الماضي) أنشئ جرة جديدة تحتوي على الفئات المطلوبة بالضبط (لنفترض أن تطبيقك يحتاج إلى فئة واحدة فقط ليعمل بشكل جيد) ثم قم بإرفاق تلك الفئة مسبقًا بالحاوية.

وهنا اختبار jsp

Servlet version: <%=application.getMajorVersion()%>.<%=application.getMinorVersion()%>

الإخراج بنسخة غير معدلة:

نسخة غير معدلة http://img89.imageshack.us/img89/9822/87694136ld9.png

النسخة المعدلة:

نسخة معدلة http://img241.imageshack.us/img241/7842/86370197ev3.png

لقطة شاشة لبدء تشغيل كاتالينا المعدلة

فرق الإخراج http://img246.imageshack.us/img246/3333/30172332tp7.png

تتبع مكدس Tomcat

SEVERE: Servlet.service() for servlet jsp threw exception

javax.servlet.ServletException: javax.servlet.jsp.JspFactory.getJspApplicationContext(Ljavax/servlet/ServletContext;)Ljavax/servlet/jsp/JspApplicationContext;

at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:275)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)

at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)

at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)

at java.lang.Thread.run(Thread.java:619)

وJRockit يمكن استخدام -Xbootclasspath. انظر إشارة

والخيار الآخر هو استخدام

<اقتباس فقرة>   

-Djava.endorsed.dirs

وعند بدء التشغيل JVM

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top