3

我创建了一个 bat 文件来调用 java 类。现在我已经在 swing 中创建了一个 GUI。在那个摇摆中,我有一个按钮作为开始,为此我有动作监听器,我在其中创建了以下代码

public void actionPerformed(java.awt.event.ActionEvent evt)
{
    try 
    {

        File file = new File("F:/myprog/start.bat");

        Desktop.getDesktop().open(file);

    } catch (IOException e)

    {

        e.printStackTrace();

    }

    jButton1ActionPerformed(evt);

}

当我运行单击按钮时,我得到“ Error: Could not find or load main class

批处理文件:

javac *.java
java websphinx.workbench.Workbench
 pause

当我单击 bat 文件时,应用程序正在运行。但是当我调用这个 bat 文件时,从 Java 程序中我得到了错误。什么地方出了错?

4

5 回答 5

2

intself 中的批处理文件不是可执行文件,通常在其解释器中运行,因此您需要使用 cmd.exe 启动它

尝试以下

ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", "F:\\myprog\\start.bat");
Process p = pb.start();

对此的替代方法是:

Runtime.getRuntime().exec("cmd /c start F:/myprog/start.bat");

不过,Processbuilder 是首选的替代方案。它使您可以更好地控制外部进程,因为您可以指示您的程序等待批处理文件完成其执行或与其并发运行。

于 2012-11-23T10:01:22.833 回答
2

在 Java 中,通常在 Runtime.getRuntime().exec 时运行命令,您需要将 cmd.exe 作为要运行的文件传递,然后将批处理名称作为参数传递。

try {
     Process p = Runtime.getRuntime().exec(
                    new String[]{"cmd.exe", "/c", "F:/myprog/start.bat"});
     InputStream in = p.getInputStream();
     OutputStream out = p.outputStream();
} catch (IOException e){
     e.printStackTrace();
}
于 2012-11-23T10:03:50.250 回答
1

试试这个

Runtime.getRuntime().exec("cmd /c start F:/myprog/start.bat");
于 2012-11-23T09:55:54.623 回答
1

我认为这不是批处理文件问题,

看着Error: Could not find or load main class

它看起来像一个类路径问题

您可能需要改进批处理文件

javac *.java
java -cp yourdrive:\path\to\class websphinx.workbench.Workbench
 pause

-cp变量。

当您按原样执行批处理文件以及从程序中给出异常时,可能是因为范围的变化。你的java类和你的批处理文件可能不在同一个位置。

于 2012-11-23T09:56:22.160 回答
0

您使用以下Runtime#exec方法:

Runtime.getRuntime().exec(new String[] { "cmd.exe", "/c", "F:\\myprog\\start.bat" });

请注意,您真正运行的程序是cmd.exe,带有/c开关,后跟批处理文件名和 Windows 格式的路径。

于 2012-11-23T09:55:22.207 回答