Linux下Matlab R2020A启动log4j缺失报错的解决办法
Matlab R2020A启动报错(log4j移除相关)
问题描述
我在Linux系统上启动Matlab R2020A时出现以下错误。公司因安全问题移除了log4j,请问该错误是否有影响?若有影响,我有哪些解决选项?
错误日志
Exception in thread "CFB Source Control Executor": java.lang.NoClassDefFoundError: org/apache/log4j/Appender at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:264) at com.mathworks.util.ImplementorsCacheImpl.getService(ImplementorsCacheImpl.java:142) at com.mathworks.util.ImplementorsCacheImpl.getServicesForImplementors(ImplementorsCacheImpl.java:126) at com.mathworks.util.ImplementorsCacheImpl.getImplementors(ImplementorsCacheImpl.java:61) at com.mathworks.cmlink.management.registration.OsgiCMAdapterFactoryList.lookUpFactories(OsgiCMAdapterFactoryList.java:35) at com.mathworks.cmlink.management.registration.OsgiCMAdapterFactoryList.<init>(OsgiCMAdapterFactoryList.java:27) at com.mathworks.cmlink.management.registration.OsgiCMAdapterFactoryList.<clinit>(OsgiCMAdapterFactoryList.java:17) at com.mathworks.cmlink.management.registration.SingletonCMAdapterFactoryList.getCMAdapterFactoryLists(SingletonCMAdapterFactoryList.java:32) at com.mathworks.cmlink.management.registration.SingletonCMAdapterFactoryList.<clinit>(SingletonCMAdapterFactoryList.java:14) at com.mathworks.cmlink.management.pool.adapter.PrefBackedAdapterFactoryProvider.provide(PrefBackedAdapterFactoryProvider.java:29) at com.mathworks.cmlink.util.adapter.CMAdapterFactoryProviderDecorator.provide(CMAdapterFactoryProviderDecorator.java:19) at com.mathworks.cmlink.util.adapter.transformer.TransformableCMAdapterFactoryProvider.provide(TransformableCMAdapterFactoryProvider.java:24) at com.mathworks.cmlink.util.adapter.CMAdapterFactoryProviderDecorator.provide(CMAdapterFactoryProviderDecorator.java:19) at com.mathworks.cmlink.util.adapter.transformer.TransformableCMAdapterFactoryProvider.provide(TransformableCMAdapterFactoryProvider.java:24) at com.mathworks.cmlink.management.pool.PooledCmStatusCacheEntry.<init>(PooledCmStatusCacheEntry.java:77) at com.mathworks.cmlink.management.pool.PooledCmStatusCacheProvider$1.<init>(PooledCmStatusCacheProvider.java:101) at com.mathworks.cmlink.management.pool.PooledCmStatusCacheProvider.provideEntryFor(PooledCmStatusCacheProvider.java:98) at com.mathworks.cmlink.management.pool.PooledCmStatusCacheProvider.provideCacheUnsafe(PooledCmStatusCacheProvider.java:55) at com.mathworks.cmlink.management.pool.PooledCmStatusCacheProvider.provideCacheFor(PooledCmStatusCacheProvider.java:47) at com.mathworks.cmlink.management.cache.RootSearchingCmStatusCacheFactory.provideCacheFor(RootSearchingCmStatusCacheFactory.java:38) at com.mathworks.sourcecontrol.SCAdapterConnectionManager.updateCache(SCAdapterConnectionManager.java:174) at com.mathworks.sourcecontrol.SCAdapterConnectionManager.access$500(SCAdapterConnectionManager.java:29) at com.mathworks.sourcecontrol.SCAdapterConnectionManager$2.run(SCAdapterConnectionManager.java:78) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Appender at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 27 more Exception in thread "CFB Source Control Executor": java.lang.NoClassDefFoundError: Could not initialize class com.mathworks.cmlink.management.registration.SingletonCMAdapterFactoryList at com.mathworks.cmlink.management.pool.adapter.PrefBackedAdapterFactoryProvider.provide(PrefBackedAdapterFactoryProvider.java:29) at com.mathworks.cmlink.util.adapter.CMAdapterFactoryProviderDecorator.provide(CMAdapterFactoryProviderDecorator.java:19) at com.mathworks.cmlink.util.adapter.transformer.TransformableCMAdapterFactoryProvider.provide(TransformableCMAdapterFactoryProvider.java:24) at com.mathworks.cmlink.util.adapter.CMAdapterFactoryProviderDecorator.provide(CMAdapterFactoryProviderDecorator.java:19) at com.mathworks.cmlink.util.adapter.transformer.TransformableCMAdapterFactoryProvider.provide(TransformableCMAdapterFactoryProvider.java:24) at com.mathworks.cmlink.management.pool.PooledCmStatusCacheEntry.<init>(PooledCmStatusCacheEntry.java:77) at com.mathworks.cmlink.management.pool.PooledCmStatusCacheProvider$1.<init>(PooledCmStatusCacheProvider.java:101) at com.mathworks.cmlink.management.pool.PooledCmStatusCacheProvider.provideEntryFor(PooledCmStatusCacheProvider.java:98) at com.mathworks.cmlink.management.pool.PooledCmStatusCacheProvider.provideCacheUnsafe(PooledCmStatusCacheProvider.java:55) at com.mathworks.cmlink.management.pool.PooledCmStatusCacheProvider.provideCacheFor(PooledCmStatusCacheProvider.java:47) at com.mathworks.cmlink.management.cache.RootSearchingCmStatusCacheFactory.provideCacheFor(RootSearchingCmStatusCacheFactory.java:38) at com.mathworks.sourcecontrol.SCAdapterConnectionManager.updateCache(SCAdapterConnectionManager.java:174) at com.mathworks.sourcecontrol.SCAdapterConnectionManager.access$500(SCAdapterConnectionManager.java:29) at com.mathworks.sourcecontrol.SCAdapterConnectionManager$2.run(SCAdapterConnectionManager.java:78) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)
错误影响分析
从报错栈可以看出,缺失的org.apache.log4j.Appender类是Matlab源代码控制(Source Control)模块依赖的组件。这个错误只会影响Matlab的源代码控制功能:
- 无法使用Matlab内置的源代码管理集成(比如连接Git、SVN等版本控制系统)
- 源代码状态缓存更新失败,可能导致文件状态显示异常
- Matlab主程序核心功能(计算、脚本编辑、工具箱使用等)不会受影响,依然可以正常运行
解决选项
选项1:替换为安全版本的log4j
向公司安全部门申请符合安全要求的log4j 1.x安全补丁版本(比如log4j 1.2.17的安全修复版),将对应的log4j.jar文件放到Matlab的Java类路径中:
- 找到Matlab的Java库目录,通常在
$MATLAB_ROOT/java/jar/toolbox下($MATLAB_ROOT是Matlab安装路径,比如/usr/local/MATLAB/R2020a) - 将安全版的log4j.jar复制到该目录,或者添加到Matlab的Java类路径配置中
- 重启Matlab即可恢复源代码控制功能
选项2:禁用Matlab的源代码控制模块
如果不需要使用Matlab的源代码控制集成,可以直接禁用该模块,避免报错:
- 启动Matlab时添加参数跳过源代码控制初始化:
注意:matlab -nojvm-nojvm会禁用所有Java相关功能,除了源代码控制,还会影响GUI界面、部分工具箱,适合仅用命令行的场景 - 或者修改Matlab配置文件,禁用源代码控制服务:
- 编辑Matlab启动目录下的
startup.m文件,添加以下代码:com.mathworks.sourcecontrol.SCAdapterConnectionManager.disable; - 重启Matlab,源代码控制模块会被禁用,报错不再出现
- 编辑Matlab启动目录下的
选项3:升级Matlab版本
Matlab R2020a是较旧的版本,后续版本(比如R2021b及以后)已经替换或移除了对log4j 1.x的依赖,升级到新版本可以从根本上解决这个问题。需要确认公司是否允许升级,以及新版本是否兼容现有工作流程。
内容的提问来源于stack exchange,提问作者Mastiff
相关产品推荐
相关产品推荐

