【问题标题】:Liferay 6.2: ClassNotFoundException: javax.faces.webapp.FacesServlet when PACL is enabledLiferay 6.2:ClassNotFoundException:启用 PACL 时的 javax.faces.webapp.FacesServlet
【发布时间】:2023-07-14 11:36:02
【问题描述】:

我开发了一个 portlet 应用程序,它可以在 liferay-plugin-package.properties 中启用安全管理器:

security-manager-enabled=true

当应用程序启动时,我们会在 liferay 6.2 EE 和 6.2.1 CE 日志(Tomcat 7 包)中获得以下堆栈跟踪。它只发生一次,并且看起来不会破坏任何东西,尽管有这条消息,portlet 可以正常工作。如果我们在 portlet 的 liferay-plugin-package.properties 中禁用安全管理器,则不会发生此异常。这个类“javax.faces.webapp.FacesServlet”不在portlet的.WAR中,代码中也没有使用(至少没有直接使用,可能是依赖)。 portlet 包含这些门户依赖项,不确定是否相关:

portal-dependency-jars=jstl-api.jar,jstl-impl.jar

请问有其他人遇到过这个问题吗?有什么解决办法吗?

20:23:06,406 ERROR [localhost-startStop-1][BasePortalLifecycle:94] java.lang.ClassNotFoundException: javax.faces.webapp.FacesServlet
java.lang.ClassNotFoundException: javax.faces.webapp.FacesServlet
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
    at com.liferay.portal.kernel.util.InstanceFactory.newInstance(InstanceFactory.java:52)
    at com.liferay.portal.kernel.util.InstanceFactory.newInstance(InstanceFactory.java:27)
    at com.liferay.portal.kernel.servlet.SecureServlet.doPortalInit(SecureServlet.java:101)
    at com.liferay.portal.kernel.util.BasePortalLifecycle.portalInit(BasePortalLifecycle.java:44)
    at com.liferay.portal.kernel.util.PortalLifecycleUtil.register(PortalLifecycleUtil.java:64)
    at com.liferay.portal.kernel.util.PortalLifecycleUtil.register(PortalLifecycleUtil.java:56)
    at com.liferay.portal.kernel.util.BasePortalLifecycle.registerPortalLifecycle(BasePortalLifecycle.java:54)
    at com.liferay.portal.kernel.servlet.SecureServlet.init(SecureServlet.java:76)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:277)
    at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:274)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAsPrivileged(Subject.java:536)
    at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:309)
    at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:169)
    at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:123)
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1268)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1193)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1088)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5176)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5460)
    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.access$000(ContainerBase.java:133)
    at org.apache.catalina.core.ContainerBase$PrivilegedAddChild.run(ContainerBase.java:156)
    at org.apache.catalina.core.ContainerBase$PrivilegedAddChild.run(ContainerBase.java:145)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:875)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1113)
    at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1671)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)

【问题讨论】:

  • 可能重复?看看*.com/questions/18030543/…*.com/questions/22658185/…。这似乎与 Liferay PACL 无关。您需要确保 JSF jar 可用于您的 portlet - 在 WEB-INF/lib 中。
  • 你是对的,错误与 pacl 没有太大关系,尽管由于某些原因它只在启用 pacl 时发生。谢谢

标签: liferay portlet classnotfoundexception securitymanager


【解决方案1】:

看来 Maven 已经在 web.xml 中自动生成了这些条目,可能是由于我这边的错误处理:Javax faces 仅作为测试依赖项包含在 pom.xml 中,可能是我们犯了一次范围错误或其他问题像这样。

删除这些行后,一切正常。谢谢!

 1    <context-param>
 2        <param-name>javax.faces.PROJECT_STAGE</param-name>
 3        <param-value>Development</param-value>
 4    </context-param>
 5    <servlet>
 6        <servlet-name>Faces Servlet</servlet-name>
 7        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
 8        <load-on-startup>1</load-on-startup>
 9    </servlet>
10    <servlet-mapping>
11        <servlet-name>Faces Servlet</servlet-name>
12        <url-pattern>/faces/*</url-pattern>
13    </servlet-mapping>

【讨论】:

    最近更新 更多