通过 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 的执行。我想这样做是因为
- 我想在从 JAVA_HOME
中找到 java 命令时避免任何可能的系统相关问题
- 我已经启动了一个 rJava 会话来获取 JAVA_HOME。我不妨使用它,因为
.jinit
isn't undoable
- 我不太熟悉通过 -jar 调用 jar 的作用,我很好奇。它可以以独立于 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')
- 运行 class 如下方式:http://www.owsiak.org/running-java-code-in-r/
更新
运行 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'))
我有一个 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 的执行。我想这样做是因为
- 我想在从 JAVA_HOME 中找到 java 命令时避免任何可能的系统相关问题
- 我已经启动了一个 rJava 会话来获取 JAVA_HOME。我不妨使用它,因为
.jinit
isn't undoable - 我不太熟悉通过 -jar 调用 jar 的作用,我很好奇。它可以以独立于 jar 的方式完成吗?如果不是,我应该在代码中查找什么才能知道如何执行此操作。
This is the file in I am working with. Taken from https://gitlab.com/pdftk-java/pdftk/tree/master
执行 JAR
文件(本质上)是嵌入在 JAR
.
您可以执行以下操作,而不是调用系统并将其作为外部应用程序执行:
- 确保将您的
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')
- 运行 class 如下方式:http://www.owsiak.org/running-java-code-in-r/
更新
运行 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'))