繁体   English   中英

覆盖应用程序服务器行为,以便在打包的Web应用程序中加载jsp-api和servlet-api jar

[英]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的打包版本没有加载一个有问题的类。

有什么办法可以覆盖这些服务器设置或行为吗?

我担心的是,让服务器的默认行为可能允许不同服务器上的不同行为,甚至允许同一应用服务器的不同版本。

  1. 如果您可以控制要安装此Web应用程序的服务器,则可以将核心jar替换为您的。
  2. 此外,您可以在应用服务器启动时添加jar。

更新:

至于第二部分,你需要自己修改应用服务器的启动文件。

我手头没有安装但是假设在目录$ 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的核心,版本依赖于那里存在的一些功能。 如果更改,引擎将无法工作。

我向您展示的解决方案,可以改变一个或两个类的行为,但不能替代整个系统。

所以,你唯一的选择是:

  1. 在符合servlet规范的servlet容器上运行升级您的应用程序
  2. 按照新规范进行测试。 有可能(如果你没有链接到非公开课程)你的应用程序仍然有效
  3. (我在过去做过这个)创建一个新jar,其中包含所需的类(假设您的应用程序只需要一个类运行良好),然后将该类添加到容器中。

这是测试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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM