class Buildr::Jetty

Provides a collection of tasks and methods for using Jetty, specifically as a server for testing your application.

Build files should always start Jetty by invoking the use task, typically as a prerequisite. This task will start Jetty once during the build, and shut it down when the build completes.

If you want to keep Jetty running across builds, and look at error messages, you can start Jetty in a separate console with:

buildr jetty:start

To stop this instance of Jetty, simply kill the process (Ctrl-C) or run:

buildr jetty:stop

If you start Jetty separately from the build, the use task will connect to that existing server. Since you are using Jetty across several builds, you will want to cleanup any mess created by each build. You can use the setup and teardown tasks, which are called when Jetty is first used in the build, and when the build ends.

Constants

REQUIRES

Libraries used by Jetty.

SLF4J_VERSION
URL

Default URL for Jetty (change with options.jetty.url).

VERSION

Which version of Jetty we're using by default (change with options.jetty.version).

Attributes

url[RW]

The URL for the Jetty server. Leave as is if you want to use the default server (localhost:8080).

Public Class Methods

instance() → Jetty click to toggle source

Returns an instance of Jetty.

# File addon/buildr/jetty.rb, line 71
def instance()
  @instance ||= Jetty.new("jetty", URL)
end

Public Instance Methods

deploy(url, webapp) → path click to toggle source

Deploy a WAR in the specified URL.

# File addon/buildr/jetty.rb, line 151
def deploy(url, webapp)
  use.invoke
  uri = URI.parse(url)
  Net::HTTP.start(uri.host, uri.port) do |http|
    response = http.request_post("/buildr/deploy", "webapp=#{webapp}&path=#{uri.path}")
    if Net::HTTPOK === response && response.body =~ /Deployed/
      path = response.body.split[1]
      puts "Deployed #{webapp}, context path #{uri.path}" if trace?
      path
    else
      fail "Deployment failed: #{response}"
    end
  end
end
running?() → boolean click to toggle source

Returns true if it finds a running Jetty server that supports the Buildr requests for deploying, stopping, etc.

# File addon/buildr/jetty.rb, line 135
def running?()
  uri = URI.parse(url)
  begin
    Net::HTTP.start(uri.host, uri.port) do |http|
      response = http.request_get("/buildr/")
      response.is_a?(Net::HTTPSuccess) && response.body =~ /Alive/
    end
  rescue Errno::ECONNREFUSED, Errno::EBADF
    false
  end
end
setup(*prereqs) → task click to toggle source
setup(*prereqs) { |task| .. } → task

This task executes when Jetty is first used in the build. You can use it to deploy artifacts into Jetty.

# File addon/buildr/jetty.rb, line 189
def setup(*prereqs, &block)
  @setup.enhance prereqs, &block
end
start(pipe?) click to toggle source

Starts Jetty. This method does not return, it keeps the thread running until Jetty is stopped. If you want to run Jetty parallel with other tasks in the build, invoke the use task instead.

# File addon/buildr/jetty.rb, line 96
def start(sync = nil)
  begin
    puts "classpath #{Java.classpath.inspect}"
    port = URI.parse(url).port
    puts "Starting Jetty at http://localhost:#{port}" if verbose
    Java.load
    jetty = Java.org.apache.buildr.JettyWrapper.new(port)
    sync << "Started" if sync
    sleep # Forever
  rescue Interrupt # Stopped from console
  rescue Exception=>error
    puts "#{error.class}: #{error.message}"
  end
  exit! # No at_exit
end
stop() click to toggle source

Stops Jetty. Stops a server running in a separate process.

# File addon/buildr/jetty.rb, line 116
def stop()
  uri = URI.parse(url)
  begin
    Net::HTTP.start(uri.host, uri.port) do |http|
      http.request_post "/buildr/stop", ""
    end
  rescue Errno::ECONNREFUSED
    # Expected if Jetty server not running.
  rescue EOFError
    # We get EOFError because Jetty is brutally killed.
  end
  puts "Jetty server stopped"
end
teardown(*prereqs) → task click to toggle source
teardown(*prereqs) { |task| .. } → task

This task executes when the build is done. You can use it to undeploy artifacts previously deployed into Jetty.

# File addon/buildr/jetty.rb, line 199
def teardown(*prereqs, &block)
  @teardown.enhance prereqs, &block
end
undeploy(url) → boolean click to toggle source

Undeploys a WAR from the specified URL.

# File addon/buildr/jetty.rb, line 170
def undeploy(url)
  use.invoke
  uri = URI.parse(url)
  Net::HTTP.start(uri.host, uri.port) do |http|
    response = http.request_post("/buildr/undeploy", "path=#{uri.path}")
    if Net::HTTPOK === response && response.body =~ /Undeployed/
      true
    else
      fail "Deployment failed: #{response}"
    end
  end
end
use(*prereqs) → task click to toggle source
use(*prereqs) { |task| .. } → task

If you intend to use Jetty, invoke this task. It will start a new instance of Jetty and close it when the build is done. However, if you already have a server running in the background (e.g. jetty:start), it will use that server and will not close it down.

# File addon/buildr/jetty.rb, line 211
def use(*prereqs, &block)
  @use.enhance prereqs, &block
end

Protected Instance Methods

fire() click to toggle source

If you want to start Jetty inside the build, call this method instead of start. It will spawn a separate process that will run Jetty, and will stop Jetty when the build ends. However, if you already started Jetty from the console (with take jetty:start), it will use the existing instance without shutting it down.

# File addon/buildr/jetty.rb, line 221
def fire()
  unless running?
    sync = Queue.new
    Thread.new { start sync }
    # Wait for Jetty to fire up before doing anything else.
    sync.pop == "Started" or fail "Jetty not started"
    puts "Jetty started" if verbose
    at_exit { stop }
  end
  @setup.invoke
  at_exit { @teardown.invoke }
end