我有一个针对我的特定错误的解决方法,即将路径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\lib
和C:\ColdFusion10\cfusion\lib
。
MboxReader.class
位于C:\ColdFusion9\wwwroot\WEB-INF\classes\its\util
和C:\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
答案 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可以帮助)
如何配置类加载器链设置,配置的优先级等等。