3

我有一个使用特定版本的 jsp-api 和 servlet-api jar 文件构建和打包的项目。现在我希望在任何应用程序服务器(例如 tomcat、WAS、Weblogic 等)上部署 Web 项目时加载这些 jar。

我在 tomcat 上看到的行为是它给出的消息是这些 api 的打包版本没有与有问题的类一起加载。

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

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

4

4 回答 4

3
  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 将 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 包。所以这肯定有效。

于 2008-11-28T06:47:01.290 回答
1

为了清楚起见,我将答案一分为二

图树,我有两个消息要告诉你。

好的是我已经使用我在上一篇文章中描述的步骤(下面的截图)将我的 tomcat 中的 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)
于 2008-12-02T20:21:05.890 回答
0

JRockit 可以使用 -Xbootclasspath。请参阅命令行参考

于 2008-11-29T14:03:43.253 回答
0

其他选择是使用

-Djava.endorsed.dirs

JVM启动时

于 2009-01-09T00:19:25.720 回答