首页 > 解决方案 > 通过 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 的执行。我想这样做是因为

是我正在使用的文件。取自https://gitlab.com/pdftk-java/pdftk/tree/master

标签: rrjava

解决方案


执行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文件(调用mainMain-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'))


推荐阅读