运行 Java 应用程序的第一个实例中的 Rserve() 错误

Rserve() error in the first instance of running a Java application

我正在用 IntelliJ IDE 编写 Java 应用程序。该应用程序使用 Rserve() 连接到 R 并访问脚本。我有一个 java 脚本,它向 shell 发送命令以启动 Rserve()。我现在面临的问题是第一次 运行 应用程序时,出现以下错误:

Exception in thread "main" java.lang.NoSuchMethodError: org.rosuda.REngine.REngineException.<init>(Lorg/rosuda/REngine/REngine;Ljava/lang/String;Ljava/lang/Throwable;)V
    at org.rosuda.REngine.Rserve.RserveException.<init>(RserveException.java:59)
    at org.rosuda.REngine.Rserve.RConnection.<init>(RConnection.java:90)
    at org.rosuda.REngine.Rserve.RConnection.<init>(RConnection.java:60)
    at org.rosuda.REngine.Rserve.RConnection.<init>(RConnection.java:44)
    at de.uni_jena.bioinformatik.RecalibrationGUI.Application.main(Application.java:40)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

并且,当我下次 运行 该应用程序时,它可以完美运行。据我所知,在第一个 运行 中,它只是建立了 Rserve() 连接,然后在第二个 运行 中它起作用了。有人可以帮我解决这个问题,以便应用程序首先连接到 Rserve() 并且完美地连接到 运行s 吗?

这是调用 Rserve()

的 java class
public class InvokeRserve {
    public static boolean invoke() {
        try {
            Process p = Runtime.getRuntime().exec("R CMD Rserve --vanilla");

            BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));

            BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
        }
        catch (IOException e) {
            System.out.println("Rserve connection: Exception occurred: ");
            e.printStackTrace();
            System.exit(-1);
        }
        return true;
    }
}

并且,这是启动应用程序并调用 invoke() 方法的主要 java class:

public class Application {
    /**
     * Main method for the Swing application
     *
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
            boolean value = InvokeRserve.invoke();
        RConnection check = new RConnection();
        if(check.isConnected())
        {
            // Run the GUI construction in the Event-Dispatching thread for thread-safety
            SwingUtilities.invokeLater(new Runnable() {

                /**
                 * run method which create a new GUIMain object
                 */
                @Override
                public void run() {new GUIMain("Java Application"); // Let the constructor do the job
                }
            });
       }
        else
        System.out.println("There was no R connection found.");
    }
}

此外,有没有办法停止现有的 Rserve() 连接(我阅读了不同的答案,建议使用 shutdown(),但它对我不起作用)?每次,我都必须重新启动计算机以关闭现有连接并启动新连接来测试上面的代码。

我还查看了 http://www.rforge.net/DATRAS/files/org/rosuda/Mondrian/StartRserve.java 中的 StartRserve.java 示例文件。但是当我在我的应用程序的主要 class 中使用方法 StartRserve.checkLocalRserve() 时,我得到与上面显示的相同的 Rserve() 错误。

您的 invoke() 方法 returns 在 Rserve 实际启动之前,因此您显然尝试过早连接。您可能想要添加 p.waitFor();。另请参阅 StartRserve class,它在从 Java.

启动 Rserve 时更加稳健

PS:我建议使用 stats-rosuda-devel mailing list 来回答 Rserve 问题,这样可以更快地回复您。

我有一个在不关闭计算机的情况下关闭 Rserve 连接的解决方案。在打开 Rconnection 时试试这个:

    RConnection rconn=null;
    try{
        rconn=new RConnection();
        //Your personal code here

    } catch(Exception exc){
        exc.printStackTrace(out);
    } finally{
        if (rconn!=null){
            rconn.close();
        }
    }

这样当应用异常中途停止时,它仍然运行finally部分并关闭连接。 希望这能及时提供帮助。

关于异常部分的详细信息,如果能在代码旁边显示行号就可以回答,因为异常日志是按行号引用代码的。