gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:41:56 25 4
gpt4 key购买 nike

我正在 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() 并完美运行吗?

这是调用Rserve()的java类

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 类:

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() 的不同答案,但它对我不起作用)?每次,我都必须重新启动计算机以关闭现有连接并启动新连接来测试上述代码。

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

最佳答案

您的 invoke() 方法在 Rserve 实际启动之前返回,因此您显然太早尝试连接。您可能需要添加p.waitFor();。另请参阅 StartRserve 类,它在从 Java 启动 Rserve 方面要强大得多。

PS:我建议使用stats-rosuda-devel mailing list对于 Rserve 问题,您可以更快地得到答复。

关于java - 运行 Java 应用程序的第一个实例中的 Rserve() 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36744080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com