2010-03-08 56 views
0

我試圖啓動一個服務器作爲螞蟻神器的一部分。爲什麼我的衍生過程仍然導致IntelliJ等待?

下面是相關線路:

<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

我已經放棄瞭解決這個問題,所以我建立了一個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()電話灑,但它得到工作完成。

相關問題