WebLogic 12.1.3.0.0遇到一个非常奇怪的问题。我有一个在部署过程中在NullPointerException
内部引起AdminServer
的应用程序,但该应用程序在发生错误后运行良好。
在部署期间发生NullPointerException
是因为部署过程未遵循我的部署描述符中的以下设置:
AppName.war/WEB-INF/weblogic.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app>
<context-root>AppName</context-root>
<container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>
</weblogic-web-app>
还有AppName.ear/META-INF/weblogic-application.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-application>
<prefer-application-packages>
<package-name>javax.faces.*</package-name>
</prefer-application-packages>
</weblogic-application>
由于忽略了这些设置,因此javax.faces.webapp.FacesServlet
类由系统类加载器(sun.misc.Launcher$AppClassLoader
)从$WL_HOME/wlserver/modules/glassfish.jsf_2.0.0.0_2-1-20.jar
而非WAR类加载器加载。由于NPE
中的某些编写不佳的代码,最终导致weblogic.servlet.internal.WebAnnotationProcessor
,它假定javax.faces.webapp.FacesServlet
将用@MultipartConfig
进行注释,而{{1}中则没有}。此类的正确版本位于glassfish.jsf_2.0.0.0_2-1-20.jar
中。
我已经通过远程调试AdminServer并打开Classloader Logging(显示以下内容)验证了所有这些信息:
AppName.ear/AppName.war/WEB-INF/lib/jsf-api-2.2.16.jar
此问题导致无法在管理控制台中打开GCL[61ba0535][AppName.ear@AppName.war] GCL.loadClass(javax.faces.webapp.FacesServlet)>
FCL[10d372cb][] FCL.loadClass(javax.faces.webapp.FacesServlet)>
FCL[10d372cb][] FCL.findClass(javax.faces.webapp.FacesServlet)>
GCL[75bc8d74][DomainLib] GCL.loadClass(javax.faces.webapp.FacesServlet)>
部署,b / c总是抛出错误(日志中带有上述NPE):
AppName
与此相反,当我在部署EAR的服务器中运行EAR时,完全相同的EAR可以正常工作。为了证明类加载工作正常,这里是日志:
The configuration for AppName is still being loaded from your last request, please wait a moment and retry.
我不知道该如何解决...为什么AdminServer会完全忽略EAR中的部署描述符,而运行EAR的服务器会正确设置所有内容?
任何想法都会受到赞赏。