Oracle 23ai Free中加载SLF4J-API与Password4j时出现NoClassDefFoundError问题求助
大家好,我最近在Oracle 23ai Free环境里折腾Password4j库时遇到了棘手的问题,想过来请教下各位大佬的经验。
问题现象
我尝试把SLF4J-API和Password4j(1.8.2/1.8.3版本)加载到Oracle 23ai Free数据库中,但是当运行Password4j里的Argon2实现时,总是抛出ORA-29532: Java调用被未捕获的Java异常终止,具体异常是java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory——明明我已经加载了SLF4J-API的jar包了。
更奇怪的是,同样的操作在Oracle 19c里用-v -thin -user这些参数执行loadjava命令就能正常工作,完全没有问题。我甚至升级到了Password4j 1.8.3版本,结果还是一样的报错,实在没辙了。
复现步骤
以下是我shell脚本里用到的几种loadjava命令尝试(分别加载SLF4J-API和Password4j的jar包):
# 第一种尝试 loadjava -r -v -f -s -g "$SCHEMA_NAME" -resolve -user "$SCHEMA_NAME/$SCHEMA_PASSWORD@$CONTAINER_NAME" "$jar_file" # 第二种尝试 loadjava -r -v -f -s -g "$SCHEMA_NAME" -append-resolver "((* -))" -jarsasdbobjects -user "$SCHEMA_NAME/$SCHEMA_PASSWORD@$CONTAINER_NAME" "$jar_file" # 第三种尝试(19c下可用的参数) loadjava -v -thin -user "$SCHEMA_NAME/$SCHEMA_PASSWORD@$CONTAINER_NAME" "$jar_file"
不管用哪种命令加载,只要运行Argon2的相关代码,大概率都会触发上面提到的NoClassDefFoundError异常。
预期行为
我原本以为在成功加载SLF4J-API和Password4j之后,就能在项目里正常使用这个库的功能了。
环境信息
- 操作系统:Docker中的Oracle Linux 8
- 数据库:Oracle 23ai Free
- JDK版本:
- 数据库内置:执行
SELECT dbms_java.get_ojvm_property(PROPSTRING=>'java.version') FROM dual结果为11.0.27 - 本地环境:OpenJDK 17.0.15 LTS(Red_Hat-17.0.15.0.6-2.0.1)
- 数据库内置:执行
额外上下文
我注意到一个细节:加载后的SLF4J类路径有点奇怪,显示的是org.slf4j///org/slf4j/...格式,而不是预期的org/slf4j/...(比如org.slf4j///org/slf4j/loggerfactory和org/slf4j/LoggerFactory)。
这是我手动加载SLF4J-API时的输出日志:
arguments: '-user' 'SEMA@FREEPDB1' '-verbose' '-resolve' 'slf4j-api-2.0.17.jar' creating : jar slf4j-api-2.0.17.jar (module org.slf4j) loading : jar slf4j-api-2.0.17.jar creating : resource META-INF/MANIFEST.MF (module org.slf4j) loading : resource META-INF/MANIFEST.MF creating : resource META-INF/LICENSE.txt (module org.slf4j) loading : resource META-INF/LICENSE.txt creating : class org/slf4j/ILoggerFactory (module org.slf4j) loading : class org/slf4j/ILoggerFactory creating : class org/slf4j/IMarkerFactory (module org.slf4j) loading : class org/slf4j/IMarkerFactory creating : class org/slf4j/Logger (module org.slf4j) loading : class org/slf4j/Logger creating : class org/slf4j/LoggerFactory (module org.slf4j) loading : class org/slf4j/LoggerFactory creating : class org/slf4j/LoggerFactoryFriend (module org.slf4j) loading : class org/slf4j/LoggerFactoryFriend creating : class org/slf4j/MDC$1 (module org.slf4j) loading : class org/slf4j/MDC$1 creating : class org/slf4j/MDC$MDCCloseable (module org.slf4j) loading : class org/slf4j/MDC$MDCCloseable creating : class org/slf4j/MDC (module org.slf4j) loading : class org/slf4j/MDC creating : class org/slf4j/Marker (module org.slf4j) loading : class org/slf4j/Marker creating : class org/slf4j/MarkerFactory (module org.slf4j) loading : class org/slf4j/MarkerFactory creating : class org/slf4j/event/DefaultLoggingEvent (module org.slf4j) loading : class org/slf4j/event/DefaultLoggingEvent creating : class org/slf4j/event/EventConstants (module org.slf4j) loading : class org/slf4j/event/EventConstants creating : class org/slf4j/event/EventRecordingLogger (module org.slf4j) loading : class org/slf4j/event/EventRecordingLogger creating : class org/slf4j/event/KeyValuePair (module org.slf4j) loading : class org/slf4j/event/KeyValuePair creating : class org/slf4j/event/Level (module org.slf4j) loading : class org/slf4j/event/Level creating : class org/slf4j/event/LoggingEvent (module org.slf4j) loading : class org/slf4j/event/LoggingEvent creating : class org/slf4j/event/SubstituteLoggingEvent (module org.slf4j) loading : class org/slf4j/event/SubstituteLoggingEvent creating : class org/slf4j/helpers/AbstractLogger (module org.slf4j) loading : class org/slf4j/helpers/AbstractLogger creating : class org/slf4j/helpers/BasicMDCAdapter$1 (module org.slf4j) loading : class org/slf4j/helpers/BasicMDCAdapter$1 creating : class org/slf4j/helpers/BasicMDCAdapter (module org.slf4j) loading : class org/slf4j/helpers/BasicMDCAdapter creating : class org/slf4j/helpers/BasicMarker (module org.slf4j) loading : class org/slf4j/helpers/BasicMarker creating : class org/slf4j/helpers/BasicMarkerFactory (module org.slf4j) loading : class org/slf4j/helpers/BasicMarkerFactory creating : class org/slf4j/helpers/CheckReturnValue (module org.slf4j) loading : class org/slf4j/helpers/CheckReturnValue creating : class org/slf4j/helpers/FormattingTuple (module org.slf4j) loading : class org/slf4j/helpers/FormattingTuple creating : class org/slf4j/helpers/LegacyAbstractLogger (module org.slf4j) loading : class org/slf4j/helpers/LegacyAbstractLogger
有没有可能是我加载jar包的方式不对?或者Oracle 23ai Free在类加载机制上有什么和19c不一样的地方?麻烦大家帮忙看看,谢谢啦!
内容来源于stack exchange

