2010-05-17 13 views
1

Version courte:Générer un programme Java multithread à partir d'un programme de ligne de commande Windows, spawner ne se termine pas avant la fin de spawnee. Comment puis-je empêcher le blocage?

Comment puis-je empêcher un processus Java donné naissance dans Windows de bloquer le processus de reproduction de fin?

Version longue:

Je suis en train de lancer un programme Java multi-thread (Selenium RC, pas qu'il devrait la matière) d'un programme lancé depuis la ligne de commande Windows (< de NAnt exec > tâche, encore une fois, pas que cela devrait avoir de l'importance). Je le fais en utilisant la commande "start" de Windows, et le processus engendré est démarré et fonctionne correctement. Le processus de génération reçoit le contrôle et se termine (NAnt dit "BUILD SUCCEEDED"), mais ne sort pas réellement de la ligne de commande. Lorsque le processus engendré se termine finalement (pourrait être des heures plus tard), le processus de commande retourne et l'invite de ligne de commande se produit.

Par exemple:

<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> 

Produit:

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. 

... et puis plus rien jusqu'à ce que je ferme la fenêtre où Java est en cours d'exécution, puis ...

C:\Ross> 

Évidemment quelque chose empêche le processus nant de se terminer, mais la commande Windows START ne devrait-elle pas empêcher cela?

Répondre

2

Vous avez un problème avec votre tâche exec dans cette spawn est en défaut à false. De l'NAnt documentation:

Obtient ou définit une valeur indiquant si la demande doit être donné naissance. Si vous générez une application, sa sortie ne sera pas enregistrée par NAnt. La valeur par défaut est false.

Dans le Ant documentation (rappelez-vous, NAnt est "Non Ant", mais quand même ...), il est un exemple concret de l'utilisation du paramètre d'apparition de la tâche exec:

<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> 

Lorsque cette tâche de navigateur se déclenche, Internet Explorer s'ouvre sur cette page, mais la génération continue sans attendre la fin de la sortie ou de la tâche.

+0

Merci, c'était exactement la réponse dont j'avais besoin. J'utilise nant, pas fourmi, mais il a la même option.Je pense toujours que quelque chose est cassé plus bas, puisque START ne devrait pas quitter thangs danglin ', mais je ne vais pas argumenter avec succès! Maintenant, si seulement le doc nant était aussi clair que le doc de la fourmi! –

+0

@Ross, à droite, j'ai oublié. La réalité est que les tâches sont à peu près les mêmes. Cependant, juste pour correspondre au sujet, je vais éditer ma réponse pour pointer sur le site Web de NANT au lieu de ANT. –

0

Je ne suis pas sûr à 100% que c'est ce que vous recherchez, mais je pense que ce que vous voulez, c'est javaw au lieu de java.

Pris du Sun JDK 6 Documentation:

La commande javaw est identique à Java, sauf que avec javaw il n'y a pas de fenêtre de la console associée. Utilisez javaw lorsque vous ne voulez pas qu'une fenêtre d'invite de commande apparaisse. Le lanceur javaw affichera cependant une boîte de dialogue avec des informations d'erreur si un lancement échoue pour une raison quelconque.