我正在尝试使用rJava包从R运行可运行的JAR文件。这个jar必须在外部文件夹中读写一些文件,这些文件与jar文件本身的路径相同,如下所示:

mypath/myjar.jar
mypath/folder1
mypath/folder2
mypath/input_file1.txt
mypath/input_file2.txt


如果我通过在“ mypath”中打开控制台并通过以下方式运行jar来调用该程序,则该程序可以正常工作:

java -jar myjar.jar input_file1.txt input_file2.txt false


但是,当我尝试使用rJava在R中运行此代码时,代码会崩溃,因为即使正确地将工作目录定义为“ mypath”,也找不到mypath / folder1和mypath / folder2。

jinit(".",force.init=TRUE) # this starts the JVM
.jaddClassPath("myjar.jar")
jobject <- .jnew("package_name/Main")  ## call the constructor

result_java <- rJava::.jcall(obj = jobject, returnSig = "V", method = "main", c("input_file1.txt","input_file2.txt","false"))


实际上,调用了Java程序,它实际上能够找到同样位于mypath中的输入文件,但是由于某种原因,当它尝试写入mypath中的文件夹(例如folder1和folder2)时,由于以下原因而崩溃:

Error executing task java.nio.file.NoSuchFileException: folder1/some_file.txt


我真的不知道发生了什么,花了几个小时。我在这里真的缺少明显的东西吗?

最佳答案

使用Java运行代码时,您在mypath内部,并且folder1folder2位置对代码可见。

也许,您应该传递(作为参数)目录的位置,而不是访问Java代码中的folder1,而应访问显式路径。

result_java <-
   rJava::.jcall(
     obj = jobject,
     returnSig = "V",
     method = "main",
       c(
         "input_file1.txt",
         "input_file2.txt",
         "false",
         "full_path_to_your_mypath_location"))


然后,在main内,您只需打开full_path_to_your_mypath_location/some_file.txt。当您启动R时,您可能不再在代码内。您也可以尝试更改目录

setwd(full_path_to_your_mypath_location)

10-07 15:58