Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在windows中从java自动启动rserve_Java_R_Eclipse_Rserve - Fatal编程技术网

如何在windows中从java自动启动rserve

如何在windows中从java自动启动rserve,java,r,eclipse,rserve,Java,R,Eclipse,Rserve,我已经在eclipse中创建了一个java应用程序。应用程序使用Rserve包连接到R并运行R脚本。在运行我的应用程序之前,我必须从Rstudio中启动rserve,如下所示: library(Rserve) Rserve() 这段Java代码将被捆绑为可执行文件,因此有没有一种方法可以在代码运行时(在windows中)自动调用Rserve(),这样我就可以跳过通过RStudio启动Rserve的手动步骤?我不确定是否有更干净的方法来实现这一点,但我解决这个问题的方法是从java程序中启动控制

我已经在eclipse中创建了一个java应用程序。应用程序使用Rserve包连接到R并运行R脚本。在运行我的应用程序之前,我必须从Rstudio中启动rserve,如下所示:

library(Rserve)
Rserve()

这段Java代码将被捆绑为可执行文件,因此有没有一种方法可以在代码运行时(在windows中)自动调用Rserve(),这样我就可以跳过通过RStudio启动Rserve的手动步骤?

我不确定是否有更干净的方法来实现这一点,但我解决这个问题的方法是从java程序中启动控制台样式。要使其工作,您必须将R可执行文件的路径放在系统路径中:

public Process rserve = null;

public static void startRServer() throws InterruptedException, IOException {
    // check the runtime environment to see if there's an active Rserve running
    String existingRserve = "";
    try {
        Process p = Runtime.getRuntime().exec("tasklist /FI \"IMAGENAME eq Rserve.exe\"");
        p.waitFor();
        BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
        existingRserve = in.readLine();
    } catch(IOException e){}

    if(rserve == null || existingRserve.contains("No tasks are running")) {
        // start and rserve if we don't have one for this run yet, 
        // or if it has unexpectedly failed since we last used it
        try {
            rserve = Runtime.getRuntime().exec("Rscript -e \"library(Rserve); Rserve()\"");
            rserve.waitFor();
        } catch (IOException e) {
            System.out.print("*** R Error: Unable to start the R server ***");
        }
    }
}

我不确定是否有更干净的方法可以做到这一点,但我解决这一问题的方法是从java程序中启动控制台样式。要使其工作,您必须将R可执行文件的路径放在系统路径中:

public Process rserve = null;

public static void startRServer() throws InterruptedException, IOException {
    // check the runtime environment to see if there's an active Rserve running
    String existingRserve = "";
    try {
        Process p = Runtime.getRuntime().exec("tasklist /FI \"IMAGENAME eq Rserve.exe\"");
        p.waitFor();
        BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
        existingRserve = in.readLine();
    } catch(IOException e){}

    if(rserve == null || existingRserve.contains("No tasks are running")) {
        // start and rserve if we don't have one for this run yet, 
        // or if it has unexpectedly failed since we last used it
        try {
            rserve = Runtime.getRuntime().exec("Rscript -e \"library(Rserve); Rserve()\"");
            rserve.waitFor();
        } catch (IOException e) {
            System.out.print("*** R Error: Unable to start the R server ***");
        }
    }
}
该项目正好为您实现了这一点

尽管看一看可能会很有趣: 因为它集成了rsesession,并出于性能原因保留了一个Rserve连接池,而您无需为此做太多工作。您还可以切换到其他运行时解决方案,如JRI、RCaller、Renjin,而无需更改脚本代码。

该项目正好为您实现了这一点

尽管看一看可能会很有趣:
因为它集成了rsesession,并出于性能原因保留了一个Rserve连接池,而您无需为此做太多工作。您还可以切换到其他运行时解决方案,如JRI、RCaller、Renjin,而无需更改脚本代码。

假设我在系统路径中给出R可执行文件的路径。现在,如果我在另一台计算机上使用我的项目,我需要重置路径吗?我在问,我希望部署我的应用程序,对此我感到困惑。不幸的是,对于这种方法,R可执行文件文件夹的路径需要放在运行此程序的每台计算机的系统环境变量中。我不确定是否有一种方法可以在Java程序中实现这一点(我的猜测是否定的,因为这将是一个巨大的安全漏洞……但这是可能的),假设我在我的系统路径中给出R可执行文件的路径。现在,如果我在另一台计算机上使用我的项目,我需要重置路径吗?我在问,我希望部署我的应用程序,对此我感到困惑。不幸的是,对于这种方法,R可执行文件文件夹的路径需要放在运行此程序的每台计算机的系统环境变量中。我不确定是否有一种方法可以在Java程序中实现这一点(我的猜测是否定的,因为这将是一个巨大的安全漏洞…但这是可能的)要使用JRI,我们必须设置不同DLL目录和jar文件的路径。我担心的是,如果我在另一台计算机上使用我的项目,我会再次重置所有路径吗?如果我部署我的应用程序,路径将如何设置?通常情况下,您会将Rscript可执行文件的文件夹放入应用程序的路径中,但当您查看rsession时,您会看到它还会尝试从注册表读取R安装文件夹,并尝试一些常见路径来查找可执行文件。虽然改进库并允许添加可配置的搜索路径并不困难,因此您可以通过主应用程序的启动参数(或者更理想地说是系统属性)对其进行配置。啊,我注意到您询问了JRI(上面的评论是关于会话),您还可以通过将lib添加到java.library.path或我提供的系统属性来确保找到lib(如果您使用invesdwin上下文项目提供的AMain类,则可以在启动期间通过命令行参数“-Dproperty.name=value”覆盖它们),尽管本地库的问题总是一样的。这就是为什么我添加了对RCaller、Rserve、Renjin的支持,作为JRIYou的替代品。您可以在此处阅读更多关于invesdwin context提供的系统属性机制的信息:您还可以完全禁用平台初始化以推出您自己的解决方案。R模块也可以在不初始化spring上下文的情况下工作感谢您提供的所有信息。我将检查它使用JRI,我们必须设置不同的DLL目录和jar文件的路径。我担心的是,如果我在另一台计算机上使用我的项目,我会再次重置所有路径吗?如果我部署我的应用程序,路径将如何设置?通常情况下,您会将Rscript可执行文件的文件夹放入应用程序的路径中,但当您查看rsession时,您会看到它还会尝试从注册表读取R安装文件夹,并尝试一些常见路径来查找可执行文件。虽然改进库并允许添加可配置的搜索路径并不困难,因此您可以通过主应用程序的启动参数(或者更理想地说是系统属性)对其进行配置。啊,我注意到您询问了JRI(上面的评论是关于会话),您还可以通过将lib添加到java.library.path或我提供的系统属性来确保找到lib(如果您使用invesdwin上下文项目提供的AMain类,则可以在启动期间通过命令行参数“-Dproperty.name=value”覆盖它们),尽管本地库的问题总是一样的。这就是为什么我添加了对RCaller、Rserve、Renjin的支持,作为JRIYou的替代品。您可以在此处阅读更多关于invesdwin context提供的系统属性机制的信息:您还可以完全禁用平台初始化以推出您自己的解决方案。R模块也可以在不初始化spring上下文的情况下工作感谢您提供的所有信息。我去看看