Sun Java System Application Server Platform Edition 9 发行说明

第 3 章 已知问题和限制

本节介绍有关 Sun Java System Application Server Platform Edition 9 产品的已知问题和相应的解决方法。如果汇总说明未指明特定平台,则所有平台都可能出现此问题。本部分信息按以下内容进行组织:

管理

如果不存在 domain1package-appclient 脚本将不起作用。(ID 6171458)

默认情况下,在 $INSTALL/lib/package-appclient.xml 中有一个用于 domain1(由 asenv.conf 来指向)的 AS_ACC_CONFIG 变量的硬编码值。如果删除 domain1 并创建新域,将不会用新域名更新 AS_ACC_CONFIG 变量,从而导致 package-appclient 脚本失败。

解决方法

执行以下操作之一:

不支持启动带有附加 JMX 代理的 Application Server。(ID 6200011)

可以在 Application Server 上配置 J2SE 1.4.x, 5.0 或更高版本。J2SE 5.0 平台的完整功能是可以启动 JMX 代理。在服务器启动时,如果您明确设置了系统属性,此功能将被激活。

示例值包括:

name="com.sun.management.jmxremote" value="true"
name="com.sun.management.jmxremote.port" value="9999"
name="com.sun.management.jmxremote.authenticate" value="false"
name="com.sun.management.jmxremote.ssl" value="false"

在配置了 JMX 属性并启动服务器之后,将在 Application Server VM 中启动新的 jmx-connector 服务器。此过程的副作用是会对管理功能造成不利影响,并且 Application Server 管理 GUI 和 CLI 可能会产生异常结果。出现此问题的原因在于内置 jmx-connector 服务器与新的 jmx-connector 服务器之间存在一些冲突。

解决方法

如果使用 jconsole(或任何其他 JMX 兼容客户机),请考虑重新使用标准的 JMX Connector Server,它在 Application Server 启动时启动。

当服务器启动时,server.log 中将显示类似于以下所示的内容。您可以连接到其中指定的 JMXServiceURL,并在成功提供证书后执行相同的管理/配置操作,例如:

