当前位置: 首页 > 知识库问答 >
问题:

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

宁良平
2023-03-14

我有一个解决方法来解决我的特定错误,即将路径C:\ColdFusion10\cFusion\www root\WEB-INF\class添加到ColdFusion Class Path设置。但是,我不确定为什么这是必要的。详情如下:

我一直在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。java上的getDeclaredFields0(本机方法)。lang.Class。java上的privateGetDeclaredFields(Class.java:2317)。lang.Class。java上的privateGetPublicFields(Class.java:2350)。lang.Class。coldfusion上的getFields(Class.java:1378)。运行时。Java语言ObjectHandler。在coldfusion中初始化(ObjectHandler.java:35)。运行时。Java语言ObjectHandler。(ObjectHandler.java:30)。运行时。Java语言ReflectionCache。在coldfusion上获取(ReflectionCache.java:38)。运行时。Java语言JavaProxy。(JavaProxy.java:35)在coldfusion。运行时。Java语言JavaProxyFactory。coldfusion上的getProxy(JavaProxyFactory.java:121)。运行时。代理工厂。coldfusion上的getProxy(ProxyFactory.java:65)。运行时。C第页。coldfusion上的createObjectProxy(CFPage.java:5757)。运行时。C第页。coldfusion上的CreateObject(CFPage.java:5720)。运行时。C第页。coldfusion上的CreateObject(CFPage.java:5654)。运行时。C第页。coldfusion上的CreateObject(CFPage.java:5629)。运行时。C第页。创建对象(CFPage.java:5576),位于cfindex2ecfm915725705。运行页面(C:\ColdFusion10\cfusion\wwwroot\mbox\index.cfm:1)。运行时。CfJspPage。在coldfusion调用(CfJspPage.java:244)。tagext。lang.IncludeTag。coldfusion上的doStartTag(IncludeTag.java:444)。滤器包括过滤器。在coldfusion中调用(CfincludeFilter.java:65)。滤器IpFilter。在coldfusion中调用(IpFilter.java:64)。滤器应用程序过滤器。在coldfusion中调用(ApplicationFilter.java:449)。滤器RequestMonitorFilter。在coldfusion中调用(RequestMonitorFilter.java:48)。滤器监控过滤器。在coldfusion中调用(MonitoringFilter.java:40)。滤器路径过滤器。在coldfusion中调用(PathFilter.java:112)。滤器LicenseFilter。在coldfusion调用(LicenseFilter.java:30)。滤器例外过滤器。在coldfusion中调用(ExceptionFilter.java:94)。滤器BrowserDebugFilter。在coldfusion中调用(BrowserDebugFilter.java:79)。滤器ClientScopePersistenceFilter。在coldfusion中调用(ClientScopePersistenceFilter.java:28)。滤器浏览器过滤器。在coldfusion中调用(BrowserFilter.java:38)。滤器NoCacheFilter。调用(NoCacheFilter.java:46)。滤器全局过滤器。调用(GlobalsFilter.java:38)。滤器数据源过滤器。在coldfusion调用(DatasourceFilter.java:22)。滤器仙人掌过滤器。在coldfusion中调用(CachingFilter.java:62)。CfmServlet。coldfusion的服务(CfmServlet.java:219)。独自创立BootstrapServlet。服务(BootstrapServlet.java:89)。阿帕奇。卡特琳娜。果心应用程序过滤器链。org上的internalDoFilter(ApplicationFilterChain.java:305)。阿帕奇。卡特琳娜。果心应用程序过滤器链。coldfusion上的doFilter(ApplicationFilterChain.java:210)。班长事件监控ServletFilter。coldfusion上的doFilter(MonitoringServletFilter.java:42)。独自创立BootstrapFilter。doFilter(BootstrapFilter.java:46)位于org。阿帕奇。卡特琳娜。果心应用程序过滤器链。org上的internalDoFilter(ApplicationFilterChain.java:243)。阿帕奇。卡特琳娜。果心应用程序过滤器链。doFilter(ApplicationFilterChain.java:210)位于org。阿帕奇。卡特琳娜。果心标准包装阀。在org上调用(StandardWrapperValve.java:224)。阿帕奇。卡特琳娜。果心标准连接阀。在组织中调用(StandardContextValve.java:169)。阿帕奇。卡特琳娜。验证器。AuthenticatorBase。在org调用(AuthenticatorBase.java:472)。阿帕奇。卡特琳娜。果心标准主阀。在org调用(StandardHostValve.java:168)。阿帕奇。卡特琳娜。阀门。错误报告阀。在组织中调用(ErrorReportValve.java:98)。阿帕奇。卡特琳娜。阀门。检修阀。在org调用(AccessLogValve.java:928)。阿帕奇。卡特琳娜。果心标准发动机阀。在组织中调用(StandardEngineValve.java:118)。阿帕奇。卡特琳娜。连接器。郊狼适配器。服务(CoyoteAdapter.java:414)。阿帕奇。郊狼。http11.AbstractHttp11处理器。进程(AbstractHttp11Processor.java:987)。阿帕奇。郊狼。AbstractProtocol$AbstractConnectionHandler。过程(AbstractProtocol.java:539)。阿帕奇。公猫util。网JIoEndpoint$SocketProcessor。在java上运行(JIoEndpoint.java:298)。util。同时发生的线程池执行器。java上的runWorker(ThreadPoolExecutor.java:1145)。util。同时发生的ThreadPoolExecutor$Worker。在java上运行(ThreadPoolExecutor.java:615)。lang.Thread。运行(Thread.java:722)由:java引起。lang.ClassNotFoundException:javax。邮政存储在组织中。阿帕奇。卡特琳娜。装载机。WebappClassLoader。org上的loadClass(WebappClassLoader.java:1688)。阿帕奇。卡特琳娜。装载机。WebappClassLoader。loadClass(WebappClassLoader.java:1533)。。。55个以上

