在 Windows 上,使用 --precompilejsp=true 部署应用程序会锁定应用程序中的 JAR 文件,从而导致以后的取消部署或重新部署失败 (5004315)
如果您在 Windows 上部署应用程序时要求预编译 JSP,则以后尝试取消部署该应用程序或重新部署该应用程序(或任何具有相同模块 ID 的应用程序)的操作将不会按预期进行。出现此问题的原因是:JSP 预编译会打开应用程序中的 JAR 文件,但不能关闭这些文件,Windows 将禁止执行取消部署或重新部署操作以避免删除或覆盖它们。
请注意,取消部署在某种程度上是成功的,因为应用程序会从 Application Server 中被逻辑删除。另外请注意,asadmin 实用程序不会返回任何错误消息,但应用程序的目录以及锁定的 jar 文件会保留在服务器中。服务器的日志文件将包含用于说明未能删除文件和应用程序的目录的消息。
在取消部署后尝试重新部署应用程序的操作会失败,这是由于服务器尝试删除现有文件和目录,而这些尝试也失败了。如果您尝试部署的应用程序所使用的模块 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't
be deleted.
如果在部署应用程序时指定 --precompilejsps=false(默认设置),则不会出现此问题。请注意,第一次使用应用程序时会触发 JSP 编译,因此第一个请求的响应时间将会长于随后的请求的响应时间。
另外,请注意,如果您确实进行了预编译,则在取消部署或重新部署应用程序之前,应先停止并重新启动服务器。关闭服务器后将释放锁定的 JAR 文件,这样在重新启动服务器后,取消部署或重新部署便可以成功。
无法在资源限定服务器上编译 JSP 页面 (6184122)
已访问 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"。
可以通过以下两种方式之一来实现:
在全局范围内,通过将 domain-dir/config/default-web.xml 中 JspServlet 的 fork 初始化参数设置为 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>
以上任何一种设置都将阻止 ant 产生用于 javac 编译的新进程。
Enterprise Server 不支持 auth-passthrough Web Server 6.1 附加软件 (6188932)
Sun GlassFish Enterprise Server 2.1.1 添加了对 Sun GlassFish Enterprise Server Enterprise Edition 7.1 中可用的 auth-passthrough 插件功能所提供的功能的支持。但是,在 Enterprise Server 2.1.1 中,auth-passthrough 插件功能的配置有所不同。
Enterprise Server Enterprise Edition 7.1 中的 auth-passthrough 插件功能在双层部署方案中非常有用,其中:
Application Server 实例受公司防火墙之后的第二层防火墙的保护。
在这种网络体系架构中,客户机连接到前端 Web 服务器,而该 Web 服务器配置有 service-passthrough 插件功能,会将 HTTP 请求转发到代理的 Application Server 实例以供处理。Application Server 只能从 Web 服务器代理接收请求,而决不会从任何客户机主机接收请求。因此,当部署在代理的 Application Server 实例上的任何应用程序查询客户机信息时,该应用程序将收到代理主机的信息(例如,当该应用程序查询客户机 IP 地址时,会收到代理主机的 IP),这是因为代理主机才是中继请求的真正发出主机。
在 Application Server Enterprise Edition 7.1 中,可以在代理 Application Server 实例上配置 auth-passthrough 插件功能,以使该实例上所部署的所有应用程序可以直接获得远程客户机的信息,就像代理 Application Server 实例直接收到请求那样,而不是通过运行 service-passthrough 插件的中间 Web 服务器接收。
在 Enterprise Server 2.1.1 中,可以通过将 domain.xml 中 <http-service> 元素的 authPassthroughEnabled 属性设置为 TRUE 来启用 auth-passthrough 功能,如下所示:
Application Server Enterprise Edition 7.1 中的 auth-passthrough 插件功能的安全注意事项也适用于 Enterprise Server 2.1.1 中的 authPassthroughEnabled 属性。由于 authPassthroughEnabled 可以覆盖可能用于进行验证的信息(例如,请求的来源 IP 地址或 SSL 客户机证书),因此,必须只允许可信的客户机或服务器连接到 authPassthroughEnabled 设置为 TRUE 的 Enterprise Server 2.1.1 实例。作为一项预防措施,建议仅将公司防火墙之后的服务器的 authPassthroughEnabled 设置为 TRUE,而不要将可通过 Internet 访问的服务器的 authPassthroughEnabled 设置为 TRUE。
请注意,当代理 Web 服务器已配置了 service-passthrough 插件并且将请求转发到 authPassthroughEnabled 设置为 TRUE 的 Enterprise Server 实例时,Web 服务器代理上可能启用了 SSL 客户机验证,而在代理的 Enterprise Server 实例上却禁用了该验证。在此情况下,代理的 Enterprise Server 实例仍会将请求当作通过了 SSL 验证,并向部署在其上的发出请求的所有应用程序提供客户机 SSL 证书。
AS 9.1 b50e.Linux。无法在安装 AS LB 之后启动 WS:libjvm.so:cannot open shared (6572654)
只有在 Linux 系统上将 Sun GlassFish Web Server 与 Enterprise Server 和负载平衡器一起使用时才会出现此问题。在此情况下,安装 Enterprise Server 和负载平衡器之后,Web Server 可能无法启动,因为 libicui18n.so.2 和 libicuuc.so.2 发生冲突。这些库同时位于 /opt/sun/private/lib 和 /opt/sun/appserver/lib 中。
要使用的正确的库只能位于 /opt/sun/appserver/lib 中,因为 lbplugin 根据这些库生成。一旦从 /opt/sun/private/lib 中删除这两个库,Web Server 便应该能够顺利启动,不会出现任何错误。
或者,如果不希望从 /opt/sun/private/lib 中删除这些库,可以在 Web Server startserv 脚本的 LD_LIBRARY_PATH 中,将 /opt/sun/appserver/lib 放在 /opt/sun/private/lib 之前;也就是将:
# Add instance-specific information to LD_LIBRARY_PATH for Solaris and Linux
LD_LIBRARY_PATH="${SERVER_LIB_PATH}:${SERVER_JVM_LIBPATH}:${LD_LIBRARY_PATH}:
/opt/sun/appserver/lib:/opt/sun/appserver/lbplugin/lib"; export LD_LIBRARY_PATH
# Add instance-specific information to LD_LIBRARY_PATH for Solaris and Linux
LD_LIBRARY_PATH="/opt/sun/appserver/lib:/opt/sun/appserver/lbplugin/lib:
${SERVER_LIB_PATH}:${SERVER_JVM_LIBPATH}:${LD_LIBRARY_PATH}"; export LD_LIBRARY_PATH
Ant 任务 wsimport 不可用于 Java EE SDK b33d (使用 JDK 1.6),并出现 NoClassDefFoundError (6527842)
使用 Java EE SDK b33d 附带的 JDK 1.6 运行 JAX—WS 测试时可能会遇到问题。这些测试会立即中止,并且显示以下消息:
[wsimport] Exception in thread "main" java.lang.NoClassDefFoundError: \
com/sun/tools/ws/WsImport
即使 webservices-tools.jar 不包含 com/sun/tools/ws/WsImport.class、com/sun/tools/ws/ant/WsImport.class 和 com/sun/tools/ws/ant/WsImport2.class,也会发生此错误。而且,同一个测试工作区可以使用 1.5.0-10 JDK 运行,而不会出现任何问题。
在运行 JAX-WS 测试之前,将 webservices-api.jar 复制到 $JAVA_HOME/jre/lib/endorsed。
publish-to-registry 命令在 IFR EE 内部版本中失败 (6602046)
JAXR 使用 SAAJ 将 SOAP 消息发送到注册表。在非 IFR 的情况下,SAAJ impl 类位于 lib/webservices-rt.jar 下。在 IFR 的情况下,SAAJ 类仍位于 lib/webservices-rt.jar 下。此外,saaj-impl.jar 位于 /usr/share/lib 目录中。此 jar 文件由 Enterprise Server 拾取,并且其优先级高于 webservices-rt.jar 中的类。此 jar 文件不具有将 SOAP 消息发送到 Web 服务注册表所需的必要安全权限。此打包应该修改为向 /usr/share/lib 目录下的 jar 授予权限,或者与 /usr/share/lib jar 无关。
将以下内容添加到 server.policy 文件: