通过 rJava 复制 java -jar 执行

Replicating a java -jar execution through rJava

我有一个 java 文件,我通常会执行

java -jar jarname.jar arguments

我希望能够以与系统无关的方式从 R 中 运行 这个文件。我当前的管道部分依赖于 rJava do identify JAVA_HOME and 运行 the jar by doing

# 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 的执行。我想这样做是因为

This is the file in I am working with. Taken from https://gitlab.com/pdftk-java/pdftk/tree/master

执行 JAR 文件(本质上)是嵌入在 JAR.

中的 运行ning class 文件

您可以执行以下操作,而不是调用系统并将其作为外部应用程序执行:

  • 确保将您的 JAR 文件添加到 CLASSPATH
rJava::.jaddClassPath(pathToJar)
  • 检查 JAR 文件中的主要内容 class。查看 META-INF/MANIFEST.MF 文件以确定主要 class。 (在这种情况下 com.gitlab.pdftk_java.pdftk
  • 在 R.
  • 中实例化 class
newObj = rJava::.jnew('com/gitlab/pdftk_java/pdftk')

更新

运行 JAR 文件(调用 Main-class 的 main 方法)与调用 Java 内的任何其他方法是一样的 class。请注意 main 方法将字符串数组作为参数。在这里查看示例:http://www.owsiak.org/running-jar-file-from-r-using-rjava-without-spawning-new-process/

newObj$main(rJava::.jarray('--version'))

对于这种特定情况,如果您查看此 class 的源代码,您会发现它终止了会话

  public static void main(String[] args) {
    System.exit(main_noexit(args));
  }

这也将终止您的 R 会话。由于所有 main 函数都是调用 main_noexit 然后退出,因此您可以将上面代码中的 main 替换为 main_noexit

newObj$main_noexit(rJava::.jarray('--version'))