[英]servlet-api 2.5 & jsp-api 2.1 coming under maven dependancies
[英]Overriding application server behaviour for loading jsp-api and servlet-api jars in a packaged web application
我有一个项目,使用特定版本的jsp-apiand servlet-api jar文件构建和打包。 现在我希望在任何应用程序服务器上部署Web项目时加载这些jar,例如tomcat,WAS,Weblogic等。
我在tomcat上看到的行为是它给出的消息是这些api的打包版本没有加载一个有问题的类。
有什么办法可以覆盖这些服务器设置或行为吗?
我担心的是,让服务器的默认行为可能允许不同服务器上的不同行为,甚至允许同一应用服务器的不同版本。
更新:
至于第二部分,你需要自己修改应用服务器的启动文件。
我手头没有安装但是假设在目录$ YOUR_APPSERV / bin中有一堆脚本(.cmd或.sh文件)
其中一些启动应用程序服务器,另一些帮助配置它。
您需要以这样的方式修改其中一个命令行如下所示:
(假设安装了Windows)
java -Xbootclasspath/p:c:\cutomjars\myJar.jar;customjars\myOtherJar.jar ..................... // the rest of the normal command line.
-bootclasspath / p将jar添加到app classpath
-bootclasspath / a将jar附加到app claspath
此选项允许您使用jar中指定的类覆盖JVM中的任何类,因此如果需要,甚至可以替换java.lang.String。
这是一种方法。 不幸的是-Xbootclasspath是Sun JVM的一个选项(即JRockit没有它,也不是IBM的VM,他的名字是什么)
还有另一个选项,您可以声明所有扩展名所在的文件夹。 另外,jre中有一个ext目录。
深入了解您的应用程序服务器bin目录并找出每个脚本的用途,我很确定您会完成它。
以下是对此主题的更正式的解释: http : //java.sun.com/j2se/1.5.0/docs/tooldocs/findingclasses.html
我希望它有所帮助。
顺便说一句,我多年前用这个做法,用旧版本替换CORBA软件包。 所以这肯定是有效的。
为清楚起见,我把答案分成两部分
Tushu,我有两条消息给你。
好的一个是我已经设法在我的tomcat中使用我在前一篇文章中描述过的步骤(下面的screeshots)将servlet api从2.5替换为2.3
糟糕的新事物(我之前应该已经猜到了)tomcat将无法启动。显而易见,servlet-api.jar是tomcat的核心,版本依赖于那里存在的一些功能。 如果更改,引擎将无法工作。
我向您展示的解决方案,可以改变一个或两个类的行为,但不能替代整个系统。
所以,你唯一的选择是:
这是测试jsp
Servlet version: <%=application.getMajorVersion()%>.<%=application.getMinorVersion()%>
未修改版本的输出:
未修改版本http://img89.imageshack.us/img89/9822/87694136ld9.png
修改版:
修改版http://img241.imageshack.us/img241/7842/86370197ev3.png
修改后的catalina启动的屏幕截图
差异输出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 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.