数据库:oracle 19.14
系统:rhel8.6
异常描述:一朋友遇到在输入sql /nolog,不能正常进入sql命令行,sql*plus却可以正常进入,报警java.util.ServiceConfigurationError,如下所示:
查Mos资料,显示在数据库升级至19.14(Patch 33515361)后,确实存在SQLcl fails with java.util.ServiceConfigurationError问题.
具体报错如下:
$ sql Exception in thread "main" java.util.ServiceConfigurationError: oracle.dbtools.extension.SQLCLService: Provider oracle.dbtools.raptor.scriptrunner.commands.liquibase.liquibaseCommand could not be instantiated at java.util.ServiceLoader.fail(ServiceLoader.java:232) at java.util.ServiceLoader.access$100(ServiceLoader.java:185) at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:384) at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404) at java.util.ServiceLoader$1.next(ServiceLoader.java:480) at oracle.dbtools.extension.SQLCLServices.registerServices(SQLCLServices.java:48) at oracle.dbtools.raptor.scriptrunner.cmdline.SqlCli.(SqlCli.java:220) at oracle.dbtools.raptor.scriptrunner.cmdline.SqlCli.main(SqlCli.java:441) Caused by: java.lang.NoClassDefFoundError: liquibase/exception/DatabaseException at java.lang.Class.getDeclaredConstructors0(Native Method) at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671) at java.lang.Class.getConstructor0(Class.java:3075) at java.lang.Class.newInstance(Class.java:412) at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:380) ... 5 more Caused by: java.lang.ClassNotFoundException: liquibase.exception.DatabaseException at java.net.URLClassLoader.findClass(URLClassLoader.java:387) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ... 10 more
另外,如果只是jackson-databind.jar文件没有,SQLcl报以下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper at oracle.dbtools.versions.CheckForUpdates.<clinit>(CheckForUpdates.java:215) at oracle.dbtools.raptor.scriptrunner.cmdline.SqlCli.handleUpdates(SqlCli.java:508) at oracle.dbtools.raptor.scriptrunner.cmdline.SqlCli.main(SqlCli.java:464) Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.ObjectMapper at java.net.URLClassLoader.findClass(URLClassLoader.java:387) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ... 3 more
异常原因:
RDBMS RU19.14(Patch 33515361) removes the following jar files.
$ORACLE_HOME/sqldeveloper/sqldeveloper/lib/ext/liquibase-core.jar
$ORACLE_HOME/sqldeveloper/sqldeveloper/lib/jackson-databind.jar
解决方案:
Please restore liquibase-core.jar and jackson-databind.jar files from $ORACLE_HOME/.patch_storage
backup files:
$ORACLE_HOME/.patch_storage/33515361_Jan_13_2022_06_14_07/files/sqldeveloper/sqldeveloper/lib/ext/liquibase-core.jar
$ORACLE_HOME/.patch_storage/33515361_Jan_13_2022_06_14_07/files/sqldeveloper/sqldeveloper/lib/jackson-databind.jar
Restore liquibase-core.jar:
$ cd $ORACLE_HOME/.patch_storage/33515361_Jan_13_2022_06_14_07/files/sqldeveloper/sqldeveloper/lib/ext $ cp liquibase-core.jar $ORACLE_HOME/sqldeveloper/sqldeveloper/lib/ext
Restore jackson-databind.jar:
$
cd $ORACLE_HOME/.patch_storage/33515361_Jan_13_2022_06_14_07/files/sqldeveloper/sqldeveloper/lib
$ cp jackson-databind.jar $ORACLE_HOME/sqldeveloper/sqldeveloper/lib
以上为Mos资料,实际Troubleshooting过程如下:
将相应的文件拷贝到对应目录后,执行sql /nolog,报错如下:
检查发现两个文件的属性未做更改,如下图所示:
按如下修改文件属性.
如下图所示问题依旧,重启系统、重新拷贝文件后问题依然存在.
最后将两个文件都放到$ORACLE_HOME/sqldeveloper/sqldeveloper/lib/ext目录下,成功进入sql命令行.
以下为按Mos提供的解决方案成功解决异常的案例图片.