我有一个使用特定版本的 jsp-api 和 servlet-api jar 文件构建和打包的项目。现在我希望在任何应用程序服务器(例如 tomcat、WAS、Weblogic 等)上部署 Web 项目时加载这些 jar。
我在 tomcat 上看到的行为是它给出的消息是这些 api 的打包版本没有与有问题的类一起加载。
有什么办法可以覆盖这些服务器设置或行为?
我担心的是,让服务器的默认行为可能会允许不同服务器上的不同行为,甚至是同一应用服务器的不同版本。
我有一个使用特定版本的 jsp-api 和 servlet-api jar 文件构建和打包的项目。现在我希望在任何应用程序服务器(例如 tomcat、WAS、Weblogic 等)上部署 Web 项目时加载这些 jar。
我在 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 将 jars 添加到应用程序类路径中
-bootclasspath/a 将 jar 附加到应用程序 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 包。所以这肯定有效。
为了清楚起见,我将答案一分为二
图树,我有两个消息要告诉你。
好的是我已经使用我在上一篇文章中描述的步骤(下面的截图)将我的 tomcat 中的 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启动时