在应用程序中添加UTF8支持并设置所需的JVM选项后,Tomcat(开发)无法启动

时间:2013-01-07 15:31:02

标签: tomcat configuration jvm myfaces

我无法启动Tomcat 7.0.27。这不是ServerFault问题,因为这是我的开发服务器。我正在使用IntelliJ IDEA,我的应用程序在向我的应用程序添加Filter之前没有运行任何错误。这个过滤器不是问题的原因,因为我在我的生产服务器上成功使用它,IDEA编译,打包并运行它而没有阻碍我开发的问题。 那我的问题是什么?

我注意到Tomcat冒出一个小错误。它不会登录到日志文件,而是读取:

Unable to use direct char[] access of java.lang.String
java.lang.NoSuchFieldException: count
    at java.lang.Class.getDeclaredField(Class.java:1899)
    at org.apache.myfaces.shared.util.StringCharArrayAccessor.<clinit>(StringCharArrayAccessor.java:63)
    at org.apache.myfaces.shared.util.StreamCharBuffer.readAsString(StreamCharBuffer.java:605)
    at org.apache.myfaces.shared.util.StreamCharBuffer.toString(StreamCharBuffer.java:631)
    at org.apache.myfaces.shared.renderkit.html.HtmlResponseWriterImpl.writeScriptContent(HtmlResponseWriterImpl.java:484)
    at org.apache.myfaces.shared.renderkit.html.HtmlResponseWriterImpl.endElement(HtmlResponseWriterImpl.java:416)
    at org.apache.myfaces.view.facelets.compiler.EndElementInstruction.write(EndElementInstruction.java:38)
    at org.apache.myfaces.view.facelets.compiler.UIInstructions.encodeBegin(UIInstructions.java:46)
    at org.apache.myfaces.view.facelets.compiler.UILeaf.encodeAll(UILeaf.java:505)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:764)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:764)
    at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView(FaceletViewDeclarationLanguage.java:1900)
    at org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:285)
    at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:115)
    at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:241)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:199)
    at org.apache.myfaces.webapp.MyFacesServlet.service(MyFacesServlet.java:112)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at com.buhaugane.web.filters.CharsFilter.doFilter(CharsFilter.java:38)
    at ...

我怀疑从在线查看我需要为VM添加一些参数给tomcat catalina.bat特别是告诉它要求使用utf-8运行JVM(我顺便使用Windows 8)可以规则我使用的过滤器是造成这种烦恼的唯一原因,因为删除它会修复所有内容过滤器唯一能做的就是在容器初始化时加载UTF-8值来修改HTTP请求:request.setCharacterEncoding(encoding);和当我尝试将以下内容添加到文件Tomcat无法启动时,抱怨我给出的变量包含无效值。它完全按原样编写。我想帮助解决这个问题,以便我的开发环境模仿生产。任何帮助表示赞赏。

我使用的变量已配置:

set JAVA_OPTS=%JAVA_OPTS% ^
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager ^
-Djava.util.logging.config.file=%CATALINA_BASE%\conf\logging.properties ^
-Xms128m -Xmx256m ^
=-Dfile.encoding=UTF-8

简而言之,我想消除可能导致未来问题的所有错误,我相信告诉Tomcat使用UTF-8 JVM会对我有所帮助。我发布的值是否有明显的错误?

2 个答案:

答案 0 :(得分:2)

您遇到的错误只是调试信息:https://github.com/grails/grails-core/blob/master/grails-web/src/main/groovy/org/codehaus/groovy/grails/web/util/StringCharArrayAccessor.java

关于代码,它尝试检测String类是否已被包装并具有一些其他方法。如果是,grails将使用优化版本,否则使用后备。

所以你可以忽略这个错误。

HIH

答案 1 :(得分:2)

问题在于您的 myfaces 版本。我有同样的问题,可以通过升级到最新的myfaces版本来修复它。特别是我更新了以下两个jar文件:

  • myfaces-api.jar(到版本2.1.10,之前我使用的是2.1.6)
  • myfaces-impl.jar(到版本2.1.10,之前我使用的是2.1.6)

此处发生错误:org.apache.myfaces.shared.util.StringCharArrayAccessor.<clinit>(StringCharArrayAccessor.java:63)

这适用于Java 6,但不适用于Java 7.我想已经从Java 7实现中删除了count字段。幸运的是,myfaces团队已经解决了这个问题。只需更新你的jar文件(见上文)。