micronaut 不自带 oracle jdbc 驱动,必须显式声明 ojdbc 依赖(如 ojdbc11:23.10.0.0),并正确配置 driverclassname、url、username、password 和 dialect;adb 场景可使用 ocid + walletpassword 自动解析,但 wallet 必须解压至 src/main/resources/wallet 且密码需单引号包裹;graalvm 原生镜像还需注册反射和资源。

Oracle JDBC 驱动必须显式声明,Micronaut 不自带
Micronaut 本身不捆绑 Oracle JDBC 驱动(ojdbc8.jar 或 ojdbc11.jar),必须手动引入。否则启动时会抛出 java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver 或连接失败提示 No suitable driver found for jdbc:oracle:thin:@...。
使用 Maven 时,在 pom.xml 中添加对应版本的依赖(注意 Oracle 官方要求接受许可协议):
<dependency><groupid>com.oracle.database.jdbc</groupid><artifactid>ojdbc11</artifactid><version>23.10.0.0</version></dependency>
Gradle 用户需在 build.gradle 中添加:
implementation 'com.oracle.database.jdbc:ojdbc11:23.10.0.0'
⚠️ 常见错误:用错 artifactId(比如写成 ojdbc8 却配了 Java 17+ 运行时)、或未声明 runtimeOnly 作用域导致打包后缺失驱动。
application.yml 中 datasources 配置的关键字段不能省略
Oracle Autonomous Database(ADB)场景下,Micronaut 支持通过 ocid 和 walletPassword 自动解析连接信息;但普通 Oracle DB(如本地、OCI VM 上的数据库)必须显式提供完整 JDBC URL 和驱动类名。
以下配置项缺一不可:
-
url:格式为jdbc:oracle:thin:@//host:port/service_name(非 SID)或jdbc:oracle:thin:@host:port:SID -
driverClassName:固定为oracle.jdbc.driver.OracleDriver(旧版)或oracle.jdbc.OracleDriver(新版推荐) -
username和password:明文或通过${DB_PASSWORD}引用环境变量 -
dialect:设为ORACLE,否则 Micronaut Data 可能生成错误 SQL(如用limit替代rownum)
示例:
datasources:
default:
url: jdbc:oracle:thin:@//adb.example.oraclecloud.com:1522/adb123456789.us-ashburn.adb.oraclecloud.com
driverClassName: oracle.jdbc.OracleDriver
username: ${DB_USER}
password: ${DB_PASS}
dialect: ORACLE
Oracle Wallet 配置只适用于 ADB,且需正确解压路径
当连接 Oracle Autonomous Database 时,Micronaut 允许跳过 URL,改用 ocid + walletPassword 自动加载 Wallet 文件。但前提是 Wallet ZIP 已下载并解压到默认位置:src/main/resources/wallet(不是任意路径)。
常见问题:
- Wallet ZIP 未解压,仅把压缩包放进去 → 启动报错
Cannot find mksso library - 解压后文件夹名不是
wallet(如wallet_ATP)→ Micronaut 找不到tnsnames.ora -
walletPassword包含特殊字符(如$、:)未用单引号包裹 → YAML 解析失败
正确写法:
micronaut:
application:
name: ocidemo
datasources:
default:
ocid: ocid1.autonomousdatabase.oc1.iad.aaaaaaa...
walletPassword: 'My$ecureP@ssw0rd'
username: admin
password: 'Another$tr0ng1'
GraalVM 原生镜像需额外注册反射和资源
若你用 native-image 构建原生可执行文件,Oracle JDBC 驱动内部大量使用反射和动态资源加载(如 oracle.net.ns.NSProtocol、oracle.jdbc.driver.T4CConnection),默认会被 GraalVM 移除。
必须在 src/main/resources/META-INF/native-image/.../reflect-config.json 中显式注册:
[{
"name": "oracle.jdbc.driver.T4CConnection",
"allDeclaredConstructors": true,
"allPublicMethods": true
}, {
"name": "oracle.net.ns.NSProtocol",
"allDeclaredConstructors": true
}]
同时确保 tnsnames.ora、sqlnet.ora 等 Wallet 文件被包含进 native image —— 在 native-image 命令中加参数:
--resource-config-file=src/main/resources/META-INF/native-image/resource-config.json
否则运行时报错: ORA-12154: TNS:could not resolve the connect identifier specified,本质是找不到 tnsnames.ora。