[#|2004-11-24T17:49:08.203-0800|INFO|sun-appserver-ee8.1|javax.enterprise.
system.tools.admin|_ThreadID=10;|ADM1501: Here is the JMXServiceURL for the 
JMXConnectorServer: [service:jmx:rmi:///jndi/rmi://hostname:8686/management/
rmi-jmx-connector]. This is where the remote administrative clients should 
connect using the JSR 160 JMX Connectors.|#]

有关更多信息,请参阅《Sun Java System Application Server 9 Administration Guide》。

display-error-statistics 会生成负的统计信息

管理控制台 GUI 能够将实际的零 (0) 与统计信息不可用的状态 (N/A) 区分开。命令行界面当前显示负 1 (-1) 而不是 N/A。例如,以下 display-error-statics 命令输出显示 -1 而不是 N/A


# asadmin display-error-statistics
Please enter the admin user name>admin
Please enter the admin password>
Timestamp                               Severity  Warning 
---------------------------------------------------------
1143659837750(Mar 29, 2006 11:17:17 AM)     0        0       
1143656237750(Mar 29, 2006 10:17:17 AM)     0        0       
1143652637750(Mar 29, 2006 9:17:17 AM)      -1       -1      
1143649037750(Mar 29, 2006 8:17:17 AM)      -1       -1      
1143645437750(Mar 29, 2006 7:17:17 AM)      -1       -1      
---------------------------------------------------------
Command display-error-statistics executed successfully.

解决方法

使用管理控制台 GUI 可以显示错误统计信息。在以后的版本中将修复此问题。

应用程序客户机

本节介绍已知的应用程序客户机问题和相应的解决方法。

封装在应用程序客户机归档文件中的库 JAR 覆盖 MANIFEST 文件。(ID 6193556)

如果在您的客户机 JAR 中具有顶层 JAR 文件(在此情况下,为 reporter.jar),则当您部署客户机 JAR 时,该 JAR 的 MANIFEST 文件将覆盖客户机 JAR 的 MANIFEST 文件。

解决方法

目前尚无解决方法。

Windows 平台—类路径中未设置 APPCPATH (ID 6419847)

已检查出,在 Windows 上运行时,appclient.bat 命令不接受 APPCPATH。可以查出此问题是由于 apppclient.bat 文件中 APPCPATH 语句周围的引号。例如,以下语句将失败:


set CLASSPATH="%JAXP_IMPL_JARS%";%JVM_CLASSPATH%
if not %APPCPATH%x == x set CLASSPATH=%CLASSPATH%;"%APPCPATH%"

而以下语句可正确运行:


set CLASSPATH=%JAXP_IMPL_JARS%;%JVM_CLASSPATH%
if not %APPCPATH%x == x set CLASSPATH=%CLASSPATH%;%APPCPATH%

解决方法

删除 APPCPATH(和 JAXP_IMPL_JARS)引用周围的双引号。

安装

本节介绍已知的安装/卸载问题和相应的解决方案。

在某些 Linux 系统上,单击“完成”按钮后安装关闭挂起。(5009728)

已在多种 Linux 系统上发现此问题。在 Java Desktop System 2 上最为常见,但目前在 RedHat 版本中也发现了此问题。

在安装程序的最后一个屏幕上单击“完成”按钮后,安装程序无法启动包含产品“关于”页面或产品注册页面的浏览器窗口,并且安装程序将无限期地挂起而不返回命令提示符。

解决方法

通过在启动安装程序的终端窗口中按 Ctrl+C 组合键来退出安装程序。执行此操作后,有时会启动包含产品“关于”页面或注册页面的浏览器窗口。如果不显示此窗口,请启动浏览器并输入以下 URL 以查看“关于”页面:

file://install_dir/docs/about.html

如果您还选择了用于注册产品的安装选项,请点击产品“关于”页面上提供的指向注册页面的链接。

在 Linux 上安装包装对象时,有时会出现 J2SE 检测和引导问题。(6172980)

启动 Linux 安装程序的 setup 可执行文件有时会挂起。包装程序不是解析 J2SE 位置并启动安装向导,而是挂起并返回以下消息:

Chcking available disk space....
Checking Java(TM) 2 Runtime Environment....
Extracting Java(TM) 2 Runtime Environment....
Deleting temporary files.....

仅在某些版本的 Linux 中发现了此问题。此问题好像与环境设置有关(特别是存在 JAVA_HOME 变量时)。

解决方案

要解决此问题,请执行以下步骤:

Procedure解决 Linux 上的引导问题

  1. 通过运行 unsetunsetenv(这取决于您的 shell)来取消 JAVA_HOME 变量的设置。

  2. 运行带有 -javahome 选项的 setup 来指定安装程序使用的 JAVA_HOME

生命周期管理

本节介绍已知的生命周期管理问题和相应的解决方法。

ejb-timer-service 属性 minimum-delivery-interval 设置为 9000 之后,如果尝试将 ejb-timer-service 属性 redelivery-interval-in-mills 设置为 7000,会导致 set 命令失败并显示以下错误消息:(ID 6193449)

[echo] Doing admin task set
[exec] [Attribute(id=redelivery-interval-internal-in-millis) : Redelivery-
Interval (7,000) should be greater than or equal to Minimum-delivery-
interval-in-millis (9,000)]
[exec] CLI137 Command set failed.

解决方法

使用这些属性的默认值,如下所示:

minimum-delivery-interval(default)=7000
redelivery-interval-in-millis(default)=5000

使用其他的值将导致产生错误。

Java Persistence API

本节列出了与 Java Persistence API 相关的已知问题和相应的解决方案。

如果 UPDATEDELETE 查询在 WHERE 子句中使用子查询,会导致查询编译过程中出现 NullPointerException

有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=572

解决方法

请勿使用此类型的查询。

查询编译器不会检查 Java Persistence 语言规范中定义的所有规则。

查询编译器不会检查 Java Persistence 语言的规范一章中定义的所有规则。特别是,它不检查以下各项:

无效的查询可能会进行编译,但可能会导致在运行时出现 SQLException。或者也可能出现以下情况:基础数据库比较宽松且支持 SQL,但在其他数据库上执行相同查询时会失败,并出现 SQLException

解决方法

手动验证上述条件。

如果查询按 JOIN 变量分组且直接选择 JOIN 变量,则可能会导致 SQLException

如果查询按 JOIN 变量分组且直接选择 JOIN 变量,则可能会导致 SQLException 报告选定的表达式未分组。有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=197。例如:


SELECT AVG(o.totalPrice), c FROM Order o JOIN o.customer c GROUP BY c

解决方法

可能的解决方法是直接浏览此关系,而不是定义 JOIN 变量,例如:


SELECT AVG(o.totalPrice), o.customer FROM Order GROUP BY o.customer

在某些情况下,查询编译器会抛出误导性的错误消息,这是因为它在错误消息中提到了错误的令牌。

有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=550

解决方法

手动验证查询中的哪些内容是错误的。

当前,无法在同一 EAR 文件中部署包含相同类的两个持久性单元。

解决方法

使用不同的类名称。

无法使用 persistence.xml 中的类元素明确地列出 MappedSuperclass

有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=558

解决方法

请勿明确地列出 MappedSuperclass

在继承的类上实体映射 @ManyToMany 失败。

有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=578

解决方法

请勿在子类中使用 ManyToMany 关系。

如果对某个关系使用 List<>,会导致 MetadataHelper.getAttributeNameFromMethodName 中出现 StringIndexOutOfBoundException

有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=557

解决方法

使用 java.util.Collection 代替。

无法将空数据库值映射到图元。

解决方法

通过使用 Java 包装对象类型,映射到可为 null 的数据库列。

从客户端访问 LAZY 初始化关系有时会导致 NullPointerException

有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=404

解决方法

在将实例返回到客户机之前,以服务器端代码访问 LAZY 初始化关系。

如果查询选择关系字段,则在查询结果中不包括 null 值。

如果查询选择关系字段,则在关系字段值为 null 时查询结果中不包括 null 值。而会在查询结果中遗漏此条目,例如:


SELECT o.customer FROM Order o WHERE ...

有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=637

解决方法

从相关实例中选择状态字段。


SELECT o.customer.customerId FROM Order o WHERE ...

如果查询选择为单值关系字段定义的 JOIN 标识变量,则可能会产生无效的 SQL。

例如:


SELECT c FROM Order o LEFT OUTER JOIN o.customer c

有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=638

解决方法

从相关实例中选择状态字段。


SELECT c.customerId FROM Order o LEFT OUTER JOIN o.customer c

EntityManager.find() 错误地抛出 IllegalArgumentException

如果主键类由 @IdClass 注释定义,EntityManager.find() 会对作为其他实体子类的实体错误地抛出 IllegalArgumentException。有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=595

解决方法

将最顶层超类的类用作 find() 方法的参数,并将结果强制转换为子类。

无法保持关系字段设置为 java.util.HashSet 的实体。

有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=643

解决方法

java.util.ArrayList 用作初始值。

JavaServer Faces

本节介绍已知的 JavaServer Faces (JSF) 问题和相应的解决方案。请注意,通过访问 JSF 项目 Web 站点,可以找到有关 JSF 项目的附加信息以及提交可能遇到的所有 JSF 错误。

JSF 1.1 - 1.2 违规:变量和属性解析器 (ID 6419278)

使用 VariableResolver 装饰来扩展表达式语言功能性的 JavaServer Faces 技术应用程序可能无法正常工作。

JavaServer Faces 技术规范 的第 10.4.5 条规定:

“替换默认的 PropertyResolverVariableResolverActionListenerNavigationHandlerViewHandlerStateManager 时,将利用装饰程序的设计模式,从而在您提供具有一个合适参数类型的构造函数时,自定义实现会收到对先前履行该职责的实现的引用。这样,自定义实现可以只覆盖功能的子集(或只提供某些附加功能)并将剩余部分委托给现有实现。”

在 Application Server 9 中,自定义的 VariableResolver 实现将收到未完全履行变量解析职责的“先前”的 VariableResolver

解决方法

我们建议不委托“先前”的 VariableResolver 来解析表达式,而是创建 ValueExpression 并计算它的值。


示例 3–1 计算 ValueExpression 的值

public class CustomVR extends VariableResolver {

    private VariableResolver previous = null;

    public CustomVR(VariableResolver previous) {
	this.previous = previous;
    }
  
    public Object resolveVariable(FacesContext context, String name)
	throws EvaluationException {
	Object result = null;
	
	// Do some action that may resolve the variable.  If not, you
	// may be tempted to simply do: 

	// result = previous.resolveVariable(context, name);

	// But this would not work due to bug 6419278.  A fix is
	// available, please see the Release Notes.  However, a
	// workaround is the following.

	ValueExpression ve = context.getApplication().getExpressionFactory(). \
createValueExpression(context.getELContext(), "#{" + name + "}", Object.class);
	try {
	    result = ve.getValue(context.getELContext());
	}
	catch (PropertyNotFoundException pnfe) {
	    throw new EvaluationException(pnfe);
	}
	catch (ELException ele) {
	    throw new EvaluationException(ele);
	}
	return result;

    }
}

升级

本节介绍与升级和使用升级工具相关的已知问题和相应的解决方案。

从 Application Server Platform Edition 8 升级到 Application Server Platform Edition 9 时,不会直接升级在自定义路径(而非 install_dir/domains 目录)中创建的域。(ID 6165528)

如果运行升级实用程序并将 install_dir 标识为源安装目录,升级进程只升级在 install_dir/domains 目录下创建的域。在其他位置创建的域不会被升级。

解决方法

启动升级进程前,将所有域目录从不同位置复制到 install_dir/domains 目录中。

在某些 Linux 系统中,单击“启动升级向导”按钮之后,执行“就地升级”的安装程序无法启动升级工具。(6207337)

此问题已在多个 Linux 系统上出现,是 Java Desktop System 2 上最常见的问题,但在 RedHat 版本中也发现了此问题。

在最终安装程序屏幕上单击“启动升级工具”按钮后,安装程序无法启动升级工具以完成升级过程,并且无限期挂起,而不会返回命令提示符。

解决方法

如果使用命令行安装模式来运行就地升级,将不会遇到此问题。

Procedure使用命令行安装模式

  1. 如果您以 GUI 模式运行就地升级并且遇到此问题,请通过在启动安装程序的终端窗口中按 Ctrl+C 组合键来退出安装程序。

  2. 使用以下命令从终端窗口启动升级工具:


    install_dir/bin/asupgrade --source install_dir/domains --target install_dir 
    --adminuser adminuser--adminpassword adminpassword --masterpassword changeit

    adminuseradminpassword 的值应与要升级的安装所使用的值匹配。

  3. 在升级工具完成升级过程后,您还可以启动浏览器并输入以下 URL 来查看“关于”页面:

    file://install_dir/docs/about.html

    如果您还选择了用于注册产品的安装选项,请点击产品“关于”页面上提供的指向注册页面的链接。

升级工具不会传送所有 JVM 选项 (ID 6409650)

升级工具不传送 JVM 选项,例如那些与堆栈大小和堆大小相关的选项,这是因为它们应保留安装过程中指定的值。原因是,这些选项的值可能出于某些原因是针对当前版本的产品设置的。升级工具将记录一条消息,指明尚未传送哪些选项。

在升级之后复制 docroot 目录中的静态文档 (ID 6409641)

升级 Application Server 安装之后,将 docroot 目录中的所有静态文档复制到新的 docroot 目录中。如果执行了就地升级,则从安装的 domaindir 下的备份域目录复制文档。

在 Windows 上运行升级工具时必须关闭 Application Server 文件

在 Windows 上运行升级工具时,您必须关闭要升级的安装中的所有文件。如果某个文件仍然打开,则会看到升级工具挂起。

使用 XWSClientProviderXWSServerProvider 时不加密用户名令牌。(ID 6409652)

要在已升级的 Application Server 中使用 XWSCLientProvider 和 XWSServerProvider,必须修改使用这些提供程序的应用程序的部署描述符,以引用 XWSClientProvider 和 XWSServerProvider。

必须更改的部署描述符为 sun-web.xmlsun-ejb-jar.xml。如果升级工具在 sun-web.xmlsun-ejb-jar.xml 中发现 ClientProvider 和 ServerProvider,它会在升级日志中记录一条消息。

Web 容器

本节介绍已知的 Web 容器问题和相应的解决办法。

无法使用基于 Servlet 2.4 且包含空 <load-on-startup/> 元素的 web.xml 部署 WAR。(ID 6172006)

web.xml 中的可选 load-on-startup Servlet 元素表示相关的 Servlet 将在启动对其进行声明的 Web 应用程序期间被装入和初始化。


注 –

此限制仅适用于基于 Servlet 2.4 的 web.xml;可以使用基于 Servlet 2.5 的 web.xml 指定空 load-on-startup 元素。


此元素的可选内容是一个整数,用于表示该 Servlet 相对于 Web 应用程序的其他 Servlet 而被装入和初始化的顺序。空 <load-on-startup/> 表示顺序无关紧要,只要该 Servlet 在其包含的 Web 应用程序启动期间被装入并进行了初始化即可。

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 应用程序的部署失败。

向下兼容性问题:指定空的 <load-on-startup/> 在基于 Servlet 2.3 的 web.xml 中仍起作用。

解决方法

在使用基于 Servlet 2.4 的 web.xml 时指定 <load-on-startup/>0</load-on-startup/>,以表明 Servlet 装入顺序无关紧要。

无法编译资源受限服务器上的 JSP 页面。(ID 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

可以通过以下两种方式之一来实现:

以上任何一种设置都将阻止 ant 产生用于 javac 编译的新进程。

ParserUtils 从 Web 应用程序拾取解析器 (ID 6412405)

访问 JSP 时,在某些情况下可能会记录以下异常:


java.lang.AbstractMethodError: org.apache.xerces.dom.DeferredDocumentImpl.
setDocumentURI(Ljava/lang/String;)V

解决方法

将以下系统属性添加到 domain.xml 文件中:


<jvm-options>-Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces. \
internal.jaxp.DocumentBuilderFactoryImpl</jvm-options>

或者,也可以从 Web 应用程序的 WEB-INF/lib 中删除包含 org.apache.xerces 包的 JAR 文件。

未找到 EAR 捆绑的 JAR 中的 TLD。(Glassfish 问题 590)

捆绑在 EAR 文件中的 JAR 封装的 JSP 标记库无法由作为 EAR 一部分的 WAR 文件的 JSP 页面引用,即使该 WAR 文件的 META-INF/MANIFEST.MF 资源在其 Class-Path 清单属性中列出了标记库 JAR 文件。

访问 JSP 页面(在其中导入了在 EAR 文件的一个 JAR 文件中封装的标记库)时,类似于以下内容的错误消息将在服务器日志中显示,并且 JSP 页面将无法进行编译:


The absolute uri: <taglib_uri> cannot be resolved in either web.xml or 
the jar files deployed with this application

解决方法

将任何 JSP 标记库 JAR 文件捆绑到其 JSP 页面导入这些标记库的任何 WAR 文件的 WEB-INF/lib 目录中。

有关此错误的更多信息可以在 Glassfish 站点 (https://glassfish.dev.java.net/issues/show_bug.cgi?id=590) 上找到。

特定于平台的问题

在 Windows XP 和 Windows Server 2003 上设置 denyRemoteHost 和 allowRemoteHost 属性时,必须使用全限定域名 (ID 6377272)

在 Windows 系统上,即使 Windows 命令(例如 hostnameipconfig /all)以及 Java API InetAddress.getLocalHost().getHostName() 返回的是简短主机名,设置基于 IP 的请求过滤属性时也必须使用 Windows 主机的全限定域名(例如,myhost.mydomain.com),而不是简短名称(例如,只使用 myhost)。

例如,以下命令会拒绝由 Windows 主机 foobar 所进行的访问:

asadmin --user adminuser --password adminpasswd 
--echo server.http-service.virtual-server.server.property.denyRemoteHost=foobar.sun.com

请注意,主机名是带有 DNS 域名的全限定名 foobar.sun.com