我正在尝试将服务器作为Ant工件的一部分启动。
以下是相关部分:
<exec dir="." executable="cmd.exe" spawn="true">
<arg line="/c c:\Java\james-2.3.2\bin\debug.bat" />
</exec>
如果我从命令行使用ant
启动它,则会生成一个进程并且我得到一个命令提示符,一切似乎都很好。但是,如果我从IntelliJ 6(我的IDE)启动它,那么构建将保持活动状态,直到我终止服务器。
这是IntelliJ用来启动蚂蚁的行:
C:\Java\jdk1.6.0_02\bin\java -Xmx128m -Dant.home=C:\Java\apache-ant-1.7.1 -Dfile.encoding=UTF-8 -classpath "C:\Java\apache-ant-1.7.1\lib\ant-antlr.jar;C:\Java\apache-ant-1.7.1\lib\ant-apache-bcel.jar;C:\Java\apache-ant-1.7.1\lib\ant-apache-bsf.jar;C:\Java\apache-ant-1.7.1\lib\ant-apache-log4j.jar;C:\Java\apache-ant-1.7.1\lib\ant-apache-oro.jar;C:\Java\apache-ant-1.7.1\lib\ant-apache-regexp.jar;C:\Java\apache-ant-1.7.1\lib\ant-apache-resolver.jar;C:\Java\apache-ant-1.7.1\lib\ant-commons-logging.jar;C:\Java\apache-ant-1.7.1\lib\ant-commons-net.jar;C:\Java\apache-ant-1.7.1\lib\ant-jai.jar;C:\Java\apache-ant-1.7.1\lib\ant-javamail.jar;C:\Java\apache-ant-1.7.1\lib\ant-jdepend.jar;C:\Java\apache-ant-1.7.1\lib\ant-jmf.jar;C:\Java\apache-ant-1.7.1\lib\ant-jsch.jar;C:\Java\apache-ant-1.7.1\lib\ant-junit.jar;C:\Java\apache-ant-1.7.1\lib\ant-launcher.jar;C:\Java\apache-ant-1.7.1\lib\ant-netrexx.jar;C:\Java\apache-ant-1.7.1\lib\ant-nodeps.jar;C:\Java\apache-ant-1.7.1\lib\ant-starteam.jar;C:\Java\apache-ant-1.7.1\lib\ant-stylebook.jar;C:\Java\apache-ant-1.7.1\lib\ant-swing.jar;C:\Java\apache-ant-1.7.1\lib\ant-testutil.jar;C:\Java\apache-ant-1.7.1\lib\ant-trax.jar;C:\Java\apache-ant-1.7.1\lib\ant-weblogic.jar;C:\Java\apache-ant-1.7.1\lib\ant.jar;C:\Java\apache-ant-1.7.1\lib\xercesImpl.jar;C:\Java\apache-ant-1.7.1\lib\xml-apis.jar;C:\Java\jdk1.6.0_02\lib\tools.jar;C:\Program Files\JetBrains\IntelliJ IDEA 6.0\lib\idea_rt.jar" com.intellij.rt.ant.execution.AntMain2 -logger com.intellij.rt.ant.execution.IdeaAntLogger2 -inputhandler com.intellij.rt.ant.execution.IdeaInputHandler -buildfile C:\Java\Projects\CcMailer\ccmailer.xml jar
我怀疑inputhandler
参数与问题有关,但如果我自己运行该问题则不会再现。无论哪种方式,我对IntelliJ的作用只有有限的控制。
我的问题是:IntelliJ如何知道进程正在运行? Ant过程早已不复存在。有没有办法以更偷偷摸摸的方式启动子流程,以便IntelliJ甚至不知道有什么可以等待的?
以下是我到目前为止所尝试的内容:我尝试使用start
命令,如下所示:
<exec dir="." executable="cmd.exe" spawn="true">
<arg line="/c start cmd /c c:\Java\james-2.3.2\bin\debug.bat" />
</exec>
我也尝试过使用python,代码如下:
import os.path
import subprocess
subprocess.Popen(["cmd.exe", "/c", "debug.bat"], stdin=open(os.path.devnull), stdout=open(os.path.devnull, "w"), stderr=subprocess.STDOUT)
无济于事。构建窗口始终保持不变,直到我终止服务器。
有什么想法吗?
答案 0 :(得分:0)
我已经放弃了解决这个问题,所以我设置了一个执行启动和停止的XML RPC服务器,启动/关闭脚本进行XML RPC调用。
服务器代码(简化):
from __future__ import with_statement
from threading import Lock
from SimpleXMLRPCServer import SimpleXMLRPCServer
server = SimpleXMLRPCServer(("localhost", 8000), allow_none=True)
server.register_introspection_functions()
class JamesController(object):
def __init__(self):
self.lock = Lock()
self.started = False
def start(self):
# starting code using subprocess
def stop(self):
# stopping code
server.register_instance(JamesController())
server.serve_forever()
然后启动/停止脚本变为:
import xmlrpclib
s = xmlrpclib.Server('http://localhost:8000')
s.start()
它很笨重,需要拨打time.sleep()
个电话,但它可以完成工作。