【问题标题】:Spawn a multi-threaded Java program from a Windows command line program, spawner won't end until spawnee ends. How can I prevent the hang?从 Windows 命令行程序生成多线程 Java 程序,直到 spawnee 结束,spawner 才会结束。如何防止挂起?
【发布时间】:2010-05-17 16:16:32
【问题描述】:

短版:

如何防止 Windows 中生成的 Java 进程阻止生成进程结束?

长版:

我正在尝试从从 Windows 命令行启动的程序(NAnt 的 任务,同样,这并不重要)生成一个多线程 Java 程序(Selenium RC,不重要)。我正在使用 Windows“启动”命令执行此操作,生成的进程已启动并正确运行。生成过程接收控制权并完成(NAnt 说“BUILD SUCCEEDED”),但实际上并没有退出到命令行。当生成的进程最终终止时(可能是几个小时后),命令进程返回并出现命令行提示符。

例如:

<target name="start_rc">
    <exec program="cmd" failonerror="false" workingdir="${ross.p5.dir}\Tools\selenium\selenium-server-1.0.1" verbose="true">
        <arg value="/C"/>
        <arg value="start"/>
        <arg value="java"/>
        <arg value="-jar"/>
        <arg path="${ross.p5.dir}\Tools\selenium\selenium-server-1.0.1\selenium-server.jar"/>
        <arg value="-userExtensions"/>
        <arg path="${ross.p5.dir}\Tools\selenium\selenium-server-1.0.1\user-extensions.js"/>
        <arg value="-browserSideLog"/>
        <arg value="-log"/>
        <arg value="${ross.p5.dir}\artifacts\selenium.log"/>
        <arg value="-debug"/>
    </exec>
</target>

生产:

C:\Ross>nant start_rc
NAnt 0.86 (Build 0.86.2898.0; beta1; 12/8/2007)
Copyright (C) 2001-2007 Gerry Shaw
http://nant.sourceforge.net

Buildfile: file:///C:/Ross/ross.build
Target framework: Microsoft .NET Framework 3.5
Target(s) specified: start_rc


start_rc:

     [exec] Starting 'cmd (/C start java -jar C:\p5\Tools\selenium\selenium-server-1.0.1\selenium-server.jar -userExtensions C:\p5\Tools\selenium\selenium-server-1.0.1\user-extensions.js -browserSideLog -log C:\p5\artifacts\selenium.log -debug)' in 'C:\p5\Tools\selenium\selenium-server-1.0.1'

BUILD SUCCEEDED

Total time: 4.1 seconds.

...然后什么都没有,直到我关闭运行 Java 的窗口,然后...

C:\Ross>

显然有些东西阻止了 nant 进程终止,但 Windows START 命令不应该阻止它吗?

【问题讨论】:

    标签: java windows command-line selenium nant


    【解决方案1】:

    您的 exec 任务存在问题,因为 spawn 默认为 false。来自NAnt documentation

    获取或设置一个值,该值指示是否应生成应用程序。如果你生成一个应用程序,它的输出不会被 NAnt 记录。默认值为 false

    Ant documentation 中(记住,NAnt 是“Not Ant”,但还是……),有一个具体的例子,说明了exec 任务的spawn 参数的使用:

    <property name="browser" location="C:/Program Files/Internet Explorer/iexplore.exe"/>
    <property name="file" location="ant/docs/manual/index.html"/>
    
    <exec executable="${browser}" spawn="true">
        <arg value="${file}"/>
    </exec>
    

    当该浏览器任务触发时,Internet Explorer 将打开该页面,但构建将继续进行,无需等待输出或任务完成。

    【讨论】:

    • 谢谢,这正是我需要的答案。我使用的是 nant,而不是 ant,但它具有相同的选项。我仍然认为有些事情已经被打破了,因为 START 不应该让 thangs 悬而未决,但我不会与成功争论!现在要是 nant doc 和 ant doc 一样清晰就好了!
    • @Ross,对,我忘了。现实情况是,任务几乎相同。但是,为了适应主题,我将编辑我的答案以指向 NANT 网站而不是 ANT。
    【解决方案2】:

    我不能 100% 确定这就是你所追求的,但我认为你想要的是 javaw 而不是 java。

    取自 Sun JDK 6 文档:

    javaw 命令与 java 相同,只是 javaw 没有关联的控制台窗口。当您不希望出现命令提示符窗口时,请使用 javaw。但是,如果由于某种原因启动失败,javaw 启动器将显示一个包含错误信息的对话框。

    【讨论】:

      猜你喜欢
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      • 2019-08-22
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多