ant-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Iwan" <j...@i-ware.net>
Subject RE: Starting jboss with Ant (again !!! - and still no luck :( )
Date Sat, 02 Aug 2003 11:37:41 GMT
This works perfectly for me on Windows...

Here's how I did it using the spawn-task that was posted recently. Below you
also find a post of Tim Gordon, who recently posted a spawn-task on this
mailinglist.

    <!--
####################################################################-->
    <!-- ############################ JBoss tasks
###########################-->
    <!--
####################################################################-->

    <!-- ===================================================================
-->
    <!-- Starts JBoss running the server ${jboss.host}
-->
    <!--
-->
    <!-- Specify the property jboss.new.process as 'start' and jboss will
-->
    <!-- start in a new window.
-->
    <!-- ===================================================================
-->
    <target name="start.jboss" depends="check_jboss_running"
unless="jboss_already_running">
        <echo>+-----------------------------+</echo>
        <echo>|                             |</echo>
        <echo>| S T A R T I N G   J B O S S |</echo>
        <echo>|                             |</echo>
        <echo>+-----------------------------+</echo>
        <echo></echo>
        <echo>This will take some time, possibly up to a minute.</echo>
        <echo></echo>

	  <!-- startJBoss.bat is some batch file that looks like "%1 %2 %3
%4 %5", that's it. -->
	  <!-- The first param is to either start Jboss' run.bat directly or
thru the start   -->
	  <!-- command from Windows, this is handled by the property
jboss.new.process	  -->
        <spawn dir="${basedir}" executable="startJBoss.bat">
            <arg line="${jboss.new.process} ${jboss.root.dir}/bin/run.bat -c
${jboss.server}"/>
        </spawn>

	  <!-- This property is used in the stop.jboss target to identify
whether jboss was   -->
	  <!-- started using this build script or not. You might not want to
stop jboss when  -->
	  <!-- it wasn't started from the build script.
-->
        <property name="started_by_ant" value="true"/>
        <waitfor maxwait="60" maxwaitunit="second">
            <and>
                <socket server="${jboss.host}" port="${jboss.port}"/>
                <http
url="http://${jboss.host}:${jboss.port}/jmx-console/index.jsp"/>
            </and>
        </waitfor>
        <echo>+-----------------------------+</echo>
        <echo>| J B O S S   S T A R T E D   |</echo>
        <echo>+-----------------------------+</echo>
    </target>
    
    <target name="check_jboss_running">
        <condition property="jboss_already_running" value="true">
            <and>
                <socket server="${jboss.host}" port="${jboss.port}"/>
                <http
url="http://${jboss.host}:${jboss.port}/jmx-console/index.jsp"/>
            </and>
        </condition>
        <echo>JBoss is already running on ${jboss.host}:${jboss.port} -
[${jboss_already_running}]</echo>
    </target>
    
    <!-- ===================================================================
-->
    <!-- Stops JBoss running on the server ${jboss.host}
-->
    <!-- ===================================================================
-->
    <target name="stop.jboss" if="started_by_ant">
        <echo>+-----------------------------+</echo>
        <echo>|                             |</echo>
        <echo>| S T O P P I N G   J B O S S |</echo>
        <echo>|                             |</echo>
        <echo>+-----------------------------+</echo>
        <echo></echo>
        <spawn dir="${jboss.root.dir}\bin"
executable="${jboss.root.dir}\bin\shutdown.bat">
            <arg line="${jboss.host} ${jboss.port}"/>
        </spawn>
        <echo>+-----------------------------+</echo>
        <echo>| J B O S S   S T O P P E D   |</echo>
        <echo>+-----------------------------+</echo>
    </target>

    <target name="fail.and.stop.jboss" if="jboss.timeout">
        <echo>+--------------------------+</echo>
        <echo>| J B O S S   F A I L E D  |</echo>
        <echo>+--------------------------+</echo>
        <antcall target="stop.jboss"/>
        <fail message="JBoss is not running correctly, possibly due to a
deployment error" if="jboss.timeout"/>
    </target>

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= TIM's POST START
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Lots of people seem to ask how to spawn a process that will live beyond ANT.
There are other ways, but this works for me... Don't rely on any console
I/O, though - it's not piped in and whatever's piped out will cease to do so
once the ANT JVM exits. Generally intended for things that write logs, have
gui's, start their own shells, etc.

Ruthlessly hacked from ExecTask, so it's a bit untidy. Works, though.

eg:

  <taskdef name="spawn" classname="tools.ant.Spawn"/>

  <target name="startRmiRegistry">
    <spawn executable="rmiregistry">
      <arg value="${rmi.registry.port}"/>
    </spawn>
  </target>

Usual path considerations apply.

----------------------
import java.io.File;
import java.io.FileOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.StringReader;

import org.apache.tools.ant.Task;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.util.StringUtils;
import org.apache.tools.ant.taskdefs.Execute;
import org.apache.tools.ant.taskdefs.LogStreamHandler;
import org.apache.tools.ant.types.Environment;
import org.apache.tools.ant.types.Commandline;

/**
 * Spawns an asynchronous process from ANT
 *
 * @author Tim Gordon
 */
public class Spawn extends Task
{
  private String os;
  private File out;
  private File dir;
  protected boolean newEnvironment = false;
  private Environment env = new Environment();
  protected Commandline cmdl = new Commandline();
  private FileOutputStream fos = null;
  private ByteArrayOutputStream baos = null;
  private String outputprop;
  private boolean failIfExecFails = true;
  private boolean append = false;

  /**
   * Controls whether the VM (1.3 and above) is used to execute the
   * command
   */
  private boolean vmLauncher = true;

  /**
   * The command to execute.
   */
  public void setExecutable(String value)
  {
    cmdl.setExecutable(value);
  }

  /**
   * The working directory of the process.
   */
  public void setDir(File d)
  {
    this.dir = d;
  }

  /**
   * List of operating systems on which the command may be executed.
   */
  public void setOs(String os)
  {
    this.os = os;
  }

  /**
   * @ant.attribute ignore="true"
   */
  public void setCommand(Commandline cmdl)
  {
    log("The command attribute is deprecated. " +
        "Please use the executable attribute and nested arg elements.",
        Project.MSG_WARN);
    this.cmdl = cmdl;
  }

  /**
   * File the output of the process is redirected to.
   */
  public void setOutput(File out)
  {
    this.out = out;
  }

  /**
   * Property name whose value should be set to the output of
   * the process.
   */
  public void setOutputproperty(String outputprop)
  {
    this.outputprop = outputprop;
  }

  /**
   * Do not propagate old environment when new environment variables are
specified.
   */
  public void setNewenvironment(boolean newenv)
  {
    newEnvironment = newenv;
  }

  /**
   * Add an environment variable to the launched process.
   */
  public void addEnv(Environment.Variable var)
  {
    env.addVariable(var);
  }

  /**
   * Adds a command-line argument.
   */
  public Commandline.Argument createArg()
  {
    return cmdl.createArgument();
  }

  /**
   * Stop the build if program cannot be started. Defaults to true.
   *
   * @since Ant 1.5
   */
  public void setFailIfExecutionFails(boolean flag)
  {
    failIfExecFails = flag;
  }

  /**
   * Whether output should be appended to or overwrite an existing file.
   * Defaults to false.
   *
   * @since 1.30, Ant 1.5
   */
  public void setAppend(boolean append)
  {
    this.append = append;
  }

  /**
   * Do the work.
   */
  public void execute() throws BuildException
  {
    File savedDir = dir; // possibly altered in prepareExec
    checkConfiguration();
    if (isValidOs())
    {
      try
      {
        runExec(prepareExec());
      }
      finally
      {
        dir = savedDir;
      }
    }
  }

  /**
   * Has the user set all necessary attributes?
   */
  protected void checkConfiguration() throws BuildException
  {
    if (cmdl.getExecutable() == null)
    {
      throw new BuildException("no executable specified", location);
    }
    if (dir != null && !dir.exists())
    {
      throw new BuildException("The directory you specified does not "
                               + "exist");
    }
    if (dir != null && !dir.isDirectory())
    {
      throw new BuildException("The directory you specified is not a "
                               + "directory");
    }
  }

  /**
   * Is this the OS the user wanted?
   */
  protected boolean isValidOs()
  {
    // test if os match
    String myos = System.getProperty("os.name");
    log("Current OS is " + myos, Project.MSG_VERBOSE);
    if ((os != null) && (os.indexOf(myos) < 0))
    {
      // this command will be executed only on the specified OS
      log("This OS, " + myos
          + " was not found in the specified list of valid OSes: " + os,
          Project.MSG_VERBOSE);
      return false;
    }
    return true;
  }

  /**
   * If true, launch new process with VM, otherwise use the OS's shell.
   */
  public void setVMLauncher(boolean vmLauncher)
  {
    this.vmLauncher = vmLauncher;
  }

  /**
   * Create an Execute instance with the correct working directory set.
   */
  protected Execute prepareExec() throws BuildException
  {
    // default directory to the project's base directory
    if (dir == null)
    {
      dir = project.getBaseDir();
    }
    Execute exe = new Execute(
      new LogStreamHandler(this, Project.MSG_INFO, Project.MSG_WARN)
      {
        public void stop()
        {
          // Just let the daemon threads handle output for the lifetime of
this ANT invocation...
        }
      }
    )
    {
      protected void waitFor(Process process)
      {
        // Don't want to wait for a detached process...
      }
    };

    exe.setAntRun(getProject());
    exe.setWorkingDirectory(dir);
    exe.setVMLauncher(vmLauncher);
    String[] environment = env.getVariables();
    if (environment != null)
    {
      for (int i = 0; i < environment.length; i++)
      {
        log("Setting environment variable: " + environment[i],
            Project.MSG_VERBOSE);
      }
    }
    exe.setNewenvironment(newEnvironment);
    exe.setEnvironment(environment);
    return exe;
  }

  /**
   * A Utility method for this classes and subclasses to run an
   * Execute instance (an external command).
   */
  protected final void runExecute(Execute exe) throws IOException
  {
    exe.execute();

    if (baos != null)
    {
      BufferedReader in =
        new BufferedReader(new StringReader(Execute.toString(baos)));
      String line = null;
      StringBuffer val = new StringBuffer();
      while ((line = in.readLine()) != null)
      {
        if (val.length() != 0)
        {
          val.append(StringUtils.LINE_SEP);
        }
        val.append(line);
      }
      project.setNewProperty(outputprop, val.toString());
    }
  }

  /**
   * Run the command using the given Execute instance. This may be
   * overidden by subclasses
   */
  protected void runExec(Execute exe) throws BuildException
  {
    // show the command
    log(cmdl.describeCommand(), Project.MSG_VERBOSE);

    exe.setCommandline(cmdl.getCommandline());
    try
    {
      runExecute(exe);
    }
    catch (IOException e)
    {
      if (failIfExecFails)
      {
        throw new BuildException("Execute failed: " + e.toString(), e,
                                 location);
      }
      else
      {
        log("Execute failed: " + e.toString(), Project.MSG_ERR);
      }
    }
    finally
    {
      // close the output file if required
      logFlush();
    }
  }

  /**
   * Flush the output stream - if there is one.
   */
  protected void logFlush()
  {
    try
    {
      if (fos != null)
      {
        fos.close();
      }
      if (baos != null)
      {
        baos.close();
      }
    }
    catch (IOException io)
    {
    }
  }
}
-----------------

Tim Gordon

Allustra Limited
1 Royal Exchange Avenue
London
EC3V 3LT
Tel 020 7464 4190
Tel 020 7464 4194
http://www.allustra.com/

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= TIM's POST END
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Iwan


> -----Original Message-----
> From: Antoine Levy-Lambert [mailto:antoine@antbuild.com] 
> Sent: Friday, August 01, 2003 9:09 AM
> To: Ant Users List
> Subject: Re: Starting jboss with Ant (again !!! - and still 
> no luck :( )
> 
> 
> Also, I think you need a /C flag or something like that with 
> cmd to start an application server.
> 
> so you would have
> 
> <exec executable="cmd.exe">
>      <arg value="/C"/>
>      <arg value="${path_to_jboss_bin}/start.bat"/>
> </exec>
> 
> (check the exact flag for cmd.exe, have a look at cmd /? ) 
> Cheers, Antoine
> ----- Original Message -----
> From: "Antoine Levy-Lambert" <antoine@antbuild.com>
> To: "Ant Users List" <user@ant.apache.org>
> Sent: Friday, August 01, 2003 8:58 AM
> Subject: Re: Starting jboss with Ant (again !!! - and still 
> no luck :( )
> 
> 
> > Hi Giles,
> >
> > the executable should be "cmd.exe", not "${bin}run.bat"
> >
> > the same on SunOS, the executable should be "sh" or "ksh", 
> but not the
> name
> > of the script
> >
> > other point : there is a spawn attribute for the exec task in 
> > ant1.6alpha, you can try it.
> >
> > Cheers,
> >
> > Antoine
> > ----- Original Message -----
> > From: "Parnell, Giles (AU - Sydney)" <g.parnell@eclipsegroup.com.au>
> > To: <user@ant.apache.org>
> > Sent: Friday, August 01, 2003 6:33 AM
> > Subject: Starting jboss with Ant (again !!! - and still no luck :( )
> >
> >
> > > Sorry guys
> > >
> > > I know this topic has been fired around quite a bit lately. I've
> followed
> > > all the responses but still to be doing something wrong.
> > >
> > > I've compiled the Spawn class (many thanks to T Gordon) into it's 
> > > own
> jar,
> > > and included it in the ant lib dir.
> > >
> > > I've included the taskdef in my build script, and it 
> appears to work
> fine
> > > (my build script acknowledges the new task)
> > >
> > > However when I run the portion of xml to start jboss, I get the
> following
> > > error:
> > >
> > > [spawn] BUILD FAILED: 
> > > file:Z:/workspace/MinterEllison/src/build.xml:149:
> > > Execute failed: java.io.IOException: CreateProcess:
> > > 
> c:APPSERVERS\jboss-3.0.7_jakarta-tomcat-4.1.24\bin\run.bat -c 
> connectis
> > > error=3
> > >           [if] Error in class net.sf.antcontrib.logic.IfTask
> > >
> > > I know it's got nothing to do with the 'if task' (part of 
> > > ant-contrib),
> > and
> > > take it that the error=3 is the thing that's causing the problem
> > >
> > > Heres my target... any ideas ?
> > >
> > > <!-- Doesn't work under Windows at the moment -->
> > > <target name="startjboss">
> > > <if>
> > > <equals arg1="${os.name}" arg2="SunOS" />
> > > <then>
> > >    <echo message="Sun OS" />
> > >    <exec dir="${bin}" executable="${bin}/run.sh">
> > > <arg line="-c ${projectName}"/>
> > > </exec>
> > > </then>
> > > <else>
> > >    <echo message="Windows OS" />
> > >    <spawn dir="${bin}" executable="${bin}run.bat">
> > > <arg line="-c ${projectName}"/>
> > > </spawn>
> > > </else>
> > > </if>
> > >
> > > </target>
> > >
> > > bin is decalred as so above...
> > > <property name="bin" 
> > > value="${appserverroot}/jboss-3.0.7_jakarta-tomcat-4.1.24/bin/"/>
> > >
> > >
> > > Thanks in advance
> > > Giles
> > >
> > > "...the opportunities that are proffered by corporate 
> websites, web 
> > > advertising and email are too great to ignore", according to the
> > Australian
> > > Financial Review's 2003 Marketing Survey.
> > >
> > > Eclipse can help you use new media to engage your 
> customers. To find 
> > > out how, please contact Jamie Verco on 9322 5181 or 0408 202 203.
> > >
> > >
> > > Giles Parnell |    ECLIPSEGROUP   |   02 9322 5124   |   
> Mobile 0403
> > 768656
> > >
> > > Level 9, 190 George Street, Sydney, NSW 2000, Fax: 02 9322 5121
> > >
> > > > The Eclipse Group is a wholly owned subsidiary of 
> Deloitte Touche
> > Tohmatsu
> > > >
> > > www.eclipsegroup.com.au
> > >
> > > This email and any files transmitted with it are confidential and
> intended
> > > solely
> > > for the use of the individual or entity to whom they are 
> addressed. 
> > > If you are not the intended recipient of this email, you must not 
> > > disseminate, copy or otherwise use this information. If you have 
> > > received this email
> in
> > > error,
> > > please notify Eclipse Group immediately.
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > > ***********Confidentiality/Limited Liability 
> > > Statement***************
> > >
> > > This message contains privileged and confidential information 
> > > intended only for the use of the addressee named above.  
> If you are 
> > > not the intended recipient of this message, you must not 
> > > disseminate, copy or take any action in reliance on it.  
> If you have 
> > > received this message in error, please notify Deloitte Touche 
> > > Tohmatsu immediately.  Any views expressed in this 
> message are those 
> > > of the individual sender, except where the sender specifically 
> > > states them to be the views of Deloitte.
> > >
> > > The liability of Deloitte Touche Tohmatsu, is limited by, 
> and to the 
> > > extent of, the Accountants' Scheme under the Professional 
> Standards 
> > > Act 1994 (NSW).
> > >
> > > The sender cannot guarantee that this email or any 
> attachment to it 
> > > is free of computer viruses or other conditions which may 
> damage or 
> > > interfere with data, hardware or software with which it might be 
> > > used. It is sent on the strict condition that the user 
> carries out 
> > > and relies on its own procedures for ensuring that its 
> use will not 
> > > interfere with the recipients systems and the recipient 
> assumes all 
> > > risk of use and absolves the sender of all responsibility for any 
> > > consequence of its
> use.
> > >
> > >
> >
> >
> >
> > 
> ---------------------------------------------------------------------
> > To unsubscribe, e-mail: user-unsubscribe@ant.apache.org
> > For additional commands, e-mail: user-help@ant.apache.org
> >
> >
> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@ant.apache.org
> For additional commands, e-mail: user-help@ant.apache.org
> 



---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@ant.apache.org
For additional commands, e-mail: user-help@ant.apache.org


Mime
View raw message