View Javadoc

1   //========================================================================
2   //$Id: Jetty6RunMojo.java 2299 2008-01-03 23:40:50Z janb $
3   //Copyright 2000-2004 Mort Bay Consulting Pty. Ltd.
4   //------------------------------------------------------------------------
5   //Licensed under the Apache License, Version 2.0 (the "License");
6   //you may not use this file except in compliance with the License.
7   //You may obtain a copy of the License at 
8   //http://www.apache.org/licenses/LICENSE-2.0
9   //Unless required by applicable law or agreed to in writing, software
10  //distributed under the License is distributed on an "AS IS" BASIS,
11  //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  //See the License for the specific language governing permissions and
13  //limitations under the License.
14  //========================================================================
15  
16  package org.mortbay.jetty.plugin;
17  
18  import java.io.File;
19  
20  import org.apache.maven.plugin.MojoExecutionException;
21  import org.apache.maven.plugin.MojoFailureException;
22  import org.mortbay.jetty.Connector;
23  import org.mortbay.jetty.Handler;
24  import org.mortbay.jetty.RequestLog;
25  import org.mortbay.jetty.Server;
26  import org.mortbay.jetty.handler.ContextHandler;
27  import org.mortbay.jetty.handler.ContextHandlerCollection;
28  import org.mortbay.jetty.handler.HandlerCollection;
29  import org.mortbay.jetty.plugin.util.JettyPluginServer;
30  import org.mortbay.jetty.security.UserRealm;
31  import org.mortbay.xml.XmlConfiguration;
32  
33  /**
34   *  <p>
35   *  This goal is used in-situ on a Maven project without first requiring that the project 
36   *  is assembled into a war, saving time during the development cycle.
37   *  The plugin forks a parallel lifecycle to ensure that the "compile" phase has been completed before invoking Jetty. This means
38   *  that you do not need to explicity execute a "mvn compile" first. It also means that a "mvn clean jetty:run" will ensure that
39   *  a full fresh compile is done before invoking Jetty.
40   *  </p>
41   *  <p>
42   *  Once invoked, the plugin can be configured to run continuously, scanning for changes in the project and automatically performing a 
43   *  hot redeploy when necessary. This allows the developer to concentrate on coding changes to the project using their IDE of choice and have those changes
44   *  immediately and transparently reflected in the running web container, eliminating development time that is wasted on rebuilding, reassembling and redeploying.
45   *  </p>
46   *  <p>
47   *  You may also specify the location of a jetty.xml file whose contents will be applied before any plugin configuration.
48   *  This can be used, for example, to deploy a static webapp that is not part of your maven build. 
49   *  </p>
50   *  <p>
51   *  There is a <a href="run-mojo.html">reference guide</a> to the configuration parameters for this plugin, and more detailed information
52   *  with examples in the <a href="http://docs.codehaus.org/display/JETTY/Maven+Jetty+Plugin">Configuration Guide</a>.
53   *  </p>
54   * @author janb
55   * 
56   * @goal run
57   * @requiresDependencyResolution runtime
58   * @execute phase="test-compile"
59   * @description Runs jetty6 directly from a maven project
60   */
61  public class Jetty6RunMojo extends AbstractJettyRunMojo
62  {
63  
64      
65      /**
66       * List of connectors to use. If none are configured
67       * then the default is a single SelectChannelConnector at port 8080. You can
68       * override this default port number by using the system property jetty.port
69       * on the command line, eg:  mvn -Djetty.port=9999 jetty:run
70       * 
71       * @parameter 
72       */
73      private Connector[] connectors;
74      
75      
76      /**
77       * List of other contexts to set up. Optional.
78       * @parameter
79       */
80      private ContextHandler[] contextHandlers;
81      
82      
83      /**
84       * List of security realms to set up. Optional.
85       * @parameter
86       */
87      private UserRealm[] userRealms;
88      
89  
90  
91      /**
92       * A RequestLog implementation to use for the webapp at runtime.
93       * Optional.
94       * @parameter
95       */
96      private RequestLog requestLog;
97      
98      
99      public Object getConfiguredRequestLog()
100     {
101         return this.requestLog;
102     }
103 
104     
105    
106     /**
107      * 
108      * 
109      * @see org.mortbay.jetty.plugin.AbstractJettyRunMojo#getConfiguredConnectors()
110      */
111     public Object[] getConfiguredConnectors()
112     {
113         return this.connectors;
114     }
115 
116     
117 
118     /**
119      * 
120      * 
121      * @see org.mortbay.jetty.plugin.AbstractJettyRunMojo#getConfiguredUserRealms()
122      */
123     public Object[] getConfiguredUserRealms()
124     {
125         return this.userRealms;
126     }
127 
128     
129     
130     /**
131      * @return Returns the contextHandlers.
132      */
133     public ContextHandler[] getConfiguredContextHandlers()
134     {
135         return this.contextHandlers;
136     }
137 
138     
139     /**
140      *
141      * 
142      * @see org.mortbay.jetty.plugin.AbstractJettyRunMojo#createServer()
143      */
144     public JettyPluginServer createServer()
145     {
146         return new Jetty6PluginServer();
147     }
148     
149     
150     public void finishConfigurationBeforeStart() throws Exception
151     {
152         Handler[] handlers = getConfiguredContextHandlers();
153         JettyPluginServer plugin=getServer();
154         Server server=(Server)plugin.getProxiedObject();
155         
156         HandlerCollection contexts = (HandlerCollection)server.getChildHandlerByClass(ContextHandlerCollection.class);
157         if (contexts==null)
158             contexts = (HandlerCollection)server.getChildHandlerByClass(HandlerCollection.class);
159         
160         for (int i=0; (handlers != null) && (i < handlers.length); i++)
161         {
162             contexts.addHandler(handlers[i]);
163         }
164     }
165 
166    
167  
168     
169     public void applyJettyXml() throws Exception
170     {
171         if (getJettyXmlFile() == null)
172             return;
173         
174         getLog().info( "Configuring Jetty from xml configuration file = " + getJettyXmlFile() );        
175         XmlConfiguration xmlConfiguration = new XmlConfiguration(getJettyXmlFile().toURL());
176         xmlConfiguration.configure(getServer().getProxiedObject());   
177     }
178 
179 
180     
181     
182     public void execute() throws MojoExecutionException, MojoFailureException
183     {
184         super.execute();
185     }
186 }