使用r2pmml将XGBoost模型从R转PMML时遇Java可执行文件错误
问题描述
我正尝试将R中的XGBoost模型导出为PMML格式,该模型将集成到基于Java的电子病历(EMR)系统中,但始终收到以下错误:
Error in .convert(tempfile, file, converter, converter_classpath, verbose): Java is not installed, or the Java executable is not on system path (error code 127)
我使用Windows 10 64位系统,已尝试以下操作:
- 安装jdk-21和jre-1.8并添加到环境变量路径
- 安装Java后安装rJava
- 从源码安装r2pmml以获取最新版本,并将R更新至最新版本
- 在R中设置JAVA_HOME指向jre-1.8
即使运行r2pmml官方示例代码,仍会出现相同错误,示例代码如下:
library("xgboost") library("r2pmml") data(iris) iris_X = iris[, -ncol(iris)] iris_y = iris[, ncol(iris)] # Convert from factor to integer[0, num_class] iris_y = (as.integer(iris_y) - 1) iris.matrix = model.matrix(~ . - 1, data = iris_X) iris.DMatrix = xgb.DMatrix(iris.matrix, label = iris_y) iris.fmap = as.fmap(iris.matrix) iris.xgboost = xgboost(data = iris.DMatrix, objective = "multi:softprob", num_class = 3, nrounds = 11) iris.xgboost = decorate(iris.xgboost, iris.fmap, response_name = "Species", response_levels = c("setosa", "versicolor", "virginica")) pmmlFile = file.path(tempdir(), "Iris-XGBoost.pmml") r2pmml(iris.xgboost, pmmlFile, compact = FALSE) compactPmmlFile = file.path(tempdir(), "Iris-XGBoost-compact.pmml") r2pmml(iris.xgboost, compactPmmlFile, compact = TRUE)
解决方案
1. 统一Java版本,消除多版本冲突
同时安装JDK 21和JRE 1.8会导致路径优先级冲突,r2pmml对Java 8(JDK 8/JRE 1.8)的兼容性最佳。建议:
- 卸载JDK 21,仅保留JRE 1.8或完整的JDK 8
- 确保系统中没有其他Java版本残留
2. 正确配置系统环境变量
- 打开「此电脑」→「属性」→「高级系统设置」→「环境变量」
- 在系统变量区域新建
JAVA_HOME,值为JRE 1.8的安装根路径(例如C:\Program Files\Java\jre1.8.0_391) - 在系统变量的
Path中添加%JAVA_HOME%\bin,并将该条目拖动到Path列表的最顶端,确保优先调用该版本的Java
- 在系统变量区域新建
- 配置完成后,打开新的命令提示符窗口,输入
java -version,确认输出为Java 1.8.x版本
3. 重新安装并配置rJava
- 先卸载现有rJava包:
remove.packages("rJava") - 以管理员身份启动R或RStudio,执行以下命令重新安装rJava:
install.packages("rJava", type = "binary") - 验证rJava加载:运行
library(rJava),无报错则配置成功
4. 重新测试r2pmml导出
关闭当前R/RStudio会话,重新打开后运行示例代码,检查是否能成功生成PMML文件
内容的提问来源于stack exchange,提问作者anubhuti mishra
相关产品推荐
相关产品推荐

