本节介绍有关 Sun Java System Application Server Platform Edition 9 产品的已知问题和相应的解决方法。如果汇总说明未指明特定平台,则所有平台都可能出现此问题。本部分信息按以下内容进行组织:
默认情况下,在 $INSTALL/lib/package-appclient.xml 中有一个用于 domain1(由 asenv.conf 来指向)的 AS_ACC_CONFIG 变量的硬编码值。如果删除 domain1 并创建新域,将不会用新域名更新 AS_ACC_CONFIG 变量,从而导致 package-appclient 脚本失败。
执行以下操作之一:
保持 domain1 不变,围绕它创建其他域。
删除 domain1 并用新域名替换 $INSTALL/lib/package-appclient.xml 中用于 domain1 的硬编码值。如果 domain1 不存在,则每次创建新域时,都必须执行此操作。
可以在 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》。
管理控制台 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 中具有顶层 JAR 文件(在此情况下,为 reporter.jar),则当您部署客户机 JAR 时,该 JAR 的 MANIFEST 文件将覆盖客户机 JAR 的 MANIFEST 文件。
目前尚无解决方法。
已检查出,在 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 系统上发现此问题。在 Java Desktop System 2 上最为常见,但目前在 RedHat 版本中也发现了此问题。
在安装程序的最后一个屏幕上单击“完成”按钮后,安装程序无法启动包含产品“关于”页面或产品注册页面的浏览器窗口,并且安装程序将无限期地挂起而不返回命令提示符。
通过在启动安装程序的终端窗口中按 Ctrl+C 组合键来退出安装程序。执行此操作后,有时会启动包含产品“关于”页面或注册页面的浏览器窗口。如果不显示此窗口,请启动浏览器并输入以下 URL 以查看“关于”页面:
file://install_dir/docs/about.html
如果您还选择了用于注册产品的安装选项,请点击产品“关于”页面上提供的指向注册页面的链接。
启动 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 变量时)。
要解决此问题,请执行以下步骤:
通过运行 unset 或 unsetenv(这取决于您的 shell)来取消 JAVA_HOME 变量的设置。
运行带有 -javahome 选项的 setup 来指定安装程序使用的 JAVA_HOME。
本节介绍已知的生命周期管理问题和相应的解决方法。
[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 是传送相同周期计时器之间的最小时间间隔。
redelivery-interval-in-mills 是计时器服务在 ejbTimeout 失败后再次尝试传送之前等待的时间。
问题在于描述重新传送时间间隔属性与最小传送时间间隔属性之间关系的逻辑不正确,使您无法使用 GUI 或 CLI 来设置使最小传送时间间隔大于重新传送时间间隔的任何值。
必须始终将 minimum-delivery-interval-in-millis 设置为等于或大于 ejb-timer-service 属性 redelivery-interval-in-millis。Application Server 在确认 redelivery-interval-in-millis 的值是否大于 minimum-delivery-interval-in-millis 的值时使用了错误的验证检查,这是产生上述问题的原因。
使用这些属性的默认值,如下所示:
minimum-delivery-interval(default)=7000 redelivery-interval-in-millis(default)=5000
使用其他的值将导致产生错误。
本节列出了与 Java Persistence API 相关的已知问题和相应的解决方案。
有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=572。
请勿使用此类型的查询。
查询编译器不会检查 Java Persistence 语言的规范一章中定义的所有规则。特别是,它不检查以下各项:
函数参数的类型兼容性。
运算符、逻辑运算符和比较运算符的操作数的类型兼容性。
SELECT 子句对 ORDER BY 查询的要求。
无效的查询可能会进行编译,但可能会导致在运行时出现 SQLException。或者也可能出现以下情况:基础数据库比较宽松且支持 SQL,但在其他数据库上执行相同查询时会失败,并出现 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。
手动验证查询中的哪些内容是错误的。
使用不同的类名称。
有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=558。
请勿明确地列出 MappedSuperclass。
有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=578。
请勿在子类中使用 ManyToMany 关系。
有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=557。
使用 java.util.Collection 代替。
通过使用 Java 包装对象类型,映射到可为 null 的数据库列。
有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=404。
在将实例返回到客户机之前,以服务器端代码访问 LAZY 初始化关系。
如果查询选择关系字段,则在关系字段值为 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 ... |
例如:
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 |
如果主键类由 @IdClass 注释定义,EntityManager.find() 会对作为其他实体子类的实体错误地抛出 IllegalArgumentException。有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=595。
将最顶层超类的类用作 find() 方法的参数,并将结果强制转换为子类。
有关更多信息,请参见 https://glassfish.dev.java.net/issues/show_bug.cgi?id=643。
将 java.util.ArrayList 用作初始值。
本节介绍已知的 JavaServer Faces (JSF) 问题和相应的解决方案。请注意,通过访问 JSF 项目 Web 站点,可以找到有关 JSF 项目的附加信息以及提交可能遇到的所有 JSF 错误。
使用 VariableResolver 装饰来扩展表达式语言功能性的 JavaServer Faces 技术应用程序可能无法正常工作。
JavaServer Faces 技术规范 的第 10.4.5 条规定:
“替换默认的 PropertyResolver、VariableResolver、ActionListener、NavigationHandler、ViewHandler 或 StateManager 时,将利用装饰程序的设计模式,从而在您提供具有一个合适参数类型的构造函数时,自定义实现会收到对先前履行该职责的实现的引用。这样,自定义实现可以只覆盖功能的子集(或只提供某些附加功能)并将剩余部分委托给现有实现。”
在 Application Server 9 中,自定义的 VariableResolver 实现将收到未完全履行变量解析职责的“先前”的 VariableResolver。
我们建议不委托“先前”的 VariableResolver 来解析表达式,而是创建 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; } }
本节介绍与升级和使用升级工具相关的已知问题和相应的解决方案。
如果运行升级实用程序并将 install_dir 标识为源安装目录,升级进程只升级在 install_dir/domains 目录下创建的域。在其他位置创建的域不会被升级。
启动升级进程前,将所有域目录从不同位置复制到 install_dir/domains 目录中。
此问题已在多个 Linux 系统上出现,是 Java Desktop System 2 上最常见的问题,但在 RedHat 版本中也发现了此问题。
在最终安装程序屏幕上单击“启动升级工具”按钮后,安装程序无法启动升级工具以完成升级过程,并且无限期挂起,而不会返回命令提示符。
如果使用命令行安装模式来运行就地升级,将不会遇到此问题。
如果您以 GUI 模式运行就地升级并且遇到此问题,请通过在启动安装程序的终端窗口中按 Ctrl+C 组合键来退出安装程序。
使用以下命令从终端窗口启动升级工具:
install_dir/bin/asupgrade --source install_dir/domains --target install_dir --adminuser adminuser--adminpassword adminpassword --masterpassword changeit |
adminuser 和 adminpassword 的值应与要升级的安装所使用的值匹配。
在升级工具完成升级过程后,您还可以启动浏览器并输入以下 URL 来查看“关于”页面:
file://install_dir/docs/about.html
如果您还选择了用于注册产品的安装选项,请点击产品“关于”页面上提供的指向注册页面的链接。
升级工具不传送 JVM 选项,例如那些与堆栈大小和堆大小相关的选项,这是因为它们应保留安装过程中指定的值。原因是,这些选项的值可能出于某些原因是针对当前版本的产品设置的。升级工具将记录一条消息,指明尚未传送哪些选项。
升级 Application Server 安装之后,将 docroot 目录中的所有静态文档复制到新的 docroot 目录中。如果执行了就地升级,则从安装的 domaindir 下的备份域目录复制文档。
在 Windows 上运行升级工具时,您必须关闭要升级的安装中的所有文件。如果某个文件仍然打开,则会看到升级工具挂起。
要在已升级的 Application Server 中使用 XWSCLientProvider 和 XWSServerProvider,必须修改使用这些提供程序的应用程序的部署描述符,以引用 XWSClientProvider 和 XWSServerProvider。
必须更改的部署描述符为 sun-web.xml 和 sun-ejb-jar.xml。如果升级工具在 sun-web.xml 或 sun-ejb-jar.xml 中发现 ClientProvider 和 ServerProvider,它会在升级日志中记录一条消息。
本节介绍已知的 Web 容器问题和相应的解决办法。
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 页面但无法进行编译,并且服务器日志包含错误消息“无法执行命令”以及以下堆栈跟踪:
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 编译的新进程。
访问 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 封装的 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 系统上,即使 Windows 命令(例如 hostname 和 ipconfig /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。