r - 通过 rJava 复制 java -jar 执行
问题描述
我有一个我通常会执行的 java 文件
java -jar jarname.jar arguments
我希望能够以尽可能与系统无关的方式从 R 运行此文件。我当前的管道部分依赖于 rJava 确实识别 JAVA_HOME 并通过执行来运行 jar
# path for the example file below
pathToJar = 'pdftk-java.jar'
# start up java session
rJava::.jinit()
# find JAVA_HOME
javaPath = rJava::.jcall( 'java/lang/System', 'S', 'getProperty', 'java.home' )
# get all java files
javaFiles = list.files(javaPath,recursive = TRUE,full.names = TRUE)
# find java command
java = javaFiles[grepl('/java($|\\.exe)',javaFiles)]
# run the jar using system
system(glue::glue('{shQuote(java)} -jar {shQuote(pathToJar)} arguments'))
这确实工作正常,但我想知道是否有一种可靠的方法可以通过 rJava 本身复制 jar 的执行。我想这样做是因为
- 从 JAVA_HOME 查找 java 命令时,我想避免任何可能的系统相关问题
- 我已经开始了一个 rJava 会话,只是为了获取 JAVA_HOME。我不妨使用它,因为它
.jinit
是不可撤销的 - 我不太熟悉通过 -jar 调用 jar 的作用,我很好奇。可以以独立于 jar 的方式完成吗?如果不是,我应该在代码中寻找什么来知道如何做到这一点。
这是我正在使用的文件。取自https://gitlab.com/pdftk-java/pdftk/tree/master
解决方案
执行JAR
文件(本质上)是运行中嵌入的类文件JAR
。
您可以执行以下操作,而不是调用系统并将其作为外部应用程序执行:
- 确保将您的
JAR
文件添加到CLASSPATH
rJava::.jaddClassPath(pathToJar)
- 检查内部
JAR
文件什么是主类。查看META-INF/MANIFEST.MF
文件以识别主类。(在这种情况下com.gitlab.pdftk_java.pdftk
) - 在 R 中实例化类。
newObj = rJava::.jnew('com/gitlab/pdftk_java/pdftk')
更新
运行JAR
文件(调用main
Main-class 的方法)与调用基于 Java 的类中的任何其他方法相同。请注意,该main
方法将字符串数组作为参数。在这里查看示例:http ://www.owsiak.org/running-jar-file-from-r-using-rjava-without-spawning-new-process/
newObj$main(rJava::.jarray('--version'))
对于这种特定情况,如果您查看此类的源代码,您会看到它终止了会话
public static void main(String[] args) {
System.exit(main_noexit(args));
}
这也将终止您的 R 会话。由于所有main
函数都会调用main_noexit
然后退出,因此您可以在上面的代码中main
替换为。main_noexit
newObj$main_noexit(rJava::.jarray('--version'))
推荐阅读
- python - 为什么 MCA 比 PCA 慢这么多?
- css - 添加填充:0 20px;不适用于添加的边框
- apache - 如何将 public_html 下的插件域与主域隔离?
- java - 分页的内容返回空
- android - javax.crypto.BadPaddingException 在 android 中使用密钥库进行解密
- r - 按一天中的小时过滤 R 数据帧
- asp.net - 给定相同的 SECRET 密钥,由 asp.net 服务器生成的 JWT 令牌未被 nodejs 服务器读取
- python - 为什么数组'arr'上的第二个迭代器在Hackerrank编译器中不起作用?
- bash - git - 如何从 git 目录外部获取 $(git_current_branch) 变量
- json - 将 JSON 转换为 XML 的 T-SQL 函数