java调用MATLAB绘图报错(IconEnumerationUtils方法报错)

1、问题

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: Could not initialize class com.mathworks.common.icons.IconEnumerationUtils
at com.mathworks.common.icons.ApplicationIcon.getIcon(ApplicationIcon.java:177)
at com.mathworks.hg.peer.FigureClientProxy.getClientIcon(FigureClientProxy.java:973)
at com.mathworks.hg.peer.FigureClientProxy$ShowEnabledHandler.initialize(FigureClientProxy.java:1247)
at com.mathworks.hg.peer.FigureClientProxy.initializeShowHandler(FigureClientProxy.java:551)
at com.mathworks.hg.peer.FigureClientProxy.doInitialize(FigureClientProxy.java:113)
at com.mathworks.hg.peer.FigureMediator.initializeClient(FigureMediator.java:105)
at com.mathworks.hg.peer.FigureHG2Mediator.initializeClient(FigureHG2Mediator.java:151)
at com.mathworks.hg.peer.FigurePeer.doInitializePeer(FigurePeer.java:472)
at com.mathworks.hg.peer.FigurePeer$2.run(FigurePeer.java:419)
at com.mathworks.jmi.AWTUtilities$Invoker$5$1.run(AWTUtilities.java:591)
at com.mathworks.mvm.context.ThreadContext$1.call(ThreadContext.java:76)
at com.mathworks.mvm.context.ThreadContext.callWithContext(ThreadContext.java:105)
at com.mathworks.mvm.context.ThreadContext.runWithContext(ThreadContext.java:73)
at com.mathworks.mvm.context.MvmContext.runWithContext(MvmContext.java:107)
at com.mathworks.jmi.AWTUtilities$Invoker$5.runWithOutput(AWTUtilities.java:588)
at com.mathworks.jmi.AWTUtilities$Invoker$2.watchedRun(AWTUtilities.java:475)
at com.mathworks.jmi.AWTUtilities$WatchedRunnable.run(AWTUtilities.java:436)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

2、原因分析

java集成matlab调用时需要调用matlab安装的MCR中的jar包的,

通过不断的去源码查找发现,IconEnumerationUtils方法中需要引用guava包,且使用了new MapMaker().softValues().makeMap()方法,我去guava包去查找,并没有这个方法,所以导致java调用matlab绘图时回报这个错

3、解决方案

方案1:

引用guava-collections-r03.jar包,其中就有new MapMaker().softValues().makeMap()这个方法。但在我的项目中同样会引发另一个问题,与项目中原来的guava包冲突,所以我用了方案2解决了问题

方案2:修改源码

将common.jar中IconEnumerationUtils类中的new MapMaker().softValues().makeMap()方法修改为new MapMaker().makeMap()即可。


版权声明:本文为liwei123111原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。