本节介绍已知的 Web 容器问题和相应的解决办法。
如果您在 Windows 上部署应用程序时要求预编译 JSP,则以后尝试取消部署该应用程序或重新部署该应用程序(或任何具有相同模块 ID 的应用程序)的操作将不会按预期进行。出现此问题的原因是:JSP 预编译会打开应用程序中的 JAR 文件,但不能关闭这些文件,Windows 将禁止执行取消部署或重新部署操作以避免删除或覆盖它们。
请注意,取消部署在某种程度上是成功的,因为会从 Application Server 中逻辑删除应用程序。另外请注意,asadmin 实用程序不会返回任何错误消息,但 application 的目录以及锁定的 jar 文件会保留在服务器中。server 的日志文件将包含用于说明未能删除文件和 application 的目录的消息。
在取消部署后尝试重新部署应用程序的操作会失败,这是由于服务器尝试删除现有文件和目录,而这些尝试也失败了。如果您尝试部署的应用程序所使用的模块 ID 与最初部署的应用程序的模块 ID 相同,则会出现这种情况,这是由于服务器在选择目录名来保存应用程序的文件时会使用模块 ID。
如果没有先取消部署应用程序而尝试重新部署该应用程序,也将会由于同样的原因而失败。
如果尝试重新部署应用程序或在取消部署后部署它,asadmin 实用程序将返回与以下错误消息类似的错误消息。
An exception occurred while running the command. The exception message is: CLI171 Command deploy failed : Deploying application in domain failed; Cannot deploy. Module directory is locked and can\qt be deleted
如果部署应用程序时指定了 --precompilejsps=false(默认设置),则不会出现此问题。请注意,第一次使用应用程序时会触发 JSP 编译,因此第一个请求的响应时间将会长于随后的请求的响应时间。
另外,请注意,如果您确实进行了预编译,则在取消部署或重新部署应用程序之前,应先停止并重新启动服务器。关闭服务器后将释放锁定的 JAR 文件,这样在重新启动服务器后,取消部署或重新部署便可以成功。
web.xml 中可选的 load-on-startup servlet 元素表示在启动声明相关 servlet 的 Web 应用程序时,将加载及初始化此 servlet。
此元素的可选内容是一个整数,用于表示该 servlet 相对于 Web application 的其他 servlet 而被装入和初始化的顺序。只要该 servlet 在包含它的 Web 应用程序启动期间被加载和初始化,空的 <load-on-startup\> 就表示顺序无关紧要。
web.xml 的 Servlet 2.4 模式不再支持空的 <load-on-startup\>,这意味着在使用基于 Servlet 2.4 的 web.xml 时,必须指定一个整数。如果像在 <load-on-startup/\> 中一样指定空的 <load-on-startup\>,则 web.xml 将无法针对 web.xml 的 Servlet 2.4 模式进行验证,从而导致 Web 应用程序的部署失败。
向下兼容性问题。在基于 Servlet 2.3 的 web.xml 中仍可以像往常那样指定空的 <load-on-startup\> 。
使用基于 Servlet 2.4 的 web.xml 时,指定 <load-on-startup\>0</load-on-startup\> 以表示 servlet 的装入顺序无关紧要。
已访问 JSP 页面但是无法对其进行编译,并且服务器日志包含错误消息“无法执行命令”和以下堆栈跟踪消息:
at org.apache.tools.ant.taskdefs.Execute$Java13CommandLauncher.exec (Execute.java:655) at org.apache.tools.ant.taskdefs.Execute.launch (Execute.java:416) at org.apache.tools.ant.taskdefs.Execute.execute (Execute.java:427) at org.apache.tools.ant.taskdefs.compilers. DefaultCompilerAdapter.executeExternalCompile(DefaultCompilerAdapter. java:448) at org.apache.tools.ant.taskdefs.compilers.JavacExternal. execute(JavacExternal.java:81) at org.apache.tools.ant.taskdefs.Javac. compile(Javac.java:842) at org.apache.tools.ant.taskdefs.Javac.execute (Javac.java:682) at org.apache.jasper.compiler.Compiler.generateClass (Compiler.java:396)
将 JSP 编译开关 fork 设置为 false。
可以通过以下两种方式之一来实现:
在全局范围内,通过将 ${S1AS_HOME}/domains/domain1/config/default-web.xml 中 JspServlet 的 fork init 参数设置为 false:
<servlet\> <servlet-name\>jsp</servlet-name\> <servlet-class\>org.apache. jasper.servlet.JspServlet</servlet-class\> .... <init-param\> <param-name\> fork</param-name\> <param-value\>false</param-value\> </init-param\> .... </servlet\>
对于每个 Web 应用程序,将 sun-web.xml 中的 fork JSP 配置属性设置为 false:
<sun-web-app\> <jsp-config\> <property name="fork" value="false" /\> </jsp-config\> </sun-web-app\>
以上任何一种设置都将阻止 ant 产生用于 javac 编译的新进程。
Application Server PE 的默认配置在多 CPU 计算机上无法表现出最佳性能。可以交替使用以使启动更快,但这又会对 Web 应用程序的性能产生负面影响。
配置 Application Server 以使用以下 JVM 选项:
-Dcom.sun.enterprise.server.ss.ASQuickStartup=false
如果将不符合 Fast Infoset 编码的 SOAP 消息发送给 JAX-RPC 服务,则服务会发生响应故障,这是正常的。但将后续的符合 Fast Infoset 编码的 SOAP 消息发送到同一服务或使用同一 JAX-RPC 运行时部署的服务时,则会不正常地发生故障。
可以使用以下解决方法:
禁用客户机上的 Fast Infoset 支持,以便仅发送 XML 编码的 SOAP 消息。
重新启动部署服务的容器,以便可以发送符合 Fast Infoset 编码的 SOAP 消息。