Apache Tiles 失败并出现错误,但仅当日志级别设置大于 INFO 时?
Posted
技术标签:
【中文标题】Apache Tiles 失败并出现错误,但仅当日志级别设置大于 INFO 时?【英文标题】:Apache Tiles fails with error, but only when logging level set greater than INFO? 【发布时间】:2015-05-31 22:01:17 【问题描述】:我们有一个在 Tomcat 7.0.55 上运行并使用 Apache Tiles 2.1.4 的 Tomcat 应用程序。
我们的 Apache Tiles 设置适用于将 Log4j 日志设置为 INFO 或任何更大(WARN 或 ERROR)的日志。但是将其设置为 DEBUG、TRACE 或 ALL,我在 Tomcat 启动时收到此错误并且启动完全失败。
编辑:如果这种情况一直发生,我会理解的,不会在这里发帖。这是一个奇怪的、值得 *** 的问题,原因有两个:
1) 我们根本没有使用 Portlet。任何地方都不应该有任何对 Portlet 代码的调用。 2) 作为 (1) 的推论,当日志记录级别设置为低于 DEBUG 时,应用程序运行良好。仅当日志记录设置为 DEBUG、TRACE 或 ALL 时才会发生此错误。
2015-03-27 07:18:44,453 INFO [localhost-startStop-1] org.apache.tiles.context.AbstractTilesApplicationContextFactory - Initializing Tiles2 application context. . .
2015-03-27 07:18:44,460 INFO [localhost-startStop-1] org.apache.tiles.context.AbstractTilesApplicationContextFactory - Finished initializing Tiles2 application context.
2015-03-27 07:18:44,472 INFO [localhost-startStop-1] org.apache.tiles.factory.TilesContainerFactory - Initializing Tiles2 container. . .
2015-03-27 07:18:44,538 ERROR [localhost-startStop-1] org.springframework.web.context.ContextLoader - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'tilesConfigurer' defined in ServletContext resource [/WEB-INF/spring/webmvc-context.xml]: Invocation of init method failed; nested exception is org.apache.tiles.portle
t.context.NotAPortletEnvironmentException: Cannot access portlet classes
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1482)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:628)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:389)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:294)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4992)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5490)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:649)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1083)
at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1880)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.tiles.portlet.context.NotAPortletEnvironmentException: Cannot access portlet classes
at org.apache.tiles.portlet.context.PortletTilesRequestContextFactory.<init>(PortletTilesRequestContextFactory.java:71)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
at java.lang.Class.newInstance(Class.java:438)
at org.apache.tiles.context.ChainedTilesRequestContextFactory.init(ChainedTilesRequestContextFactory.java:100)
at org.apache.tiles.factory.TilesContainerFactory.storeContainerDependencies(TilesContainerFactory.java:429)
at org.apache.tiles.factory.TilesContainerFactory.initializeContainer(TilesContainerFactory.java:368)
at org.apache.tiles.factory.TilesContainerFactory.createTilesContainer(TilesContainerFactory.java:287)
at org.apache.tiles.factory.TilesContainerFactory.createContainer(TilesContainerFactory.java:231)
at org.apache.tiles.startup.BasicTilesInitializer.createContainer(BasicTilesInitializer.java:117)
at org.apache.tiles.startup.BasicTilesInitializer.initialize(BasicTilesInitializer.java:53)
at org.springframework.web.servlet.view.tiles2.TilesConfigurer.afterPropertiesSet(TilesConfigurer.java:339)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1541)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1479)
... 25 more
Caused by: java.lang.NoClassDefFoundError: javax/portlet/PortletRequest
at org.apache.tiles.portlet.context.PortletTilesRequestContextFactory.<init>(PortletTilesRequestContextFactory.java:66)
... 40 more
Caused by: java.lang.ClassNotFoundException: javax.portlet.PortletRequest
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
... 41 more
【问题讨论】:
【参考方案1】:引起:java.lang.NoClassDefFoundError: javax/portlet/PortletRequest
NoClassDefFoundError
与运行时丢失的类文件有关,该文件在编译时可用。在你的情况下,tomcat。如果您使用的是 Maven,请确保您的依赖范围涵盖运行时。你战争中的 lib 目录应该有 jar。可能如下:
http://mvnrepository.com/artifact/javax.portlet/portlet-api/2.0
但它似乎在编译时可用,所以先检查那里。
如果此 jar 依赖项应该在应用服务器级别,则需要进入 /lib/ext
tomcat 文件夹。
编辑(对评论 1 的回应):似乎 apache tile 正在使用它,甚至验证不需要 portlet。正如代码所要求的那样,它坚持这样做。请检查您的编译以查看它是否有可用的 jar,因为如果有,它在运行时需要它。
2015-03-27 07:18:44,538 错误 [localhost-startStop-1] org.springframework.web.context.ContextLoader - 上下文初始化失败 org.springframework.beans.factory.BeanCreationException:在 ServletContext 资源 [/WEB-INF/spring/webmvc-context.xml] 中定义名称为“tilesConfigurer”的 bean 创建错误:调用 init 方法失败;嵌套异常是 org.apache.tiles.portle t.context.NotAPortletEnvironmentException:无法访问 portlet 类
原因:org.apache.tiles.portlet.context.NotAPortletEnvironmentException:无法访问 portlet 类 在 org.apache.tiles.portlet.context.PortletTilesRequestContextFactory.(PortletTilesRequestContextFactory.java:71)
原因:java.lang.NoClassDefFoundError: javax/portlet/PortletRequest 在 org.apache.tiles.portlet.context.PortletTilesRequestContextFactory.(PortletTilesRequestContextFactory.java:66)
【讨论】:
问题是,我们根本没有使用 Portlet,而且当日志记录设置得较低时,应用程序也能正常工作。我将编辑问题以添加这一点信息 - 很好。 查看编辑,不确定日志记录,但令人惊讶的是它在日志记录的基础上有所不同。那么,该应用程序在磁贴功能上运行良好,还是安静地失败了?它附加到哪些日志文件?日志记录配置更改是否有可能导致问题不被记录,而不是它们不发生? 将日志级别设置为“WARN”、“INFO”或“ERROR”时,应用程序可以正常工作。如跟踪中所示,它以“错误”级别严重失败,因此它真的不可能默默地失败。错误出现在控制台中并停止启动,所以实际上没有什么可以检查日志文件的。我同意这种差异是基于日志级别的,这很奇怪,我以前从未见过。以上是关于Apache Tiles 失败并出现错误,但仅当日志级别设置大于 INFO 时?的主要内容,如果未能解决你的问题,请参考以下文章
Java、Spring、Apache Tiles 错误:无法解析名称为“dispatcher”的 servlet 中名称为“index”的视图
org.apache.tiles.util.TilesIOException:包含路径'/login.jsp'的JSPException
Apache Tiles 3:org.apache.tiles.template.NoSuchAttributeException:找不到属性'title'
JspTaglib ["http://tiles.apache.org/tags-tiles"] 未定义:不能分配给瓷砖