Java 呼叫Liferay服务生成器';s XXXLocalServiceUtil引发ClassNotFoundException

Java 呼叫Liferay服务生成器';s XXXLocalServiceUtil引发ClassNotFoundException,java,jakarta-ee,liferay,liferay-6,liferay-ide,Java,Jakarta Ee,Liferay,Liferay 6,Liferay Ide,我正试图从portlet B调用XXXLocalServiceUtil方法,该方法已使用服务生成器在portlet a上创建。 我在portlet B的/WEB-INF/lib中导入了与portlet A完全相同的jar,但正如日志中所示,抛出了ClassNotFoundException。 有什么想法吗 大宗报价 13:04:25904错误[http-bio-8080-exec-77][render\u portlet\u jsp:132]空 java.lang.RuntimeExceptio

我正试图从portlet B调用XXXLocalServiceUtil方法,该方法已使用服务生成器在portlet a上创建。 我在portlet B的/WEB-INF/lib中导入了与portlet A完全相同的jar,但正如日志中所示,抛出了ClassNotFoundException。 有什么想法吗

大宗报价 13:04:25904错误[http-bio-8080-exec-77][render\u portlet\u jsp:132]空 java.lang.RuntimeException:java.lang.ClassNotFoundException不是有效的异常 在com.liferay.custom.action.service.AuditUserLocalServiceClp.addAuditUser(AuditUserLocalServiceClp.java:763)上 在com.liferay.custom.action.service.AuditUserLocalServiceUtil.addAuditUser(AuditUserLocalServiceUtil.java:287) 在com.liferay.calendar.listeners.CalendarBookingListener.onAfterCreate(CalendarBookingListener.java:73)上 在com.liferay.calendar.listeners.CalendarBookingListener.onAfterCreate(CalendarBookingListener.java:1)上 在com.liferay.portal.model.BaseModelListener.onAfterCreate(BaseModelListener.java:1)上 在com.liferay.portal.service.persistence.impl.BasePersistenceImpl.update(BasePersistenceImpl.java:337)上 位于com.liferay.portal.dao.shard.advice.shardPersistenceReadvice.invoke(shardPersistenceReadvice.java:54) 位于com.liferay.calendar.service.impl.CalendarBookingLocalServiceImpl.addCalendarBooking(CalendarBookingLocalServiceImpl.java:174) 在com.liferay.portal.spring.aop.ServiceBeanMethodInvocation.procedure(ServiceBeanMethodInvocation.java:115)上 位于com.liferay.portal.spring.transaction.DefaultTransactionExecutor.execute(DefaultTransactionExecutor.java:62) 位于com.liferay.portal.spring.transaction.TransactionInterceptor.invoke(TransactionInterceptor.java:51) 在com.liferay.portal.spring.aop.servicebeanmethodinactione.procedure(servicebeanmethodinactione.java:111) 在com.liferay.portal.spring.aop.chaineablemethodadvice.invoke(chaineablemethodadvice.java:56) 在com.liferay.portal.spring.aop.servicebeanmethodinactione.procedure(servicebeanmethodinactione.java:111) 在com.liferay.portal.spring.aop.chaineablemethodadvice.invoke(chaineablemethodadvice.java:56) 在com.liferay.portal.spring.aop.servicebeanmethodinactione.procedure(servicebeanmethodinactione.java:111) 在com.liferay.portal.spring.aop.chaineablemethodadvice.invoke(chaineablemethodadvice.java:56) 在com.liferay.portal.spring.aop.servicebeanmethodinactione.procedure(servicebeanmethodinactione.java:111) 在com.liferay.portal.spring.aop.chaineablemethodadvice.invoke(chaineablemethodadvice.java:56) 在com.liferay.portal.spring.aop.servicebeanmethodinactione.procedure(servicebeanmethodinactione.java:111) 大宗报价


XXXLocalServiceUtil仅在Portlet A中可用。要使您的服务对这两个Portlet都可用,请使它们在服务器级别上全局可用


在Tomcat中,您应该将services.jar文件放在/Tomcat/lib/ext中,并且不要忘记从portlet本身删除该jar。此更改后必须重新启动服务器。

假设您的项目的项目/WAR名称为a-portlet和b-portlet:

a-portlet的服务将在
a-service.jar
中提供,它位于
a-portlet/WEB-INF/lib
中。通过编辑
b-portlet/WEB-INF/liferay plugin package.properties
并添加

required-deployment-contexts=a-portlet   
这将使a-portlet的
a-service.jar
可供b-portlet使用,并且只有在成功部署a-portlet的情况下才能部署b-portlet。在重新部署a-portlet时,它还将重新部署b-portlet


或者,您可以使
a-service.jar
在全局类路径上可用,但这意味着每次更改它时服务器都会重新启动。

要在portlet a和B之间共享service.jar,请添加

required-deployment-contexts=a-portlet
b-portlet/docroot/WEB-INF/liferay插件包。属性
并运行“antall”,它会自动将a-portlet-service.jar放入
b-portlet/docroot/WEB-INF/lib

还有一个细节,portlet必须有不同的包。。。别问我为什么……

我试了你的建议,但第一次就奏效了。在重新构建和重新部署portlet B(顺便说一句,它是social calendar的扩展)之后,会抛出相同的异常,即使在重新启动tomcat之后,该异常也会保持不变。确保JAR已从两个portlet中删除,然后重新部署。也可以进行干净的部署-删除所有war应用程序,清理/temp/和/work/文件夹,然后再次启动门户并部署这两个portlet。是的,我还必须从原始portlet a中删除jar以及清理temp和work文件夹。