如何在Windows服务下从java正确运行.bat文件?

时间:2011-02-10 10:48:57

标签: java windows-services batch-file

从我的java项目中我想在​​另一个线程中运行外部.bat文件。为此,我使用以下方法:

    private void posAppRunner(final String path[], final Class targetClass) {
    new Thread(new Runnable() {
        public void run() {
            try {
                String line;
                Process p = Runtime.getRuntime().exec(path);
                BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
                while ((line = input.readLine()) != null) {
                    System.out.println(line);
                }
                input.close();
            } catch (IOException e) {
                LogFactory.getLog(targetClass).warn("Error when starting a PosApplication: " + e.getMessage());
            }
        }

    }).start();

我运行以下.bat文件:

call chdir %~dp0

start java <_some_arguments>

因此,当我从IntelliJ IDEA本地执行此操作时,它正常工作 - 出现一个cmd进程,之后会出现一个java进程,之后cmd进程就会消失。

但是当我在TeamCity windows服务下通过ANT使用此方法运行我的java项目时,只显示cmd进程,之后没有任何反应。不会出现必须从bat文件启动的Java进程。看起来我没有读过程输出,但是我做了!

你可以告诉我,如何克服这种情况?

1 个答案:

答案 0 :(得分:0)

我认为问题出在当前的工作目录中。我对蝙蝠文件不是很熟悉,也不记得%~dp0的意思。无论如何,作为第一次尝试尝试修改您的批处理文件以包含硬编码路径。我相信这会奏效。

在这种情况下,决定什么对你更好:在java代码中发现路径,然后将其传递给批处理文件,动态生成批处理文件,以便它包含硬编码的所有参数或调试脚本。例如,您可以删除start java <_some_arguments>并添加

echo %~dp0 > c:\temp\batlog.log

这会将参数打印到日志文件中。现在将其作为服务运行,并查看日志文件包含的内容。可能你会立即看到问题。