Oracle 19c OJVM加载外部Jar依赖无法解析问题求助
解决Oracle 19c中loadjava加载JDK1.8编译程序时依赖Jar无法解析的问题
问题根源
Oracle JVM无法正确识别Eclipse导出的可运行JAR中嵌套的依赖类——这类JAR通常将外部依赖打包在内部子目录(如lib/),而loadjava默认不会递归扫描嵌套JAR中的类,最终导致依赖无法解析。
具体解决步骤
1. 拆分依赖与主类,分别加载
不要使用包含嵌套依赖的可运行JAR,改为单独加载外部依赖和主类:
- 提取出程序依赖的
external.jar,先加载到数据库:loadjava -user test_usr/PWD@testdb -verbose -resolve -resolver "((* TEST_USR) (* PUBLIC))" external.jar - 重新打包主类(仅包含自己编写的代码,不包含外部依赖),再加载主类的JAR或.class文件:
loadjava -user test_usr/PWD@testdb -verbose -resolve -resolver "((* TEST_USR) (* PUBLIC))" main-only.jar
2. 确认依赖类的归属与解析器规则
- 查询依赖类在数据库中的归属schema:
SELECT owner, object_name, object_type FROM all_objects WHERE object_name LIKE '%ExtClass%'; - 确保解析器规则包含依赖类所在的schema:如果依赖类在
TEST_USR下,规则((* TEST_USR) (* PUBLIC))有效;如果在PUBLIC下,需确保(* PUBLIC)存在。
3. 手动解析并排查详细错误
如果自动解析失败,手动触发解析并查看错误详情:
- 手动解析主类:
ALTER JAVA CLASS "Main_class" RESOLVE; - 查询详细错误信息:
重点检查类名大小写是否匹配(Oracle对Java类路径大小写敏感),确保代码中引用的SELECT line, position, text FROM USER_ERRORS WHERE TYPE = 'JAVA CLASS' AND NAME = 'Main_class';de.externalLibrary.ExtClass与数据库中加载的类路径完全一致。
4. 验证版本兼容性与权限
- 确保Java代码编译时指定目标版本为1.8:
javac -target 1.8 -source 1.8 YourMainClass.java - 确认数据库用户拥有必要权限:
GRANT CREATE JAVA TO test_usr; GRANT CREATE PROCEDURE TO test_usr;
关键注意事项
Eclipse导出的可运行JAR不适合直接用于loadjava,因为其嵌套依赖的打包方式不符合Oracle JVM的类加载逻辑,必须拆分依赖单独加载。
内容的提问来源于stack exchange,提问作者derby70
相关产品推荐
相关产品推荐

