实例化Java对象时发生异常。该类不能是接口或抽象类。错误:javax / mail / Store

时间:2013-12-05 23:26:49

标签: java coldfusion classpath coldfusion-10

我有一个针对我的特定错误的解决方法,即将路径C:\ColdFusion10\cfusion\wwwroot\WEB-INF\classes添加到ColdFusion类路径设置。但是,我不确定为什么这是必要的。详情如下:

我一直在使用遗产[我不知道是谁编写它或它来自何处] ColdFusion 9中的Java类来帮助读取和解析邮箱文件。当我升级到ColdFusion 10时,它停止了工作。这是一个简短的例子:

<cfset archive = createObject("Java", "its.util.MBoxReader")>
<cfdump var="#archive#">

在CF9上有效。在CF10上,它会生成以下消息:

  

对象实例化异常。   实例化Java对象时发生异常。该类不能是接口或抽象类。错误:javax / mail / Store。

这是堆栈跟踪:

  

java.lang.NoClassDefFoundError:javax / mail / Store at   java.lang.Class.getDeclaredFields0(Native Method)at   java.lang.Class.privateGetDeclaredFields(Class.java:2317)at at   java.lang.Class.privateGetPublicFields(Class.java:2350)at   java.lang.Class.getFields(Class.java:1378)at   coldfusion.runtime.java.ObjectHandler.Initialize(ObjectHandler.java:35)     在   coldfusion.runtime.java.ObjectHandler。(ObjectHandler.java:30)     在   coldfusion.runtime.java.ReflectionCache.get(ReflectionCache.java:38)     在coldfusion.runtime.java.JavaProxy。(JavaProxy.java:35)at   coldfusion.runtime.java.JavaProxyFactory.getProxy(JavaProxyFactory.java:121)     在coldfusion.runtime.ProxyFactory.getProxy(ProxyFactory.java:65)at   coldfusion.runtime.CFPage.createObjectProxy(CFPage.java:5757)at   coldfusion.runtime.CFPage.CreateObject(CFPage.java:5720)at   coldfusion.runtime.CFPage.CreateObject(CFPage.java:5654)at   coldfusion.runtime.CFPage.CreateObject(CFPage.java:5629)at   coldfusion.runtime.CFPage.CreateObject(CFPage.java:5576)at   cfindex2ecfm915725705.runPage(C:\ ColdFusion10 \ cfusion \ wwwroot的\ MBOX \ index.cfm:1)     在coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:244)at   coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:444)at at   coldfusion.filter.CfincludeFilter.invoke(CfincludeFilter.java:65)at   coldfusion.filter.IpFilter.invoke(IpFilter.java:64)at   coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:449)     在   coldfusion.filter.RequestMonitorFilter.invoke(RequestMonitorFilter.java:48)     在   coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:40)     在coldfusion.filter.PathFilter.invoke(PathFilter.java:112)at   coldfusion.filter.LicenseFilter.invoke(LicenseFilter.java:30)at   coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:94)at   coldfusion.filter.BrowserDebugFilter.invoke(BrowserDebugFilter.java:79)     在   coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28)     在coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38)at   coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter.java:46)at   coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38)at at   coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22)     在coldfusion.filter.CachingFilter.invoke(CachingFilter.java:62)at   coldfusion.CfmServlet.service(CfmServlet.java:219)at   coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89)     在   org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)     在   org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)     在   coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:42)     在   coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46)     在   org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)     在   org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)     在   org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)     在   org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)     在   org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)     在   org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)     在   org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)     在   org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)     在   org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)     在   org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:414)     在   org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)     在   org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:539)     在   org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run(JIoEndpoint.java:298)     在   java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)     在   java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:615)     在java.lang.Thread.run(Thread.java:722)引起:   java.lang.ClassNotFoundException:javax.mail.Store at   org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1688)     在   org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1533)     ......还有55个

但是,如果我将其添加到我的测试页面,CF10可以找到&amp;加载javax.mail.Store:

<cfset store = createObject("Java", "javax.mail.Store")>
<cfdump var="#store#">

javax.mail.Store出现在ColdFusion附带的mail.jar文件中,分别位于CF9和CF10上的C:\ColdFusion9\libC:\ColdFusion10\cfusion\lib

MboxReader.class位于C:\ColdFusion9\wwwroot\WEB-INF\classes\its\utilC:\ColdFusion10\cfusion\wwwroot\WEB-INF\classes\its\util(分别为CF9和CF10)。

如果我手动将C:\ColdFusion10\cfusion\wwwroot\WEB-INF\classes添加到CF管理员的ColdFusion类路径中,它可以正常工作。

我不确定为什么ColdFusion可以找到该类,但除非我添加类路径,否则MboxReader类不能。根据{{​​3}},ColdFusion应该在WEB-INF / classes中加载类。

更新

archive对象的父类加载器:

coldfusion.bootstrap.BootstrapClassLoader

javax.mail.Store对象的父类加载器:

org.apache.catalina.loader.WebappClassLoader

1 个答案:

答案 0 :(得分:4)

似乎某些类依赖于javax.mail.Store,但它无法在运行时找到它。如果你可以发布完整的堆栈跟踪,我们可以看到它是哪个类。

试着看看如何在coldfusion中设置类加载器链,默认包含WEB-INF / classes,然后是WEB-INF / lib的所有jar。

可以将EE服务器配置为首先在服务器上查找,然后在WEB-INF / classes / WEB-INF / lib上查找。此配置是服务器和应用程序特定的,每个服务器具有不同的默认值(Tomcat默认值与websphere不同等)。

如果Coldfusion使用Java 7,您可以使用JHades打印类加载器链并对类路径执行一些查询,以查看几个有问题的类的不同版本的位置。

尝试回答这些问题,您可以随时发布部分调查结果:

  • 哪个班级没有找到java.mail.Store

  • 在哪个类加载器中,抛出异常的类存在于

  • 对于有问题的类(javax.mail.Store和未找到它的类)发布类路径上存在的不同版本,每个类加载器(JHades可以帮助)

  • 如何配置类加载器链设置,配置的优先级等等。