Shiny应用本地正常,部署至shinyapps.io遇.jcheck Java异常错误
问题
本地开发的Shiny应用运行正常,但部署到shinyapps.io平台时出现错误:Error in .jcheck: Java Exception <no description because toString() failed>。该应用通过RJDBC连接数据库获取数据,本地R环境的sessionInfo()信息如下,且rJava::.jinit()返回值为0:
> sessionInfo() R version 4.2.2 (2022-10-31 ucrt) Platform: x86_64-w64-mingw32/x64 (64-bit) Running under: Windows 10 x64 (build 19045) Matrix products: default locale: [1] LC_COLLATE=English_United States.utf8 LC_CTYPE=English_United States.utf8 [3] LC_MONETARY=English_United States.utf8 LC_NUMERIC=C [5] LC_TIME=English_United States.utf8 attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] rsconnect_0.8.29 DT_0.26 plotly_4.10.1 ggplot2_3.4.0 [5] gridExtra_2.3 RJDBC_0.2-10 rJava_1.0-6 DBI_1.1.3 [9] openxlsx_4.2.5.1 purrr_1.0.0 lubridate_1.9.0 timechange_0.1.1 [13] tidyr_1.2.1 dplyr_1.0.10 shiny_1.7.4 loaded via a namespace (and not attached): [1] Rcpp_1.0.9 assertthat_0.2.1 digest_0.6.31 packrat_0.9.0 [5] utf8_1.2.2 mime_0.12 R6_2.5.1 httr_1.4.4 [9] pillar_1.8.1 rlang_1.0.6 lazyeval_0.2.2 curl_4.3.3 [13] fontawesome_0.4.0 rstudioapi_0.14 data.table_1.14.6 jquerylib_0.1.4 [17] htmlwidgets_1.6.0 munsell_0.5.0 compiler_4.2.2 httpuv_1.6.7 [21] pkgconfig_2.0.3 askpass_1.1 htmltools_0.5.4 openssl_2.0.5 [25] tidyselect_1.2.0 tibble_3.1.8 fansi_1.0.3 viridisLite_0.4.1 [29] withr_2.5.0 later_1.3.0 grid_4.2.2 jsonlite_1.8.4 [33] xtable_1.8-4 gtable_0.3.1 lifecycle_1.0.3 magrittr_2.0.3 [37] scales_1.2.1 zip_2.2.2 cli_3.5.0 stringi_1.7.8 [41] cachem_1.0.6 promises_1.2.0.1 bslib_0.4.2 ellipsis_0.3.2 [45] generics_0.1.3 vctrs_0.5.1 tools_4.2.2 glue_1.6.2 [49] crosstalk_1.2.0 fastmap_1.1.0 yaml_2.3.6 colorspace_2.0-3 [53] memoise_2.0.1 sass_0.4.4
解决方案
针对本地正常但部署到shinyapps.io出现Java异常的问题,可从以下几个方向排查解决:
Java环境与驱动兼容性问题
shinyapps.io运行在Linux环境,本地是Windows,两者Java版本、架构(32/64位)可能存在差异,导致JDBC驱动无法正常加载。- 解决:在应用开头添加Java参数配置,比如
options(java.parameters = "-Xmx1024m");确保使用跨平台的JDBC驱动jar包,且驱动版本与服务器Java环境兼容。
- 解决:在应用开头添加Java参数配置,比如
JDBC驱动未随应用部署
本地驱动文件存放在本地路径,部署时未将驱动jar包上传到shinyapps.io服务器,导致RJDBC无法找到驱动类。- 解决:将JDBC驱动jar包放在Shiny应用的根目录下,使用相对路径加载驱动,示例代码:
library(RJDBC) drv <- JDBC(driverClass = "com.mysql.cj.jdbc.Driver", classPath = "./mysql-connector-java-8.0.30.jar")
同时确保
rsconnect部署时包含该jar文件,可通过rsconnect::deployApp()上传整个应用目录。- 解决:将JDBC驱动jar包放在Shiny应用的根目录下,使用相对路径加载驱动,示例代码:
rJava初始化与R版本匹配问题
shinyapps.io上的rJava可能未正确初始化,或服务器R版本与本地不一致(本地为4.2.2),导致Java交互失败。- 解决:在应用启动时显式初始化rJava:
library(rJava); .jinit();通过renv锁定R版本和依赖包版本,或在rsconnect设置中指定R版本为4.2.2。
- 解决:在应用启动时显式初始化rJava:
数据库连接权限与配置问题
数据库服务器可能未开放shinyapps.io的IP段访问权限,或连接字符串中的地址、端口、凭证在部署环境中无效。- 解决:检查数据库防火墙设置,允许shinyapps.io的IP范围访问;避免硬编码敏感信息,使用shinyapps.io的环境变量存储数据库用户名、密码等配置,示例:
db_user <- Sys.getenv("DB_USER") db_pass <- Sys.getenv("DB_PASS") conn <- dbConnect(drv, "jdbc:mysql://your-db-host:3306/db-name", db_user, db_pass)
- 解决:检查数据库防火墙设置,允许shinyapps.io的IP范围访问;避免硬编码敏感信息,使用shinyapps.io的环境变量存储数据库用户名、密码等配置,示例:
内容的提问来源于stack exchange,提问作者Fisseha Berhane
相关产品推荐
相关产品推荐

