You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++调用Java JNI:如何为Java 9 JVM设置模块路径?

在C++中为Java 9+ JVM指定模块路径

这确实是Java模块化系统(JPMS)引入后常见的迁移问题!Java 9及以后版本新增了模块路径的概念,我们可以通过--module-path(简写-p)选项来指定模块的查找路径,同时结合--add-modules声明需要加载的模块(尤其是自定义模块或非默认导出的JDK模块)。

具体代码示例

对比你原来的Java 8代码,调整后的Java 9+版本代码如下:

// 创建JVM选项数组:包含模块路径和要添加的模块
JavaVMOption* options = new JavaVMOption[2];
// 指定模块路径,多个路径用分号(Windows)/冒号(Linux/macOS)分隔
options[0].optionString = (char *)"--module-path=./my-modules;./third-party-modules";
// 显式添加需要使用的模块,多个模块用逗号分隔
options[1].optionString = (char *)"--add-modules=com.my.custom.module,java.sql";

JavaVMInitArgs vm_args;
vm_args.version = JNI_VERSION_9; // 对应Java 9的JNI版本,可根据实际JDK版本调整(如JNI_VERSION_17)
vm_args.nOptions = 2;
vm_args.options = options;
vm_args.ignoreUnrecognized = false;

关键选项说明

  • --module-path(或-p):作用类似传统的类路径,但专门用于模块化代码,用来指定存放模块化JAR包或模块目录的路径。路径分隔规则和java.class.path一致(Windows用;,Unix/Linux/macOS用:)。
  • --add-modules:如果你的代码依赖的模块不是JVM默认加载的(比如自定义模块、或者像java.sql这类非基础模块),需要通过这个选项显式声明要加载的模块,多个模块用逗号分隔。
  • 保留类路径:如果项目同时存在模块化和非模块化代码,可以继续保留-Djava.class.path选项,把它加入到options数组中即可,JVM会同时处理模块路径和类路径。

注意事项

  • 务必将vm_args.version设置为对应Java版本的JNI常量,比如Java 11用JNI_VERSION_11,确保JVM初始化时匹配正确的版本。
  • 路径要根据实际项目结构调整,避免出现找不到模块的问题。

内容的提问来源于stack exchange,提问作者Vitaliy Tsirkunov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:44:55