然而,如果我将其添加到测试页面,CF10可以找到

<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。类位于C:\ColdFusion9\wwwroot\WEB-INF\classes\its\util和C:\ColdFusion10\cfusion\wwwroot\WEB-INF\classes\its\util中(分别为CF9和CF10)。

如果我在CF管理员中手动将C:\ColdFusion10\cFusion\www root\WEB-INF\class添加到ColdFusion Class Path,它就可以工作。

我不确定为什么ColdFusion可以找到类,但是MboxReader类不能,除非我添加类路径。根据关于ColdFusion、Java和J2EE,ColdFusion应该在WEB-INF/类中加载类。

更新:

归档对象的父类加载器:

coldfusion.bootstrap.BootstrapClassLoader

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

org.apache.catalina.loader.WebappClassLoader

共有1个答案

江航
2023-03-14

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

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

EE服务器可以配置为首先在服务器上查看,然后才在WEB-INF/class/WEB-INF/lib上查看。此配置是特定于服务器和应用程序的,每个服务器的默认值不同(Tomcat默认值不同于webphere等)。

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

试着回答这些问题,你可以发布部分发现:

>

  • 哪个类找不到java.mail.Store

    抛出异常的类驻留在哪个类加载器中

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

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

  •  类似资料:
    • 我查过了,发现最接近的是这个,除了我没有任何向前的声明。我在基类中只有一个纯虚函数,我在子类中实现它,如下所示: 命令H 命令cpp 数字H 数字cpp 发生文件错误: 一个dd.cpp 添加H

    • 我有两个方法和抽象类的接口,它们实现了这个接口并从它重写了一个方法。我可以实例这个抽象类,而不重写接口的其他方法吗?或者我可以用具有另一个签名的方法替换此方法吗? UPD:谢谢你的回答,我真的在我的问题上犯了错误。我是否可以使用匿名类来扩展我的抽象类,而不重写来自实现的所有方法?我如何理解DragonK的回答,不,我需要创建类,这将是扩展抽象类和重写其他方法?

    • 我有个愚蠢的问题。我不明白为什么使用Projections的Spring数据存储库方法会产生这个编译错误。 我有一个存储库类 和投影(我有一个大的hibernate连接对象,我只想从中得到几个字段) 当我试图从一个服务调用方法时 我这样调用服务,编译错误就在这里。 我很确定,我这里有一个非常简单的错误...

    • 本文向大家介绍Java接口和抽象类实例分析,包括了Java接口和抽象类实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java的接口和抽象类。分享给大家供大家参考。具体分析如下: 对于面向对象编程来说,抽象是它的一大特征之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。这两者有太多相似的地方,又有太多不同的地方。很多人在初学的时候会以为它们可以随意互换使用,但是

    • 本文向大家介绍Kotlin 创建接口或者抽象类的匿名对象实例,包括了Kotlin 创建接口或者抽象类的匿名对象实例的使用技巧和注意事项,需要的朋友参考一下 一 ,定义接口和抽象类 二,创建对应的匿名对象 补充知识:android Kotlin 继承、派生、接口、构造方式,方法、属性重写 前言 kotlin 作为google官方android 开发语言,大势所趋,据传到2018底kotlin要全面替

    • 我正在做大学课程,并试图用GLFW建立一个窗口。我一直在关注我们要关注的文档和视频系列(Youtube上Cherno的Hazel引擎),但遇到了抽象类的问题。 我真的很难理解指针和抽象,所以我真的很难理解我在做什么,但我相信它试图从Window调用继承的“create”函数来构建WinWindow(之所以这样命名是因为它是Windows操作系统特有的),但我在WinWindow的第9行得到一个错误